我正在创建一个需要存储项目和类别的应用程序。添加到数据库中的信息将由用户提交,用户可以添加项目并在未来为项目添加类别。
例如,用户可以将 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 链接它们。
您认为在可扩展性和性能方面最好的解决方案是什么?