2011-08-25 33 views
1

我有一個產品表 「產品」數據模型,將產品屬性保存在單獨的表中?

產品
- proID(PK)
- proName
- proDescription
- proPrice
- proSize
- proStatus

現在我需要添加兩個額外的屬性(類型和顏色),並在未來更多。在futere我可以得到更多不同的產品,每個產品都有自己的屬性。

這兩個額外屬性僅適用於產品表中某些(一半)產品。

將屬性添加到產品表或創建單獨的表來存儲這些屬性和值會更好嗎?

我可以保存他們喜歡的:

product_properties
- pprID(PK)
- pprName

product_properties_values
- pprID(PK)
- proID(PK)
- ppvValue

回答

1

如果你想有一個normalized模式,你可以有一個產品類型表,列出所有這些特性的產品也可以有。

PRODUCT_TYPE表:

  • TYPE_ID
  • TYPE_NAME
  • type_property_1
  • type_property_2

和產品表:

  • PRODUCT_ID
  • TYPE_ID

具有單獨type表的好處是,它很可能是小的,因此這將是相對容易使像添加在新的性質的改變未來。它也會節省磁盤空間。

沒有單獨的type表的好處是你不必加入兩個表只是爲了列出具有屬性的產品,即查詢性能會更好。

0

這聽起來像是一個EAV模型(Entity-Attribute-Value)。
你可以谷歌瞭解更多關於它的信息。
有些人喜歡EAV,但很多人認爲這是一個糟糕的數據庫設計。

我建議你閱讀此線程有關數據庫設計和EAV:
single fixed table with multiple columns vs flexible abstract tables

+1

我個人認爲只要使用得當,EAV絕對沒有問題。 – Andrey

+0

你會如何使一個EAV屬性「NOT NULL」?或者將一個屬性鏈接到查找表?或者確保沒有應用程序可以在您打算成爲整數的屬性中輸入字符串? –

1

這是一個Entity - Attribute - Value的問題。爲了獲得更好的可伸縮性,您應該爲產品使用一個表,一個用於屬性,一個用於值。正如你寫道:

product_properties

  • pprID(PK)
  • pprName

product_properties_values

  • pprID(PK)
  • proID(PK)
  • ppv值

您可以使用mysql left join語句輕鬆查詢表。例如什麼是產品X屬性?

select ppr.pprName, ppv.ppvValue 
from products as pro 
left join product_properties_values as ppv on pro.proID=ppv.proID 
left join product_properties as ppr on ppr.pprID=ppv.pprID 
where pro.proName='X' order by ppr.pprName desc 
相關問題