摘要:通常使用逗號(hào)分隔的列表來(lái)避免在多對(duì)多的關(guān)系中創(chuàng)建交叉表,這種設(shè)計(jì)方案定義為一種反模式,暫叫亂穿馬路問(wèn)題這樣的設(shè)計(jì)似乎可行,因?yàn)闆](méi)有創(chuàng)建額外的表或者列,僅僅改變了一個(gè)字段的數(shù)據(jù)類型。以上內(nèi)容是參考反模式于寫下
【個(gè)人博客:http://www.80soho.com/?p=328】場(chǎng)景
功能開發(fā)中肯定遇到過(guò)下列情況:
如下表,最初的設(shè)計(jì)產(chǎn)品(product_id)與聯(lián)系人(account_id)是一對(duì)一關(guān)系,后期產(chǎn)品經(jīng)理過(guò)來(lái)找到你說(shuō),產(chǎn)品可以對(duì)應(yīng)多個(gè)聯(lián)系人(我會(huì)拎磚頭砸過(guò)去,違法勿學(xué)),一個(gè)似乎簡(jiǎn)單且合理的解決方案可以快速解決需求變更:account_id,由int改成使用逗號(hào)分隔的字符串(曾經(jīng)這么干過(guò)的肯定不在少數(shù)...)。
通常使用逗號(hào)分隔的列表來(lái)避免在多對(duì)多的關(guān)系中創(chuàng)建交叉表,這種設(shè)計(jì)方案定義為一種反模式,暫叫亂穿馬路
這樣的設(shè)計(jì)似乎可行,因?yàn)闆](méi)有創(chuàng)建額外的表或者列,僅僅改變了一個(gè)字段的數(shù)據(jù)類型。我們來(lái)看一下這樣的設(shè)計(jì)所必須承受的各方面問(wèn)題:
字段類型長(zhǎng)度不能保證不修改
當(dāng)保存的長(zhǎng)度超出varchar(100)時(shí),肯定會(huì)出問(wèn)題,varchar(100)不得不被修改,下次修改只是時(shí)間問(wèn)題,少不了;
查詢制定聯(lián)系人的產(chǎn)品
查詢不能再使用等號(hào),無(wú)法享受索引帶來(lái)的性能優(yōu)勢(shì),變得異常困難,eg:
查詢制定產(chǎn)品的聯(lián)系人
聯(lián)合兩張表并使用如上的一句表達(dá)式將毀掉任何使用索引的可能,這樣的查詢必須掃描兩張表,創(chuàng)建一個(gè)交叉結(jié)果集,然后使用正則表達(dá)式遍歷每一行聯(lián)合后的數(shù)據(jù)進(jìn)行匹配。
執(zhí)行聚合查詢
聚合查詢使用內(nèi)置的聚合函數(shù),這些函數(shù)是針對(duì)分組行而設(shè)計(jì)的,并不是為了逗號(hào)分隔的列表。下圖方法看上去很高明,單不清晰,且需要很長(zhǎng)的時(shí)間來(lái)開發(fā)和調(diào)試,何況有些聚合查詢根本無(wú)法使用這些技巧來(lái)完成。
更新指定產(chǎn)品的聯(lián)系人繁瑣
無(wú)法驗(yàn)證產(chǎn)品ID
選擇合適的分隔符
列表長(zhǎng)度限制
解決方案創(chuàng)建一張交叉表:將account_id存儲(chǔ)在一張多帶帶的表中,而不是存儲(chǔ)在產(chǎn)品表(jw_products)中,從而每個(gè)獨(dú)立的account值都可以占據(jù)一行,來(lái)實(shí)現(xiàn)產(chǎn)品和聯(lián)系人的多對(duì)多關(guān)系。
以上內(nèi)容是tonglei參考《SQL反模式》于2017-10-10寫下!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/30622.html
摘要:觀察者模式的別名包括發(fā)布訂閱模式模型視圖模式源監(jiān)聽器模式或從屬者模式。而觀察者一般也會(huì)做出對(duì)象的響應(yīng)觀察者模式屬于行為型模式觀察者模式主要解決的問(wèn)題一方的狀態(tài)發(fā)生了變化,依賴于這一方的觀察者立即能收到通知。參考書籍設(shè)計(jì)模式版。 1 紅燈車過(guò),人停;綠燈人過(guò),車停。每天走在馬路上,到處可見紅綠燈指揮著我們什么時(shí)候可以過(guò)馬路,什么時(shí)候不能過(guò)馬路。無(wú)論是人還是車,都時(shí)刻關(guān)注著紅綠燈的狀態(tài),一...
摘要:什么是反模式我很高興地發(fā)現(xiàn)有一個(gè)相當(dāng)全面的關(guān)于反模式的列表,包括來(lái)自編程界及其之外的內(nèi)容。但是要作為一個(gè)反模式,還需要存在替代的解決辦法。 上周我在twitter上討論了ORM,在那以后有人希望我澄清一下。事實(shí)上,我曾經(jīng)寫文章討論過(guò)ORM,?但那是時(shí)的上下文是關(guān)于SQL的,我不應(yīng)該把這將兩件事情混為一談。 showImg(http://segmentfault.com/img/bVb...
閱讀 3466·2021-11-24 10:30
閱讀 3337·2021-11-22 15:29
閱讀 3775·2021-10-28 09:32
閱讀 1402·2021-09-07 10:22
閱讀 3411·2019-08-30 15:55
閱讀 3691·2019-08-30 15:54
閱讀 3569·2019-08-30 15:54
閱讀 2898·2019-08-30 15:44