在单个 table 中保存不同的属性类型或在 mysql 中保存多个 table

saving different attributes types in single table or multiple tables in mysql

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

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

问题如下:

  1. 是否最好将所有属性保存在一个名为 Products 的 table 中(即使会有/它会创建很多"NULL" 个值)?

  2. 在不同的 table 中保存不同类型的产品,例如 mobiletshirts 等。 ..

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

更新

根据答案和评论中的建议,我使用的是EAV模型并绘制了以下设计,如果您发现任何错误,请通知我....

创建产品 table,

创建table属性

字段:

Id    
Name    
...

创建table类别

字段:

Id     
Name    
...

创建 tables category_product 和 category_property...

创建tableproperty_product_value

字段:

Id     
Property_id
product_id    
Value    
...

手机写的,有问题可以私信我。

您描述的问题很常见 - 通常称为 "storing polymorphic data in a relational schema"。它发生在 Stack Overflow quite regularly.

您问 "what's better" - 这当然取决于您打算使用数据的方式。

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

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

EAV 模型解决了第一个问题,但没有解决第二个问题。事实上,运行 即使是针对 EAV 数据模型的简单查询也变得非常困难。

我会考虑将 "known upfront" 属性存储在 SQL 表(SKU、价格、is_sellable、描述等)以及关系(供应商)中的解决方案、类别、仓库等)。 另一个可变数据可以存在于 JSON documents within the database. I'd pay particular attention to the MySQL full text search indexing 中 - 您可以使用它代替 "pure" SQL 到 运行 许多常见查询。