Best-Practices
有多個“類型”表時有哪些設計替代方案
我正在進行數據庫設計,發現自己有很多 *_type 表(例如 user_type、product_type 等),這些表的結構基本上是相同的:
user_type ( id int pk label char )
我可以通過執行以下操作來簡化這一點:
labels ( id int pk label char context blah )
但這是一種合適的方法嗎?
請不要組合各種
_type
表格。您未來的自己(以及任何最終對錶格編寫查詢的人)會感謝您。
- 如果您合併這些表,您將放棄使用參照完整性約束來確保您的表具有有效數據的能力。不可避免地,有人會無意中在您的查找表中插入未引用有效行的行。然後,當您執行報告時,您會發現您在所有 61 個州都有客戶,其中一些人處於有趣的州,例如“NA”和“X”。
- 如果將這些表組合起來,將來的開發人員編寫查詢會變得更加困難。
我寧願寫類似的東西
SELECT p.product_name, pt.product_type_name, ct.color_name FROM product p JOIN product_type pt ON (p.product_id = pt.product_id) JOIN color_type ct ON (p.color_id = ct.color_id)
比
SELECT p.product_name, pt.label product_type_name, ct.label color_name FROM product p JOIN (SELECT * FROM labels WHERE context = 'PRODUCT_TYPE') pt ON (p.product_id = pt.id) JOIN (SELECT * FROM labels WHERE context = 'COLOR_TYPE') ct ON (p.color_id = ct.id)
- 如果您有單獨的表,優化器更有可能做出正確的決定。您將不可避免地有一些有六行的查找表和其他有數百行的查找表。如果您有單獨的表,那麼優化器相對容易確定哪些查找限制更大,哪些限制更少。如果將所有
_type
表放在一起,數據庫將傾向於使用更少的資訊,因此不太可能選擇最有效的計劃。除此之外,我完全贊同@BillThor 關於如何創建各種查找表的建議。