我开始了一个新的应用程序,现在我正在寻找两条路径,并且不知道哪种方法可以继续
我正在构建类似电子商务网站的内容。我有类别和子类别。
问题是网站上有不同类型的产品,每个产品都有不同的属性。并且这些产品属性必须可过滤
这是我最初的数据库设计:
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设计的选项更好,更容易,性能更好。
答案 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上。 除了表之外,您的应用程序代码必须正确处理对象。 看看是否可以为每个对象添加通用表。它适用于我们。