多个外键有意义吗?

3

一个表格有多个外键是否合理?

假设我有三个表格,Table ATable BTable C。如果我把这些表格看作对象(在我的代码中它们被映射为对象),那么Table A和Table B都与Table C有多对一的关系。也就是说,Table/object A和B都可以有多个C的实例。所以我设计的方式是,Table C指向了Table ATable B的主键:换句话说,Table C有2个外键(a_Id和b_Id)。

编辑:我忘了提到Table A也可以有许多Table B的实例。所以Table B有一个外键指向Table A。如果这有什么不同...

我想知道这样做是否合理,或者是否有更好的方法?谢谢。


表A和B也有一对多的关系吗? - Danny T.
是的,表A可以有多个表B的实例...抱歉我忘了强调。 - kim
5个回答

6
这很好,但请注意只有当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相关(但不能同时)。我想不出一个好的解决方案(只是假设在代码中我会检查两列并使用非空的那一列)。你的第二个观点是指这个吗? - kim
但是A与许多C相关联。例如,表A可以是一篇博客文章,表C是评论。因此,每篇博客文章可以有许多评论。 - kim
@kim:你的例子中B是什么? - Mark Byers
@kim:但一个评论不会与多个帖子相关联,因此在您的示例中,将FK添加到评论表中比以这种方式进行更简单。 - Stephen Fischer
@Sheep - 是的,这就是我在帖子中最初提出的建议:在评论表中有2个外键(一个指向A表(例如博客文章),另一个指向B表(只是另一个可以有多个评论的对象)... - kim
显示剩余3条评论

3
在你的场景中,如果一个第三个表引用了两个不同的表,这也是可以的。我的数据库中有一些具有3-4甚至更多外键的表。前提是实体始终需要所有引用存在。
许多对多关系也可以作为一个单独的表来实现,其中包含两个或多个外键,因此在这种情况下,它们也是有意义的。
请参见有关如何为PHP和MySQL实现此类关系的本文

假设实体需要所有引用存在,那么这就是提供的。如果缺少此要求,您会推荐什么? - kim
我会为每个不总是存在的列创建一个单独的表。 - Oded

3

如果您无法用其他方式表达A、B、C对象之间的关系,那么按照您的定义外键是完全有道理的。


2

没错,这非常常见。在表格中有多个外键指向其他表也是很正常的。


1

我认为这样做是可以的,但可能是因为我是这样做的。在我的情况下,我有一个充满人员的表格,以及一个充满这些人员可以担任的角色的表格。由于每个人可以担任任意数量的这些角色,使其正常工作的最简单方法是添加第三个跟踪这些关系的表格。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接