两个表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关系中的链接可能出现两次,是否有一种方法可以在实体关系图中指定。
发布于 2019-10-06 19:48:23
“现在我的问题是,我是否需要向第三个表添加一个AUTO_INCREMENT主键,还是应该使用物理顺序来拥有唯一的记录。”
你所说的“拥有独特记录的物理秩序”是什么意思?
在您的例子中,我建议添加一个AUTO_INCREMENT PK,例如:
order_id PRIMARY KEY AUTO_INCREMENT
我的理由是:当你去麦当劳的时候,你会得到一张收据,上面写着订货单。当你再次购买食物时,你会在一张新的收据上得到一个不同的订单id。因此,属性order_id使每个顺序都是唯一的。
如果有一种方法可以在实体关系图中指定一个m:n关系中的链接是否可能出现两次
据我所知,没有。我假设您想要您的E模型反映多少次(或者一个客户可以购买同一件商品不止一次),如果是这样,您可以这样想:
tCustomer_tArticle(order_id,kCustomer,kArticle,number)能反映这一特性吗?是。我们可以:
SELECT order_id,kCustomer,kArticle,number FROM tCustomer_tArticle WHERE kCustomer="Tom";
这将使我们得到汤姆下了多少订单的结果。
只要你有一个PK来指示每一个订单,你就会得到第二个问题的答案。
发布于 2019-10-06 19:49:05
我不知道在哪里“强烈推荐”两个外键作为主键。在适当的情况下,这绝对是一种方法。我更喜欢为表分配唯一的自动递增键的方法,除非空间开销是一个大问题。自动递增键提供:
对插入顺序的delete
s.
update
的每一行的唯一引用。
本质上,您的表是一个事务表。我不仅会推荐一个自动递增的密钥,还会推荐一个事务日期/时间以及其他信息。
关于这一评论:
或者我应该使用物理顺序来拥有唯一的记录。
SQL表表示无序集。没有物理顺序,您应该看到一个有用的访问行。如果您关心插入顺序,那么您确实需要一个自动递增的键.
发布于 2019-10-07 05:34:28
考虑一下您试图在tCustomer_tArticle表中表示的信息。例如,在以下情况下:
kCustomer | kArticle | number
----------+----------+---------
2 | 2 | 3
2 | 2 | 3
这仅仅意味着汤姆买了6个苹果,还是意味着三个苹果各有两个交易?如果表应该是数量的记录,那么您可以让kCustomer、kArticle键并用一行记录相同的信息:
kCustomer | kArticle | number
----------+----------+---------
2 | 2 | 6
如果表应该记录单个事务,那么表中似乎缺少信息。考虑到有三行示例数据的原始示例,可能不清楚这是一次、两次还是三次事务。我希望有某种事务标识符作为复合密钥的一部分。我不认为自动递增的数字会有帮助。在考虑添加代理键之前,您需要先确定有意义的键才能理解业务域。
https://stackoverflow.com/questions/58260638
复制相似问题