两个表tArticle
和tCustomer
之间存在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关系中的链接是否可能出现两次。
答案 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)
我不知道“强烈建议”将两个外键用作主键。在正确的情况下,那绝对是一种方法。我倾向于始终为表分配唯一的自动递增键的方法,除非空间开销是一个大问题。自动递增的键提供:
update
和delete
的每一行的唯一引用。从本质上讲,您的表是一个事务表。我不仅建议自动增加密钥,还建议交易日期/时间以及其他信息。
至此评论:
或者我应该使用实际订单获得唯一记录。
SQL表表示无序集。您没有看到物理顺序对访问行很有用。如果您关心插入顺序,那么您确实需要自动递增的密钥。
答案 2 :(得分:1)
请考虑您要在tCustomer_tArticle表中表示哪些信息。例如,在以下情况下:
kCustomer | kArticle | number
----------+----------+---------
2 | 2 | 3
2 | 2 | 3
这只是意味着汤姆买了六个苹果,还是意味着三个苹果各有两个交易?如果只是将表格记录为数量的记录,则可以使kCustomer,kArticle为键并用一行记录相同的信息:
kCustomer | kArticle | number
----------+----------+---------
2 | 2 | 6
如果该表应该记录单个交易,则该表似乎缺少信息。给定您的原始示例具有三行示例数据,可能不清楚是一,二还是三笔交易。我希望组合密钥中包含某种事务标识符。我认为自动递增的数字不会有帮助。在考虑添加代理密钥之前,您需要先确定有意义的密钥,以使业务领域有意义。