多个外键有意义吗?

时间:2010-02-10 19:55:19

标签: sql mysql database-design foreign-keys

一个表有多个外键是否有意义?

假设我有三个表,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中有一个外键。如果这有所不同......

我想知道这是否有意义还是有更好的方法呢?感谢。

5 个答案:

答案 0 :(得分: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。

答案 1 :(得分:3)

在你的场景中,由第三个引用的两个不同的表,这也没关系。我的数据库中有表有3-4个甚至更多的外键。这提供了实体始终要求存在所有引用。

许多关系也被实现为具有两个(或更多)外键的单个表,所以是的,它们在该上下文中确实有意义。

请参阅this article关于为PHP和MySQL实现这种关系。

答案 2 :(得分:3)

如果你不能以任何其他方式表达A,B,C对象之间的关系,那么像你一样定义FK是完全合理的。

答案 3 :(得分:2)

是的,这很有道理。拥有一个包含多个外键到其他表的表并不常见。

答案 4 :(得分:1)

我认为这样做是可以的,但也许那是因为我这样做。就我而言,我有一张满是人的桌子,还有一张桌子,上面写着人们可以完成的角色。由于每个人都可以使用任意数量的角色,因此最简单的方法就是添加第三个跟踪这些关系的表格。

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