首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多到多关系中的重复主键

多到多关系中的重复主键
EN

Stack Overflow用户
提问于 2019-10-06 19:38:30
回答 3查看 1K关注 0票数 1

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

tArticle:

代码语言:javascript
运行
复制
kArticle | title | stock
---------+-------+------
1        | Water | 39
2        | Apple | 14

tCustomer:

代码语言:javascript
运行
复制
kCustomer | surname | firstName
----------+---------+----------
1         | Muller  | Max
2         | Meier   | Tom

tCustomer_tArticle:

代码语言:javascript
运行
复制
kCustomer | kArticle | number
----------+----------+---------
1         | 2        | 2
2         | 2        | 5
2         | 2        | 3

我知道强烈建议您使用组合外键作为主键。但是因为同一个客户可以买两次相同的商品,这将不再是唯一的了。

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

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

EN

回答 3

Stack Overflow用户

发布于 2019-10-06 19:48:23

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

你所说的“拥有独特记录的物理秩序”是什么意思?

在您的例子中,我建议添加一个AUTO_INCREMENT PK,例如:

代码语言:javascript
运行
复制
order_id PRIMARY KEY AUTO_INCREMENT

我的理由是:当你去麦当劳的时候,你会得到一张收据,上面写着订货单。当你再次购买食物时,你会在一张新的收据上得到一个不同的订单id。因此,属性order_id使每个顺序都是唯一的。

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

据我所知,没有。我假设您想要您的E模型反映多少次(或者一个客户可以购买同一件商品不止一次),如果是这样,您可以这样想:

tCustomer_tArticle(order_id,kCustomer,kArticle,number)能反映这一特性吗?是。我们可以:

代码语言:javascript
运行
复制
SELECT order_id,kCustomer,kArticle,number FROM tCustomer_tArticle WHERE kCustomer="Tom";

这将使我们得到汤姆下了多少订单的结果。

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

票数 1
EN

Stack Overflow用户

发布于 2019-10-06 19:49:05

我不知道在哪里“强烈推荐”两个外键作为主键。在适当的情况下,这绝对是一种方法。我更喜欢为表分配唯一的自动递增键的方法,除非空间开销是一个大问题。自动递增键提供:

对插入顺序的deletes.

  • A记录和update的每一行的唯一引用。

  • 表中声明简单外键的可能性。

本质上,您的表是一个事务表。我不仅会推荐一个自动递增的密钥,还会推荐一个事务日期/时间以及其他信息。

关于这一评论:

或者我应该使用物理顺序来拥有唯一的记录。

SQL表表示无序集。没有物理顺序,您应该看到一个有用的访问行。如果您关心插入顺序,那么您确实需要一个自动递增的键.

票数 1
EN

Stack Overflow用户

发布于 2019-10-07 05:34:28

考虑一下您试图在tCustomer_tArticle表中表示的信息。例如,在以下情况下:

代码语言:javascript
运行
复制
kCustomer | kArticle | number
----------+----------+---------
2         | 2        | 3
2         | 2        | 3

这仅仅意味着汤姆买了6个苹果,还是意味着三个苹果各有两个交易?如果表应该是数量的记录,那么您可以让kCustomer、kArticle键并用一行记录相同的信息:

代码语言:javascript
运行
复制
kCustomer | kArticle | number
----------+----------+---------
2         | 2        | 6

如果表应该记录单个事务,那么表中似乎缺少信息。考虑到有三行示例数据的原始示例,可能不清楚这是一次、两次还是三次事务。我希望有某种事务标识符作为复合密钥的一部分。我不认为自动递增的数字会有帮助。在考虑添加代理键之前,您需要先确定有意义的键才能理解业务域。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58260638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档