【问题标题】:saving different attributes types in single table or multiple tables in mysql在mysql中的单个表或多个表中保存不同的属性类型
【发布时间】:2017-01-23 03:31:40
【问题描述】:

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

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

  • Mobile 具有 "ram , model_name, os" ,
  • 等属性
  • T 恤具有“颜色、尺寸”等属性

问题如下:

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

  2. 将不同类型的产品保存在不同的表格中,例如 mobiletshirts 等...

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

更新

如answers & cmets 中所建议,我使用的是EAV 模型并绘制以下设计,如果您发现任何错误,请告知我......

【问题讨论】:

  • 创建一个名为“Attributes”的表,然后作为字段“type”“value”,你应该阅读“Magento and Attributes and Attribute_sets”
  • 正如@KikiTheOne 指出的那样,请查看EAV model,否则您最终会得到填充空值的不必要的长表。
  • @KikiTheOne 请在此处查看:prnt.sc/ci9uzlattribute_id 表下我计划保存model,size,colorattribute_values_id 表下,我想存储apple, 17inch , blue 这是更好的方法比较到上面2我提到的问题?它是正确的 EAV 规则吗? ——
  • 你也在其他地方发过这个?
  • ID 不应该是 varchars,因为 Auto_increment 不是。和 values 应该是 varchars 因为它们可以包含 chars 。也许这会帮助你找到“UR”正确的解决方案。 excellencemagentoblog.com/blog/2011/09/07/…

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


【解决方案1】:

您描述的问题很常见 - 它通常被称为“在关系模式中存储多态数据”。它发生在堆栈溢出quiteregularly

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

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

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

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

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

【讨论】:

  • 请在此处查看:prnt.sc/ci9uzlattribute_id 表下我计划保存model,size,colorattribute_values_id 表下,我想存储apple, 17inch , blue 与上面相比,这是更好的方法吗2 我提到的问题?它是正确的 EAV 规则吗? ——
【解决方案2】:

创建产品表,

创建表属性

字段:

Id    
Name    
...

创建表类别

字段:

Id     
Name    
...

创建表 category_product 和 category_property...

创建表property_product_value

字段:

Id     
Property_id
product_id    
Value    
...

从手机上写,如果您有更多问题,请告诉我。

【讨论】:

  • 请在此处查看:prnt.sc/ci9uzlattribute_id 表下我计划保存model,size,colorattribute_values_id 表下,我想存储apple, 17inch , blue 与上面相比,这是更好的方法吗2 我提到的问题?它是正确的 EAV 规则吗? ——
猜你喜欢
  • 2017-07-31
  • 2014-04-24
  • 1970-01-01
  • 2020-08-27
  • 2015-11-28
  • 1970-01-01
  • 2013-08-08
  • 2020-04-01
  • 2016-05-30
相关资源
最近更新 更多