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