具有可变属性的项目的数据库设计?

时间:2013-09-05 13:37:05

标签: sql sql-server mongodb database nosql

我正在创建一个需要存储项目和类别的应用程序。添加到数据库的信息将由用户提交,用户可以在项目的未来类别中添加项目。

E.g。用户可以将CD添加到音乐类别,或将DVD添加到电影类别。我不想限制可以添加的类别或可以添加到这些类别的项目。用户几乎可以添加任何项目。

现在我正在使用SQL Server,我有一个Item表,其中ItemId(主要),Name,Description和CategoryId(外部)链接到具有相似列的Category表。

我的问题是CD和DVD具有不同的属性,如“运行时间”,“年龄评级”,“曲目数”,因此我无法将它们存储在同一个表中,因为它们会有冗余列。如果用户添加了“引擎尺寸”,“颜色”等等的汽车怎么办?

所以我研究过,我认为我有以下选择:

1)为添加的每个类别动态创建一个新表,并将该类别中的所有项目一起存储在同一个表中。

问题:我听说动态创建表是一个糟糕的设计决策。管理和找到我需要的东西更难。

2)在item表中创建一个'ItemAttributeData'字符串列,我可以在其中存储自定义字符串,例如包含该特定项的属性的XML文档。

问题:这些属性不能从SQL查询,必须在代码中手动处理。

3)使用NoSQL解决方案,例如MongoDB或azure表存储(它是一个ASP.NET应用程序)并创建一个项集合,其中每个项目可以有不同的列集。

问题:我丢失了从类别到项目和其他表格(如“用户”)的关系映射(我认为?)

4)组合RDBMS和NoSQL,使无示意图属性存储在NoSQL itemAttributes集合中,共享项属性存储在关系数据库中。然后使用itemId链接它们。

您认为在可扩展性和性能方面最佳的解决方案是什么?

2 个答案:

答案 0 :(得分:4)

如果我是你,我会选择另一种选择:EAV model

您可以从该模型轻松地为CD和DVD创建一些视图,类似于每个类别的平面表。

一旦掌握了它,就很简单了。它表现良好。

答案 1 :(得分:0)

我自己从不使用它,但一个有趣的解决方案可能是PostgreSql + hStore 保留Sql,您可以在列中使用半结构化数据。该列是一个非常有限的键/值存储(例如,没有嵌套),但可索引和可​​搜索。

相关问题