在单个 table 中保存不同的属性类型或在 mysql 中保存多个 table
saving different attributes types in single table or multiple tables in mysql
我们正计划用 PHP 建立一个电子商务网站。
有不同类型的产品,例如 手机、T 恤、手表、书籍。
- 手机有 "ram , model_name, os" ,
等属性
- T 恤具有类似 "color, size"
的属性
问题如下:
是否最好将所有属性保存在一个名为 Products 的 table 中(即使会有/它会创建很多"NULL" 个值)?
在不同的 table 中保存不同类型的产品,例如 mobile、tshirts 等。 ..
在第二种情况下,将创建更多 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 到 运行 许多常见查询。
我们正计划用 PHP 建立一个电子商务网站。
有不同类型的产品,例如 手机、T 恤、手表、书籍。
- 手机有 "ram , model_name, os" , 等属性
- T 恤具有类似 "color, size" 的属性
问题如下:
是否最好将所有属性保存在一个名为 Products 的 table 中(即使会有/它会创建很多"NULL" 个值)?
在不同的 table 中保存不同类型的产品,例如 mobile、tshirts 等。 ..
在第二种情况下,将创建更多 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 到 运行 许多常见查询。