多对多表应该有主键吗?

ash*_*999 28 database many-to-many database-agnostic

如果我有两个具有多对多关系的对象,我通常会在我的数据库模式中使用多对多表对它们进行建模,以将两者关联起来.但是,多对多表(或"连接表")是否有自己的主键(整数自动递增)?

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

添加它有什么优缺点?我个人喜欢用于多对多连接的自然键.但主要关键是增加了什么?

Ste*_*age 19

我同意Oded所说的一切,除了

"它也不能合理地用作外键."

在这种情况下,它是一个挑选你的毒药,映射表绝对可以是父母,这只是孩子使用多列FK的问题.

以简单的汽车和颜色为例.每年的汽车制造商都有一定的颜色托盘,每个型号只有有限数量的颜色.很多 - 很多::颜色到汽车模型

因此,现在设计订单表,其中存储新车订单.显然,Color和Model将在Order表上.如果对这些表中的每个表生成FK,则数据库将允许选择不正确的模型/颜色组合.(当然,您可以使用代码强制执行此操作,但不能以声明方式执行此操作.)如果您将父项设置为many:many表,则只能获得已指定的组合.

那你想要一个多列FK并指向建立在ModelID和ColorID上的PK,或者你想要一个列FK?

选择你的毒药.

编辑

但如果它不是某事物的父母,那么任何表都不需要代理键.


Ode*_*ded 11

除了开销之外,这样的代理键不会增加任何内容.

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

扩大:

在应用程序中,此密钥将毫无意义,并将保持未使用状态.

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

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