【发布时间】:2012-07-31 12:43:13
【问题描述】:
我目前正在为电子商务平台的产品部分设计数据库结构。它需要以这样一种方式设计,即可以销售具有无限数量不同属性的无限数量的不同类型的产品。
例如笔记本电脑的属性可以是 RAM、屏幕尺寸、重量等。一本书的属性可以是 Author、ISBN、Publisher 等。
似乎 EAV 结构最合适。
- 选择产品
- 产品属于属性集
- 属性集包含属性 x 和 y
- 属性 x 是数据类型日期时间(值存储在属性值日期时间中)
- 属性 y 是 int 数据类型(值存储在 attribute_values_int 中)
- 每个属性定义都表示类型(即 x 具有列类型 -> 日期类型)
假设上述情况,我是否可以将选择加入attribute_values_datetime 表以获取正确的数据,而无需获取结果集并在该表已知的情况下构建第二个查询?构建这种类型的查询是否会对性能造成很大影响,或者下面的查询是否更合适(尽管功能较少)
- 选择产品
- 产品属于属性集
- 属性集包含属性 x 和 y
- 属性 x 是数据类型日期时间,但在属性值中存储为 TEXT
- 属性 y 是数据类型 int,但在属性值中存储为 TEXT
【问题讨论】:
-
不要使用 EAV。不要介意性能问题(只会不断增长的海量表),请考虑如何查询它。在大多数情况下,EAV 是过度标准化。
-
我倾向于同意@Oded,您最终会在数据库中构建数据库。我想知道大型在线零售商采取什么方法(好的方法)。
-
将数据库用作数据库...为您最终拥有的实际产品类型创建表。我会反对不合理的要求——“无数种不同类型的产品具有无数种不同的属性”对我来说当然听起来不合理。从您的业务中获取一些估计限制。
-
@Oded:EAV 与规范化无关。没有任何分解规则说:“将属性的名称作为数据存储在表中的一行中,并将其值(无论数据类型如何,作为 varchar(n) 存储在同一行中)”。不过,它可能是过于抽象了。
-
@Oded,没有人可以遵循规范化规则,无论是否落水,并到达 EAV。只有当他们根本不了解标准化意味着什么时,他们才能达到 EAV。存储 EAV 数据的物理表和它试图建模的虚拟表都不是关系。如果表格不是关系,则不能以任何正常形式放置表格。这是一个先决条件,好像有一个“第 0 范式”。
标签: mysql sql database-design database-schema entity-attribute-value