数据库设计 - 产品属性:什么是更好的产品属性数据库设计选项?

13

我是数据库设计的新手。 对于cms产品属性数据库设计,哪种选项更好?(请提供其他选项)。

选项1:1张表

products{
id
product_name
color
price
attribute_name1
attribute_value1
attribute_name2
attribute_value2
attribute_name3
attribute_value3
}

选项2:3张表

products{
id
product_name
color
price
}

attribute{
id
name
value
}

products_attribute{
products_id
attribute_id
}

属性有多频繁更改?您经常添加/删除新属性吗?如果不是,则使用选项1,其中列的名称为属性名称。如果您的属性是动态的,则使用选项2。当然,对于选项2,性能会受到影响。 - Romain Hippeau
同样,正如Bill所说,查看您之前的答案,并成为一个好公民,接受那些对您有效的答案。(只需要点击鼠标) - Romain Hippeau
我添加了投票功能,谢谢你告诉我。我们的Web应用程序是动态的,这意味着每个用户都可以定义自己的属性。选项2的问题在于它会非常慢,而选项1则可以为我们不知道名称和值由用户定义的产品提供最多10个属性。 - Ben
4个回答

32
您正在进行常见的数据库设计错误,将名称存储在一列中,将值存储在另一列中。这不是关系型数据库设计。
每个属性应该以列名命名。颜色、页数、衬衫尺码、发布日期等应该是列名。
如果每种产品类型都有一个不同的属性集,那么还有其他的解决方案。请参见下面问题的答案:
- 详见:Product table, many kinds of product, each product has many parameters。 - 详见:How do you model custom attributes of entities? - 详见:Design question: Filterable attributes, SQL - 详见:How to design a database schema to support tagging with categories? - 详见:How to define structure in a tag-based organization? 此外,在您实现基于名称-值对的数据库之前,请务必阅读此故事:Bad CaRMa: Introducing Vision

嗨,比尔,我读了你的链接,谢谢。 我有一个问题:为什么你更喜欢使用类表继承而不是单表继承? 请解释一下, 谢谢, 约瑟夫 - Ben
@Yosef:使用类表继承,可以更清晰地将列组合在一起。此外,您可以随时添加一个新的子类型表,具有其自己的一组类型特定的列,而无需修改包含所有子类型通用列的父表。这对于MySQL非常重要,因为“ALTER TABLE”是一项昂贵的操作。 - Bill Karwin

4
我认为最好的产品属性实现方式是:
Product_Tbl [
    ID
    Name
    more columns
]

Attribute_Tbl [
   ID
   Att_Name
]

Product_Attribute_Tbl [
    Product_ID
    Attribute_ID
    Value
]

如果您的产品没有相同的属性,您可以使用这个结构


1

这取决于您从数据库中想要什么。如果您所有的产品都是相同类型并具有相同属性,则只需执行以下操作:

products{id: integer, product_name: string, color: string, attribute_name1: string, attribute_name2: string...}。Attribute_name{}应该是一个有意义的单词,就像“颜色”(也是一个属性)。


不,它们不同,因为我添加了两个字段:1.名称 2.值。 - Ben

0

这是一个旧话题,但思考它的演变方式可能会很有趣(特别是随着更快的处理速度,性能有时可以冒险)。

您是否考虑过将每个属性作为表中单独的项目存储...比如说表“2”,其中返回到产品的关键字是一个ID:

    Product (table 1)
{
    Product ID
    Product Name
}

    Tags (table 2)
{
    Tag ID
    Higher Level tag ID
    Description
    Value
    Product ID
}

同时,这个表格还应该包含一个名为“高级别”的字段,以便您可以在此表格中找到作为特定产品的高级别创建的属性的唯一ID。

这样,您就拥有了所谓的“全级别标记”。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接