如果我有两个具有多对多关系的对象,我通常会在我的数据库模式中对它们进行建模,并使用一个多对多的表来关联这两个对象。但是,多对多表(或“连接表”)是否应该有自己的主键(整数自动递增)?
例如,我可能有表A和B,每个表都有一个ID,还有一个名为A_B的表,它有一个外键元组(A_ID,B_ID)。但是A_B是否应该有自己的主键自动递增ID列呢?
添加它的优点和缺点是什么?我个人喜欢多对多连接的自然键。但是主键有什么额外的好处呢?
发布于 2010-12-22 06:07:06
我同意奥德所说的一切,除了
“它也不能合理地用作外键。”
在这种情况下,这是一个选择你的毒药,映射表绝对可以是一个父级,这只是一个子级使用或不使用多列FK的问题。
以汽车和颜色为例。每年,汽车制造商都有一定的颜色调色板,每种型号都只有有限数量的颜色。许多-许多::颜色到汽车模型
因此,现在设计用于存储新车订单的Order表。很明显,颜色和型号将出现在订单表中。如果对这些表中的每一个进行FK,数据库将允许选择不正确的型号/颜色组合。(当然,您可以通过代码强制执行此操作,但不能以声明方式执行此操作。)如果您将父表设置为make :many表,则只能获得已指定的组合。
那么,您是想要多列FK并指向同时构建在ModelID和ColorID上的PK,还是想要单列FK?
选择你的毒药。
编辑
但是,如果它不是某个对象的父级,那么任何表都不需要代理键。
发布于 2010-12-22 05:05:34
这样的代理键只会增加开销。
如果您关心此表中的重复,请使用自然键,使其成为复合主键。
要展开:
在应用程序中,此密钥将没有意义,并且将保持未使用状态。
在数据库中,它将没有任何功能,因为您不能在查询中合理地使用它来获得任何类型的有意义的结果。
它也不能合理地用作外键。
发布于 2020-08-17 23:23:58
如果跟踪多对多关系的表有自己的主键,并且该主键被用作数据库中其他任何地方的外键,那么您将在该关系上创建一个依赖项。这种关系永远不会被移除。
例如,在汽车颜色示例中,如果汽车的颜色曾经中断(从多对多关系表中移除),则引用主键的任何表(即购买历史)将被破坏。
https://stackoverflow.com/questions/4503853
复制相似问题