5

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

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

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

我的问题是 CD 和 DVD 具有不同的属性,例如“运行时间”、“年龄等级”、“曲目数”,所以我不能将它们存储在同一张表中,因为它们会有多余的列。如果用户添加了带有“发动机尺寸”、“颜色”等的汽车怎么办?

所以我进行了研究,我认为我有以下选择:

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

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

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

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

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

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

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

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

4

2 回答 2

4

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

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

一旦掌握了窍门,就很简单了。而且表现不错。

于 2013-09-05T13:47:08.903 回答
0

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

于 2013-09-05T15:56:37.473 回答