Best-Practices

有多個“類型”表時有哪些設計替代方案

  • April 17, 2012

我正在進行數據庫設計,發現自己有很多 *_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 關於如何創建各種查找表的建議。

引用自:https://dba.stackexchange.com/questions/16591