多对多关系的联结表是不是应该具有代理主键?

Posted

技术标签:

【中文标题】多对多关系的联结表是不是应该具有代理主键?【英文标题】:Should a junction table for a many-to-many relationship have a surrogate primary key?多对多关系的联结表是否应该具有代理主键? 【发布时间】:2014-05-15 10:18:03 【问题描述】:

我正在使用 mysql 和 Laravel。 我有两个表:用户和组。每个都有一个 id 字段和一个 name 字段。 我希望用户能够属于许多组,反之亦然;所以我正在与联结表建立多对多关系:group_user。

我的第一个想法是它只需要两个字段:user_id 和 group_id,都是外键。 但是有些事情告诉我,我可能也需要/想要这张桌子的 id。我已经在互联网上的代码示例中看到了这两种方式,我只是想知道如果没有它我会错过什么。

我只是想不出我将如何实际使用它;因为该表只是为了关联另外两个表。

【问题讨论】:

简短回答 - 是的,你想要那里的 PK。如果您不自己指定一个,InnoDB(假设您使用 InnoDB)将创建一个隐藏的 6 字节整数 PK(您将无权访问)。您想要 PK 的原因有很多,而且它们通常与事情的执行方式无关,而是与它们在现实世界中的运作方式有关。 简短回答 - 不。它必须有一个PK。它不必是代理。但是,如果您确实使用了代理,那么最佳实践建议在旁边形成一个自然(唯一)键。就个人而言,我认为代理只有在您需要在其他上下文中引用该链接时才真正有用。如果您愿意,我可以举一个简短的例子 - 但可能太长,无法在这里发表评论。 我希望每个用户/组对都是唯一的。复合键本身是否也强制执行唯一性?我想是的,但不确定。将其设为主键是否有意义?它们将被 user_id 或 group_id 查询......所以应该以某种方式对它们进行索引,对吧? 【参考方案1】:

人工主键有时在您的代码中非常有用。例如,当您想删除一条记录时,您可以使用与其他表相同的模式。 您只需传递一个 id 而不是复合键的部分。

【讨论】:

以上是关于多对多关系的联结表是不是应该具有代理主键?的主要内容,如果未能解决你的问题,请参考以下文章

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

通过联结表进行多对多自连接

数据库优先方法中与联结表的多对多关系

如何在实体关系图中表示联结表?

Laravel - 播种多对多关系

多个多对多关系(循环关系)