【问题标题】: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 查询......所以应该以某种方式对它们进行索引,对吧?

标签: php mysql laravel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多