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

时间:2010-05-31 17:23:16

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

我是数据库设计的新手。 对于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
}

4 个答案:

答案 0 :(得分:23)

您犯了数据库设计的常见错误,将名称存储在一列中,将值存储在另一列中。这不是关系数据库设计。

每个属性都应按列名命名。颜色,页面,衬衫尺寸,发布日期应为列名称

如果每种产品类型都有一组不同的属性,则还有其他解决方案。请参阅我的答案:

另外在实现围绕名称 - 值对设计的数据库之前阅读此故事:Bad CaRMa: Introducing Vision

答案 1 :(得分:3)

我认为您可以获得的产品属性的最佳实现是

Product_Tbl [
    ID
    Name
    more columns
]

Attribute_Tbl [
   ID
   Att_Name
]

Product_Attribute_Tbl [
    Product_ID
    Attribute_ID
    Value
]

如果您的产品不具有相同的属性,则可以使用此结构

答案 2 :(得分:1)

这取决于您对数据库的要求。如果您的所有产品属于同一类型且属性相同,那么您只需要执行以下操作:

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

答案 3 :(得分:0)

现在这是一个古老的话题,但是考虑一下它的演变可能会很有趣(尤其是处理速度越快意味着性能有时会被赌博)。

您是否曾考虑将每个属性存储为表格中的单独项目...让我们说表格为“2”,其中返回产品的密钥为id:

Schema::table('users' function(Blueprint $table){
  $table->string('role')->nullable();
});

此表还包含一个名为“更高级别”的字段,因此您可以在此表中找到该属性创建为此特定产品的更高级别的唯一ID。 这样你就有了一种叫做“全方位标记”的东西。

希望这有帮助