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