多对多关系的联结表是否应具有代理主键?
问题描述:
我正在使用mySQL和Laravel。 我有两个表:用户和组。每个都有一个id字段和一个名称字段。 我希望用户能够属于多个组,反之亦然;所以我正在与一个联结表建立多对多的关系:group_user。多对多关系的联结表是否应具有代理主键?
我的第一个想法是它只需要两个字段:user_id和group_id,都是外键。 但是,有些东西告诉我,我也可能需要/希望为此表添加一个ID。我已经在互联网上的代码示例中看到了这两种方式,我只是想知道没有它会丢失什么。
我只是想不出我会如何使用它;因为表格只是关联另外两个表格。
答
人工主键有时候在你的代码中非常有用。例如,当您想要删除记录时,可以使用与其他表格相同的模式。 您必须仅传递一个id而不是复合键的部分。
简短的回答 - 是的,你想在那里的PK。如果你没有自己指定一个,InnoDB(假设你使用InnoDB)会创建一个隐藏的6字节整数PK(你将无法访问)。为什么你想要一个PK有很多原因,他们通常不是应该如何做,而是如何在现实世界中运作。 –
简短的回答 - 没有。它必须有一个PK。它不需要代理。但是,如果您确实使用代理,那么最佳实践建议一起形成自然(UNIQUE)密钥。就我个人而言,如果您需要在其他一些环境中参考该链接,我认为代理只有真正有用。如果您愿意,我可以举一个简短的例子 - 但在这里评论的时间可能太长。 – Strawberry
我希望每个用户/组对都是唯一的。复合键本质上也是独一无二的?我这么认为,但不确定。将它作为主键有意义吗?它们将被user_id或者group_id查询......所以这些应该以某种方式被索引,对吧? – Zuko