【问题标题】:Design pattern - database many to many设计模式——数据库多对多
【发布时间】:2012-11-12 23:24:58
【问题描述】:

我有一个关于多对多关系的问题。我知道我们必须创建一个联结表。但是假设我们有这种情况:

为客户提供一张桌子 一张订单表 一桌产品

一个订单可以有多个产品,一个产品可能有多个订单。因此,我们创建了一个联结表。 我可以在客户和产品之间创建一个联结表,这个联结将是一个订单表来存储订单吗?

谢谢

【问题讨论】:

  • 您需要一个OrderProducts 表。 Orders 会有CustomerIDOrderProducts 会有很多OrderIDProductID 它仍然需要自己的索引,因为许多相同的Product 可能在那个Order
  • 或者,您可以让OrderProducts 使用OrderIDProductID 作为复合主键,并包含Quantity 字段。
  • 您可能不想创建联结表ala CustomerProducts,因为它不允许您将各个行组合成单独的Orders

标签: sql database many-to-many junction-table


【解决方案1】:

如果您这样做,您如何知道客户在特定订单中包含哪些产品?而且,您将如何处理客户在多个订单中订购同一产品?

所以,不,您不能只创建一个客户到产品的联结表,因为这不会为您提供最终需要的信息。

【讨论】:

  • 你是对的。您是否建议在 OrderProduct 表中创建复合键?
  • 如果是。比方说,创建订单表的主键,结合外键(客户ID)和订单ID,这是一个好习惯。然后根据订单的外键(customerID 和 orderID)+ productID 在 OrderProduct 中创建一个组合键。因此会更容易查询。
  • 我大多数时候都避免使用复合键。我遇到的问题是复合键中的列太多。在此示例中,如果您在 OrderProduct 中执行复合键,则 OrderProductThing 中的键现在包含三列。随着复合键包含越来越多的列,编写这些查询会变得很痛苦。
  • 您要解决什么问题?您是否正在运行一个特定的报告或查询,让您翻倍?或者这只是一个建模练习?我见过的每个 Orders 数据库都有一个 Order Header 表(带有 Customer)和一个 Order Detail 表(带有 Product 和 Order Header ID)
  • 这只是一个建模练习。如果我确实像您所说的那样,我如何查询以了解用户购买的所有产品名称。在 OrderProduct 表中包含一个复合外部(customerID 和 OrderID)不是更好吗,这样查询起来会容易得多?
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多