多对多关系中的主键重复

时间:2019-10-06 19:38:30

标签: database-design entity-relationship entity-relationship-model

两个表tArticletCustomer之间存在m:n关系。每当客户购买商品时,商品和客户之间的链接就会存储在第三个表格中,并带有一个附加属性,其中包含该客户购买的金额。

tArticle:

kArticle | title | stock
---------+-------+------
1        | Water | 39
2        | Apple | 14

tCustomer:

kCustomer | surname | firstName
----------+---------+----------
1         | Muller  | Max
2         | Meier   | Tom

tCustomer_tArticle:

kCustomer | kArticle | number
----------+----------+---------
1         | 2        | 2
2         | 2        | 5
2         | 2        | 3

我知道强烈建议您使用组合的外键作为主键。但是由于同一位顾客可以两次购买同一件商品,因此不再是唯一的了。

现在我的问题是我需要在第三张表中添加一个AUTO_INCREMENT主键,还是应该使用物理顺序来拥有唯一记录。

我的第二个问题是,是否有一种方法可以在实体关系图中指定m:n关系中的链接是否可能出现两次。

3 个答案:

答案 0 :(得分:1)

“现在我的问题是我需要在第三个表中添加一个AUTO_INCREMENT主键,还是应该使用物理订单来拥有唯一记录。”

“具有唯一记录的物理顺序”是什么意思?

对于您而言,我建议添加一个 AUTO_INCREMENT PK ,例如:

order_id PRIMARY KEY AUTO_INCREMENT

我的原因是: 想想当您去麦当劳时,您会收到一张带有订单ID的收据。当您再次购买食物时,新的收据上会显示不同的订单ID。因此,属性order_id使每个订单都是唯一的。

“如果有一种方法可以在实体关系图中指定m:n关系中的链接是否可能出现两次”

据我所知,不。我假设您想用您的E-R模型反映多少次(或者客户可以多次购买同一件商品),如果是这样,您可以通过以下方式思考这个问题:

tCustomer_tArticle(order_id,kCustomer,kArticle,数字)可以反映此功能吗?是。我们可以做到:

SELECT order_id,kCustomer,kArticle,number FROM tCustomer_tArticle WHERE kCustomer="Tom";

这将为我们提供汤姆下达多少订单的结果。

只要您有一个PK来指示每个订单,就可以得到第二个问题的答案。

答案 1 :(得分:1)

我不知道“强烈建议”将两个外键用作主键。在正确的情况下,那绝对是一种方法。我倾向于始终为表分配唯一的自动递增键的方法,除非空间开销是一个大问题。自动递增的键提供:

  • updatedelete的每一行的唯一引用。
  • 插入顺序的记录。
  • 可以对表声明更简单的外键。

从本质上讲,您的表是一个事务表。我不仅建议自动增加密钥,还建议交易日期/时间以及其他信息。

至此评论:

  

或者我应该使用实际订单获得唯一记录。

SQL表表示无序集。您没有看到物理顺序对访问行很有用。如果您关心插入顺序,那么您确实需要自动递增的密钥。

答案 2 :(得分:1)

请考虑您要在tCustomer_tArticle表中表示哪些信息。例如,在以下情况下:

kCustomer | kArticle | number
----------+----------+---------
2         | 2        | 3
2         | 2        | 3

这只是意味着汤姆买了六个苹果,还是意味着三个苹果各有两个交易?如果只是将表格记录为数量的记录,则可以使kCustomer,kArticle为键并用一行记录相同的信息:

kCustomer | kArticle | number
----------+----------+---------
2         | 2        | 6

如果该表应该记录单个交易,则该表似乎缺少信息。给定您的原始示例具有三行示例数据,可能不清楚是一,二还是三笔交易。我希望组合密钥中包含某种事务标识符。我认为自动递增的数字不会有帮助。在考虑添加代理密钥之前,您需要先确定有意义的密钥,以使业务领域有意义。

相关问题