【问题标题】:Should junction tables have more than one primary keys from another identifying table?联结表是否应该具有来自另一个标识表的多个主键?
【发布时间】:2020-02-24 00:01:31
【问题描述】:

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

似乎不需要联结表中表 B 中的第二个主键,因为我可以用原始主键识别表 B。那么我还需要额外的主键吗?或者我不应该在表 A 和 B 之间建立识别关系?

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

编辑

这是场景(下面的图表链接)。我关注的表是 sn-p、sn-p_topic 和 tag。据我所知,由于每个 sn-p 都必须属于一个 sn-p_topic,因此它具有标识关系。所以我在 MySQL Workbench 中使用了标识关系,他们添加了 sn-p_topic ID 作为主键。之后,我为 tag 和 sn-p 添加了 m:n 关系。 MySQL Workbench 将 sn-p_topic ID 添加到联结表(但我将其删除)。我的设计有什么问题吗?还是有更正确的方法?

图例: 黄色图标 - 主键 红色图标 - 不为空

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 引用列应该是主键吗? MySQL Workbench 允许我检查多个列作为 PK,应该发生吗?
    • 一个主键可以由一个单列或多列组成,但是当使用多列时,主键实际上是所有这些列的组合,而不是单独的主键。一个表只能有一个主键(单个或组合列),但可以有尽可能多的额外索引列(单个或组合)
    【解决方案2】:

    最初我有 3 张桌子。

    好的。

    表 B 引用表 A。所以现在 表 B 有两个主键。一个用过 作为原始主键和 另一个来执行它的关系 与 Tabe A.

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

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

    好的。

    当我添加关系时,MySQL 工作台添加了表 Y 与两者 表 B 主键和一个主键 输入表 X。所以表 Y 现在有了 三个主键。

    多对多关系通常实现为包含两个外键作为主键的表。在您的情况下,一个外键是表 B 的主键,另一个外键是表 X 的主键。表 B 的主键似乎包含两列。这些表可能看起来像这样。

    • 表 A:{a1, a2}
    • 表 B:{b1、a1、b2、b3}, a1 引用表 A
    • 表 X:{x1, x2}

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

    • 表 Y:{b1, a1, x1},两列 b1,一个1参考表B; x1 列引用表 X

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

    【讨论】:

      【解决方案3】:

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

      希望对你有帮助

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 2016-06-06
          • 1970-01-01
          • 2010-10-24
          相关资源
          最近更新 更多