SQL反模式學習筆記7 多態關聯
- 2019 年 10 月 4 日
- 筆記
目標:引用多個父表
反模式:使用多用途外鍵。這種設計也叫做多態關聯,或者雜亂關聯。
多態關聯和EAV有着相似的特徵:元數據對象的名字是存儲在字符串中的。
在多態關聯中,父表的名字是存儲在Issue_Type單獨一列中,有時候這樣的設計被稱作:混合數據與原數據。
查詢示例:
select * from A as a
left join B as b on a.xId=b.Id and a.xType='b'
lefe join C as c on a.xId=c.Id and a.xType='c'
如何識別反模式:當出現以下情況時,可能是反模式
(1)這種標記框架可以讓你將標記(或者其他屬性)和數據庫中的任何其他資源聯繫起來。
就想EAV的設計一樣,應該懷疑任何生成有無線擴展性的設計。
(2)不能在數據庫中國聲明外鍵。
(3)有一列,用來說明這條記錄的其他列是和什麼相關的。
任何外鍵都強制一張表中所有的行引用同一張表。
合理使用反模式:應該盡量避免使用多態關聯,應該使用外鍵約束等來確保引用完整性。
因為:多態關聯通常過度依賴上層程序設計而不是數據庫的元數據。
解決方案:讓關係變得簡單
1、反向引用,多態關聯是一個反向關聯
2、創建交叉表:為每個父表創建一張獨立的交叉表,每張交叉表同時包含一個指向目標表的外鍵和一個指向對應附表的外鍵。
交叉表大多用來存儲多對多關係,如果關係是一對多,那麼可以通過在交叉表上建立UNIQUE約束來保證一對多。
使用交叉表可以保證引用完整性。
