如何使用具有相似属性的表对多对多关系建模?

时间:2016-03-08 18:36:22

标签: sql database database-design many-to-many database-schema

这是一个相当直接的多对多枪支玩具到他们所处的价格范围内的多对多映射。 Zombie Strike和Elite Retaliator价格昂贵,而Jolt Blaster和Elite Triad都更便宜(价格在$ 5.00- $ 9.99)。

enter image description here

enter image description here

到目前为止一切顺利。但是当我想开始追踪其他物品的价格时会发生什么?这些其他项目具有不同的列,但仍需要PRICE_RANGES映射。所以我可能仍然使用PRICE_RANGES表,但我需要其他表的其他表。

让我们添加棋盘游戏。我应该如何建模这张新桌子以及其他喜欢它的人?

我是否应该添加多个多对多表格,每个新类型的表格都有一个跟踪?

enter image description here

或者我应该对PRICE_RANGES进行非规范化,完全删除映射表,并为每个项目类型复制PRICE_RANGES表?

enter image description here

第二种解决方案具有非常相似的优点,但代价是重复PRICE_RANGES中的所有范围。 (并且可能有数千个PRICE_RANGES,具体取决于增量的小小)。这种非规范化仍然是一种有效的解决方案吗?

或许还有第三种方式比这两种更好?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

为什么你有一个“价格范围”表?这将使其具有高度限制性。除非有一个非常令人信服的理由我错过了...这是我会考虑的。

  • 删除映射表
  • 删除价格范围表
  • 为要跟踪价格范围的每个表添加最低价格和最高价格。如果没有范围,您可以允许最大价格为空,或者使两者的价格相同。然后,您可以查询表格以查找您想要的任何范围内的项目。

我会考虑另一个想法......你想跟踪多少种不同类型的产品?如果您要为每种产品制作单独的表格......如果您希望拥有数百或数千种商品,这将很快变得无法管理。考虑使用“产品”表,该表包含在所有产品中共享属性(如价格)的列。它将具有ProductType列,该列可以引用查找表,也可以直接将类型放入列中。然后有一个单独的键/值表来覆盖其他随机的东西,如螺栓容量。或者甚至考虑将其放在xml / json / blob列中以覆盖所有额外的信息。