首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多对多的表应该有一个主键吗?

多对多的表应该有一个主键吗?
EN

Stack Overflow用户
提问于 2010-12-22 05:00:49
回答 6查看 17.2K关注 0票数 34

如果我有两个具有多对多关系的对象,我通常会在我的数据库模式中对它们进行建模,并使用一个多对多的表来关联这两个对象。但是,多对多表(或“连接表”)是否应该有自己的主键(整数自动递增)?

例如,我可能有表A和B,每个表都有一个ID,还有一个名为A_B的表,它有一个外键元组(A_ID,B_ID)。但是A_B是否应该有自己的主键自动递增ID列呢?

添加它的优点和缺点是什么?我个人喜欢多对多连接的自然键。但是主键有什么额外的好处呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-22 06:07:06

我同意奥德所说的一切,除了

“它也不能合理地用作外键。”

在这种情况下,这是一个选择你的毒药,映射表绝对可以是一个父级,这只是一个子级使用或不使用多列FK的问题。

以汽车和颜色为例。每年,汽车制造商都有一定的颜色调色板,每种型号都只有有限数量的颜色。许多-许多::颜色到汽车模型

因此,现在设计用于存储新车订单的Order表。很明显,颜色和型号将出现在订单表中。如果对这些表中的每一个进行FK,数据库将允许选择不正确的型号/颜色组合。(当然,您可以通过代码强制执行此操作,但不能以声明方式执行此操作。)如果您将父表设置为make :many表,则只能获得已指定的组合。

那么,您是想要多列FK并指向同时构建在ModelID和ColorID上的PK,还是想要单列FK?

选择你的毒药。

编辑

但是,如果它不是某个对象的父级,那么任何表都不需要代理键。

票数 22
EN

Stack Overflow用户

发布于 2010-12-22 05:05:34

这样的代理键只会增加开销。

如果您关心此表中的重复,请使用自然键,使其成为复合主键。

要展开:

在应用程序中,此密钥将没有意义,并且将保持未使用状态。

在数据库中,它将没有任何功能,因为您不能在查询中合理地使用它来获得任何类型的有意义的结果。

它也不能合理地用作外键。

票数 15
EN

Stack Overflow用户

发布于 2020-08-17 23:23:58

如果跟踪多对多关系的表有自己的主键,并且该主键被用作数据库中其他任何地方的外键,那么您将在该关系上创建一个依赖项。这种关系永远不会被移除。

例如,在汽车颜色示例中,如果汽车的颜色曾经中断(从多对多关系表中移除),则引用主键的任何表(即购买历史)将被破坏。

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

https://stackoverflow.com/questions/4503853

复制
相关文章

相似问题

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