我有一个产品表“产品”
产品
- proID(PK)
- proName
- proDescription
- proPrice
- proSize
- proStatus
现在我需要添加两个额外的属性(类型和颜色),以及将来更多。在futere中,我可以获得更多不同的产品,每个产品都有自己的属性。
这两个额外属性仅适用于产品表中的某些(一半)产品。
将属性添加到products表或创建单独的表以存储这些属性和值是否更好?
我可以将它们存储起来:
product_properties
- pprID(PK)
- pprName
product_properties_values
- pprID(PK)
- proID(PK)
- ppvValue
答案 0 :(得分:1)
如果您想拥有normalized架构,可以使用product_type表列出产品可以拥有的所有这些属性。
product_type表:
和产品表:
拥有一个单独的type
表的好处是它可能很小,因此在将来添加新属性等进行更改会相对容易。它还可以节省磁盘空间。
没有单独的type
表的好处是您不必加入两个表只是为了列出具有属性的产品,即查询性能会更好。
答案 1 :(得分:1)
另一种方法是使用TEXT字段,它以xml或json格式存储所有字段。 在我们的项目中,我们使用xml,因为我们需要按属性搜索。您可以使用ExtractValue mysql函数搜索任何属性。
请参阅http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_extractvalue
但如果你不需要搜索json会更快。
答案 2 :(得分:1)
这是一个Entity - Attribute - Value问题。为了获得更好的可伸缩性,您应该为产品使用一个表,一个用于属性,一个用于值。正如你写的那样:
product_properties
product_properties_values
您可以使用mysql左连接语句轻松查询表。例如,什么是产品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
答案 3 :(得分:0)
这听起来像EAV模型(实体 - 属性 - 值)
您可以谷歌获取更多信息。
有些人喜欢EAV,但很多人认为这是一个糟糕的数据库设计。
我建议你阅读关于数据库设计和EAV的这个主题:
single fixed table with multiple columns vs flexible abstract tables