数据模型,在单独的表中保存产品属性?

时间:2011-08-25 13:14:33

标签: mysql database-design entity-attribute-value

我有一个产品表“产品”

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

现在我需要添加两个额外的属性(类型和颜色),以及将来更多。在futere中,我可以获得更多不同的产品,每个产品都有自己的属性。

这两个额外属性仅适用于产品表中的某些(一半)产品。

将属性添加到products表或创建单独的表以存储这些属性和值是否更好?

我可以将它们存储起来:

product_properties
- pprID(PK)
- pprName

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

4 个答案:

答案 0 :(得分:1)

如果您想拥有normalized架构,可以使用product_type表列出产品可以拥有的所有这些属性。

product_type表:

  • TYPE_ID
  • TYPE_NAME
  • type_property_1
  • type_property_2

和产品表:

  • PRODUCT_ID
  • TYPE_ID

拥有一个单独的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

  • pprID(PK)
  • pprName

product_properties_values

  • pprID(PK)
  • proID(PK)
  • ppvValue

您可以使用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