这是一个例子:最初我有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添加到联结表(但我删除了它)。我的设计有什么问题吗?或者有更正确的方法吗?
注: 黄色图标 - 主键 红色图标 - 不为空
答案 0 :(得分:1)
每个表应该只有一个主键,只有这个表。如果您希望表A中的第二列包含要查找的表B主键的值。如果需要,只需设置第二个索引即可获得性能
答案 1 :(得分:1)
最初我有3张桌子。
确定。
表B参考表A.现在 表B有两个主键。一个用过 作为原始主键和 另一个强制执行其关系 与Tabe A。
没有。表B有一个主键和一个外键。外键可能是主键的一部分,也可能不是。
然后我希望表B有一个 与表的多对多关系 X
确定。
当我添加关系时,MySQL Workbench为表Y添加了两个 表B主键和一个主键 表X中的关键。所以表Y现在有 三个主键。
多对多关系通常实现为包含两个外键作为其主键的表。在您的情况下,一个外键是表B的主键,另一个外键是表X的主键。表B的主键似乎包含两列。表格可能如下所示。
表Y实现了m:n关系,包含来自B和X的键。
如果您想要更好的答案,请编辑您的问题并为您的表包含SQL DDL。使用SHOW CREATE TABLE获取DDL。
答案 2 :(得分:0)
您不能拥有多个主键。你有什么可能是索引。如果您的主键中包含表user_id
中的posts
列,则可以将其取出并保留仅由id
列组成的主键。
我希望这会有所帮助
答案 3 :(得分:0)
从您编辑的帖子中 - 正确执行此操作的唯一方法是使用另一个表来保存多对多关系。 Sniipit& snippit_topic有单个主键,这个新表有两列每个主键