4

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

Products{ProductId, Name, ProductCategoryId} 
ProductCategories{ProductCategoryId, Name, ParentId} 
CategoryProperties{CategoryPropertyId, ProductCategoryId, Name} 
ProductPropertyValues{ProductId, CategoryPropertyId, Value} 

现在一些分析我看,这样的设计其实是EAV模型,我读了人们通常不建议采用这种设计后。
似乎动态SQL查询是一切都需要。

这是一种方法,我现在正在查看它。

我看到的另一种方式可能被命名为很多工作方式但如果它更好,我想去那里。 为了使表

Product{ProductId, CategoryId, Name, ManufacturerId} 

,并使数据库至极表继承手段,使表像

Cpus{ProductId ....} 
HardDisks{ProductId ....} 
MotherBoards{ProductId ....} 
erc. for each product (1 to 1 relation). 

我明白,这将是一个非常大的数据库,非常大的应用领域,但它比使用EAV设计的选项更好,更容易和更好的性能

+1

我不同意你的初始设计是EAV。 – 2013-03-06 15:53:31

+0

ProductPropertyValues表不是EAV?来吧。 – 2013-03-06 16:09:44

+0

你为什么认为它不是? – 1110 2013-03-06 19:03:42

回答

5

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

然而,还有其他的方法。您可以考虑使用扩展数据的XML字段,或者如果您使用的是PostgreSQL 9.2,则可以使用JSON字段(尽管XML更容易搜索)。这会给你一个更大范围的可能搜索,而不会让EAV头疼。权衡将是模式执行会更困难。

+0

是的,这正是迫使我问这个问题的问题。我已经制作了EAV结构和过滤产品由不同的类别迫使我使用动态sql和很多痛苦所以我开始重新调整数据库到较小的表,现在我对我的40个继承产品表感到满意,但仍然分析问题... – 1110 2013-03-07 20:43:03

4

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

除了性能,可扩展性和有讨论,也考虑到复杂性:

  • SQL数据库如SQL Server具有全文搜索功能;所以如果你有一个单一的领域描述产品 - 全文搜索将索引它,并将能够提供先进的语义搜索

  • 看看现在所有愤怒的no-sql系统;它们的可伸缩性应该是相当不错的,它们为非结构化数据提供支持,例如您拥有的数据。 Hadoop和Casandra是很好的起点。

+0

NoSQL数据库不是我对此项目的兴趣,所以我不能考虑它们。通过'...单个字段来描述产品...'您是否想将所有可能的属性添加到产品中作为列?这将是1000列的表我不能这么做:( – 1110 2013-03-06 19:06:14

+0

不,这是所有这些属性的单个列。 – 2013-03-07 12:09:11

0

你可以很好地使用EAV模型。 我们采用与物流应用程序相似的方式。它虽然建立在.net上。 除了表格之外,您的应用程序代码必须正确处理对象。 看看你是否可以为每个对象添加通用表。它适合我们。

相关问题