【问题标题】:Do multiple foreign keys make sense?多个外键有意义吗?
【发布时间】:2010-02-10 19:55:18
【问题描述】:

一张表有多个外键有意义吗?

假设我有三个表,Table ATable BTable C。如果我将表视为对象(并且它们在我的代码中映射到对象),那么表 A 和 B 都与表 C 具有多对一的关系。即表/对象A和B都可以有很多C的实例。所以我设计的方式是Table C指向Table ATable B中的主键:换句话说,Table C有2个外键键(a_Id 和 b_Id)。

编辑:我也忘了提到Table A 可以有很多Table B 的实例。所以Table B 在表 A 中有一个外键。如果这有所作为...

我想知道这是否有意义或有更好的方法吗?谢谢。

【问题讨论】:

  • 表A和B也有一对多的关系吗?
  • 是的,表 A 可以有表 B 的多个实例...对不起,我忘了指出这一点

标签: sql mysql database-design foreign-keys


【解决方案1】:

这很好,但请注意,只有当 C 必须始终将 A 和 B 作为一对时才有意义。

如果您只是希望 A 有 C,B 有 C,但 A 和 B 在其他方面无关,那么您应该将外键放在 A 和 B 中,并允许它可以为空。

更新:经过澄清后,您似乎想要两个独立的关系:A 可以有很多 C,B 可以有很多 C,但 C 只能属于一个 A 或一个 B。

解决方案:这是两个独立的一对多关系,所以创建两个新表 A_C 和 B_C,并将外键放在那里。 A_C 包含 A 的外键和 C 的外键。对于 B_C 也是如此。

【讨论】:

  • 谢谢..我有点困惑。我理解您的第一点:任何给定的 C 实例都可以与 A 或 B 相关(不能同时与两者相关)。我想不出一个好的解决方案(只是假设在代码中我会检查两列并使用不为空的列)。这就是你第二点的意思吗?
  • 但是 A 与许多 C 相关。例如,表 A 可以是博客文章,表 C 是评论。所以每篇博文可以有很多个cmets。
  • @kim:你的例子中的 B 是什么?
  • @kim:但是一条评论不会与多个帖子相关联,因此在您的示例中,将 FK 添加到 cmets 表而不是这样做会更简单。跨度>
  • @Sheep - 是的,这就是我最初在帖子中提出的建议:在 cmets 表中有 2 个 FK(一个指向表 A(例如是一篇博客文章)),另一个指向到表 B(这只是另一个可以有许多 cmets 的对象......
【解决方案2】:

在您的场景中,第三个引用两个不同的表,这也很好。我的数据库中有 3-4 个甚至更多外键的表。前提是实体始终要求所有引用都存在。

多对多关系也被实现为具有两个(或更多)外键的单个表,所以是的,它们在这种情况下确实有意义。

请参阅this article,了解如何为 PHP 和 MySQL 实现这种关系。

【讨论】:

  • “前提是实体要求所有引用都存在” - 所以如果没有这个要求,你会推荐什么?
  • 我会为每个不总是存在的列创建一个单独的表。
【解决方案3】:

如果您无法以任何其他方式制定 A、B、C 对象之间的关系,那么像您所做的那样定义 FK 是非常有意义的。

【讨论】:

    【解决方案4】:

    是的,这完全有道理。拥有一个具有多个指向其他表的外键的表并不少见。

    【讨论】:

      【解决方案5】:

      我认为这样做是可以的,但也许是因为我这样做。就我而言,我有一桌人,一桌人可以扮演的角色。由于每个人都可以担任任意数量的这些角色,因此最简单的方法是添加第三个表来跟踪这些关系。

      这不是一个很好的解决方案,但它比每次出现新角色时都向表中添加一个新列并且每次都必须重写运行这些查询的代码要好。而且我肯定想不出更好的方法来处理它!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多