我应该使用EAV数据库设计模型还是很多表

时间:2013-03-06 14:12:37

标签: sql database database-design relational-database entity-attribute-value

我开始了一个新的应用程序,现在我正在寻找两条路径,并且不知道哪种方法可以继续 我正在构建类似电子商务网站的内容。我有类别子类别
问题是网站上有不同类型的产品,每个产品都有不同的属性。并且这些产品属性必须可过滤 这是我最初的数据库设计:

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设计的选项更好,更容易,性能更好

3 个答案:

答案 0 :(得分:5)

EAV很少是一场胜利。在你的情况下,我可以看到EAV的吸引力,因为不同的类别将具有不同的属性,否则将很难管理。但是,假设有人想要搜索“所有硬盘超过3个盘片,使用SATA接口,以10k rpm旋转?”你在EAV中的查询会很痛苦。如果你想支持这样的查询,EAV就会出局。

然而,还有其他方法。您可以考虑使用扩展数据的XML字段,或者如果您使用的是PostgreSQL 9.2,则可以考虑使用JSON字段(但XML更容易搜索)。这将为您提供更大范围的可能搜索,而不会出现EAV的麻烦。权衡将是模式执行会更难。

答案 1 :(得分:4)

This问题似乎更详细地讨论了这个问题。

除了在那里讨论的性能,可扩展性和复杂性之外,还要考虑到:

  • SQL Server等SQL数据库具有全文搜索功能;因此,如果您有一个描述产品的字段 - 全文搜索将对其进行索引,并且能够提供高级语义搜索

  • 看看现在风靡一时的no-sql系统;可伸缩性应该非常好,它们可以为非结构化数据提供支持,例如您拥有的数据。 Hadoop和Casandra是很好的起点。

答案 2 :(得分:0)

你可以很好地使用EAV模型。 我们使用物流应用程序执行类似操作。它建立在.net上。 除了表之外,您的应用程序代码必须正确处理对象。 看看是否可以为每个对象添加通用表。它适用于我们。