一个表有多个外键是否有意义?
假设我有三个表,Table A
,Table B
和Table C
。如果我将表视为对象(并且它们映射到我的代码中的对象),则表A和表B与表C具有多对一关系。表/对象A和B每个都可以有很多C实例。所以我设计它的方式是Table C
指向Table A
和Table B
中的主键:换句话说, Table C
有2个外键(a_Id和b_Id)。
修改:我忘了提及Table A
可以有多个Table B
的实例。所以Table B
在表A中有一个外键。如果这有所不同......
我想知道这是否有意义还是有更好的方法呢?感谢。
答案 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)
我认为这样做是可以的,但也许那是因为我这样做。就我而言,我有一张满是人的桌子,还有一张桌子,上面写着人们可以完成的角色。由于每个人都可以使用任意数量的角色,因此最简单的方法就是添加第三个跟踪这些关系的表格。
这不是一个很好的解决方案,但它比每次出现新角色时向表中添加新列更好,并且每次都必须重写运行这些查询的代码。我肯定想不出更好的办法来处理它!