在mysql

时间:2016-09-15 07:38:14

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

我们计划用PHP构建一个电子商务网站。

有不同类型的产品,例如手机,T恤,手表,书籍。

  • 移动设备包含" ram,model_name,os"
  • 等属性
  • T恤具有"颜色,尺寸"
  • 等属性

问题如下:

  1. 将所有属性保存在名为产品的单个表格中是否更好(即使会有/它会创建很多" NULL" 值)?

  2. 在不同的表格中保存不同类型的产品,例如移动 tshirts 等...

  3. 在第二种情况下,将创建更多表格(参见下面的2张图片)。

    enter image description here

    enter image description here

    更新

    如答案&评论,我正在使用EAV模型并绘制以下设计,如果您发现任何错误,请通知我....

    enter image description here

2 个答案:

答案 0 :(得分:1)

创建产品表

创建表属性

字段:

Id    
Name    
...

创建表类别

字段:

Id     
Name    
...

创建表category_product和category_property ...

创建表property_product_value

字段:

Id     
Property_id
product_id    
Value    
...

来自手机,如果您有更多问题请告诉我。

答案 1 :(得分:1)

您描述的问题非常常见 - 它通常被称为“在关系模式中存储多态数据”。它发生在Stack Overflow quite regularly上。

你问“什么更好” - 这当然取决于你打算使用数据的方式。

如果您事先并不知道将要存储哪些属性 - 例如,如果您的电子商务网站将来可能会引入更多产品类型 - 纯粹的关系模型不太可能有效,因为您每次引入新类型的产品时都必须更改架构。

如果您事先不知道需要支持哪种查询,那么关系模型可能也是一个问题。例如,如果您有一个过滤机制,允许用户从品牌“xyz”中搜索蓝色,尺寸较小的T恤,您可能需要动态创建SQL查询。这不是特别容易。

EAV模型绕过第一个问题,但不是第二个问题。实际上,即使对EAV数据模型进行简单查询也很难。

我会考虑一种解决方案,您可以在SQL表中存储“已知的预先”属性(SKU,价格,is_sellable,描述等),以及关系(供应商,类别,仓库等)。 另一个可变数据可以存在于数据库中的JSON documents中。我会特别注意MySQL full text search indexing - 您可以使用它来代替“纯”SQL来运行许多常见查询。