【问题标题】:How do I model many-to-many relationships with tables that have similar attributes?如何为具有相似属性的表建模多对多关系?
【发布时间】:2016-06-22 20:47:33
【问题描述】:

这是一个相当简单的 Nerf 枪支玩具与其所属价格范围的多对多映射。 Zombie Strike 和 Elite Retaliator 价格昂贵,而 Jolt Blaster 和 Elite Triad 更便宜(在 5.00 美元到 9.99 美元之间)。

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

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

我是否应该添加多个多对多表,为我正在跟踪的每种新类型的项目添加一个表?

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

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

或者也许有第三种方式被认为比这两种方式更好?

感谢您的帮助!

【问题讨论】:

  • 我的第一个建议与@ben-sala 的答案相同,您有一个通用的 Product 表,然后是 ProductType 列。鉴于您不希望此解决方案,我将不得不采用第一个解决方案。我唯一会使用第二种解决方案的情况是,每种产品的价格范围是否不同。无论如何,标准化通常是要走的路。

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


【解决方案1】:

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

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

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

【讨论】:

  • 本,感谢您的 cmets。我没有说清楚的是,这是一个多对多的关系。许多不同的产品不仅可以共享价格范围;一个产品实际上可以有很多价格范围。 (例如,由于各种原因,一件商品可能同时属于 $5.00-$9.99 和 $10.00-$14.99 类别)。这就是为什么中间需要多对多表的原因。否则,是的,一个更简单的解决方案可以解决问题。关于您的第二个问题,实际上不会有很多产品类型 - 可能是 10-20。所以我认为为每个人制作一张桌子并不难。
  • 那您为什么不将给定商品的最低价格为 5 美元,最高价格为 14.99 美元?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多