【发布时间】:2013-02-21 08:59:34
【问题描述】:
我开始了一个新的应用程序,现在我正在寻找两条路径,但不知道哪个是继续的好方法。
我正在构建类似 电子商务 网站。我有一个类别和子类别。
问题是网站上有不同类型的产品,每个产品都有不同的属性。并且网站必须能够通过这些产品属性过滤。
这是我最初的数据库设计:
Products{ProductId, Name, ProductCategoryId}
ProductCategories{ProductCategoryId, Name, ParentId}
CategoryProperties{CategoryPropertyId, ProductCategoryId, Name}
ProductPropertyValues{ProductId, CategoryPropertyId, Value}
现在经过一些分析,我发现这个设计实际上是EAV模型,我读到人们通常不推荐这种设计。
似乎一切都需要动态 sql 查询。
这是一种方式,我现在正在研究它。
我看到的另一种方式可能被命名为 LOT WORK WAY,但如果它更好,我想去那里。 做表
Product{ProductId, CategoryId, Name, ManufacturerId}
并在数据库中进行表继承,这意味着使表像
Cpus{ProductId ....}
HardDisks{ProductId ....}
MotherBoards{ProductId ....}
erc. for each product (1 to 1 relation).
我知道这将是一个非常大的数据库和非常大的应用程序域,但它是否比采用 EAV 设计的选项更好、更容易且性能更好。
【问题讨论】:
-
我不同意你的初始设计是 EAV。
-
ProductPropertyValues 表不是 EAV 吗?来吧。
-
为什么你认为不是?
-
EAV 是一种反模式。尽量避免。
-
是的。您还可以考虑对某些可能只想搜索但不需要计数或排序的列使用带有 SQLXML 函数的 XML 列
标签: sql database database-design relational-database entity-attribute-value