联结表是否应该有来自另一个识别表的多个主键?

时间:2011-07-03 07:10:40

标签: mysql database database-design many-to-many relational-database

这是一个例子:最初我有3张桌子。表B引用表A.所以现在表B有两个主键。一个用作原始主键,另一个用于强制它与Tabe A的关系。然后我希望表B与表X具有多对多关系。当我添加关系时,MySQL Workbench添加了表Y表X中包含表B主键和一个主键。因此,表Y现在有三个主键。

似乎连接表中表B中的第二个主键是不必要的,因为我可以用原始主键识别表B.那么我还需要额外的主键吗?或者我可能不应该在表A和B之间有一个明确的关系?

表A和B的关系类似于User有很多Post。帖子必须属于用户。但是Post已经拥有了自己的主键,那么用户的外键是否需要成为主键?

修改

这是场景(下面的图表链接)。我关注的表格是片段,snippet_topic和标签。据我所知,由于每个片段都必须属于snippet_topic,因此它具有识别关系。所以我在MySQL Workbench中使用了识别关系,并将snippet_topic ID添加为主键。之后我为标签和片段添加了m:n关系。 MySQL Workbench将snippet_topic ID添加到联结表(但我删除了它)。我的设计有什么问题吗?或者有更正确的方法吗?

注: 黄色图标 - 主键 红色图标 - 不为空 Workbench EER Diagram

4 个答案:

答案 0 :(得分:1)

每个表应该只有一个主键,只有这个表。如果您希望表A中的第二列包含要查找的表B主键的值。如果需要,只需设置第二个索引即可获得性能

答案 1 :(得分:1)

  

最初我有3张桌子。

确定。

  

表B参考表A.现在   表B有两个主键。一个用过   作为原始主键和   另一个强制执行其关系   与Tabe A。

没有。表B有一个主键和一个外键。外键可能是主键的一部分,也可能不是。

  

然后我希望表B有一个   与表的多对多关系   X

确定。

  

当我添加关系时,MySQL   Workbench为表Y添加了两个   表B主键和一个主键   表X中的关键。所以表Y现在有   三个主键。

多对多关系通常实现为包含两个外键作为其主键的表。在您的情况下,一个外键是表B的主键,另一个外键是表X的主键。表B的主键似乎包含两列。表格可能如下所示。

  • 表A:{ a 1 2 }
  • 表B:{ b 1 1 ,b 2 ,b 3 < / sub>}, 1 引用表A
  • 表X:{ x 1 ,x 2 }

表Y实现了m:n关系,包含来自B和X的键。

  • 表Y:{ b 1 1 ,x 1 },两列b < sub> 1 , 1 参考表B;列x 1 引用表X

如果您想要更好的答案,请编辑您的问题并为您的表包含SQL DDL。使用SHOW CREATE TABLE获取DDL。

答案 2 :(得分:0)

您不能拥有多个主键。你有什么可能是索引。如果您的主键中包含表user_id中的posts列,则可以将其取出并保留仅由id列组成的主键。

我希望这会有所帮助

答案 3 :(得分:0)

从您编辑的帖子中 - 正确执行此操作的唯一方法是使用另一个表来保存多对多关系。 Sniipit&amp; snippit_topic有单个主键,这个新表有两列每个主键