我目前正在设计一个电子商务平台的产品部分数据库结构。 它需要以这样的方式,使得它能够销售不同类型的产品无限多的具有不同属性的无限数量来设计。
例如,一台笔记本电脑的属性将是RAM,屏幕尺寸,重量等书的属性将是作者,ISBN,出版社等。
这似乎是一个EAV结构将是最合适的。
- 选择一个产品
- 产品所属属性设置
- 属性组包含的属性x和y
- 属性x是数据类型的日期时间(存储在attribute_values_datetime值)
- 属性y是数据类型为int(存储在attribute_values_int值)
- 每个属性定义表示类型(I,E,x具有列型 - > datetype)
假设上面,我可以加入选择的attribute_values_datetime表,以获得正确的数据没有得到结果集,现在该表被称为建设第二查询? 会有很大的性能命中构建这种类型的查询或将在下面更合适的(虽然不太功能)
- 选择一个产品
- 产品所属属性设置
- 属性组包含的属性x和y
- 属性x是数据类型的日期时间,但如在ATTRIBUTE_VALUES TEXT存储
- 属性y是int数据类型,但如在ATTRIBUTE_VALUES TEXT存储
我要提供相反的意见,大多数的意见在这个问题上。 虽然EAV是邪恶的一切,你可以找到充分的理由对SO和DBA.SE这里多次解释和其他地方,有一个非常常见的应用大部分是错EAV的东西在很大程度上是不相关的和( EAV的少数)的优势都非常密切。 该应用程序的在线产品目录。
与EAV的主要问题是,它并没有让数据库做什么它是干什么的,这有助于通过在架构安排他们给予适当的上下文的有关不同实体的信息不同的属性确实不错。 有一个架构带来了各地的访问,解释和执行数据的完整性很多很多的优点。
关于产品目录的事实是,一个产品的属性是几乎完全无关的目录系统本身。 产品目录系统做(至多)与产品属性的三件事情。
在列表中显示的产品属性对最终用户的形式为:{属性名称}:{属性值}。
显示多个产品的在比较网格的属性,其中不同的产品的属性排队彼此抵靠(产品通常是列,属性通常是行)
驱动器基于特定属性/值组合的东西(如价格)规则。
如果你所有的系统确实是反刍在语义无关(到系统)信息,然后这些信息的模式基本上是无益的。 事实上架构碍事的在线产品目录,特别是如果你的目录有许多不同类型的产品,因为你总是不得不重新回到架构鼓捣出来,让新的产品类别或属性类型。
由于如何使用它,即使是在产品目录中的属性值的数据类型不一定是(极其)重要。 对于某些属性,您可能要强加约束上,如“必须是一个数字”或“必须来自该列表{...}”。 这取决于属性一致性如何重要的是你的目录,你想你的实现是多么复杂的。 看着几个在线零售商我说最愿意权衡简单的一致性,产品目录。
是的,EAV是邪恶的,除非它不是。
是的,有典型的组装查询一个EAV模型遭受巨大的损失。 有用于检查数据的自洽更大的性能损失,因为DBMS是不会能为你做它。 如果出现问题,在DBMS不能告诉你。
有了比较正统的数据库设计的建议, 俄德在评论中,DBMS能够确保在数据库中的数据更接近一致。 我强烈律师使用常规(非EAV)设计的。
我不知道这应该是一个评论或回答。 不过在这里,我走了。
我不知道到底是什么,你的建设。 但你有没有考虑进去一看Magento的EAV数据库结构 ? 是的,它可能会很慢,查询可以是巨大的,但对我们的长处比负多。 而在另一方面Magento的需要照顾的查询。
我们是在我们的网上商店(中大尺寸店)使用的Magento的迁移中,现在我们很高兴与EAV方法。