Sql 多个外键有意义吗?

Sql 多个外键有意义吗?,sql,mysql,database-design,foreign-keys,Sql,Mysql,Database Design,Foreign Keys,一个表有多个外键有意义吗 假设我有三个表,表A,表B和表C。如果我将表视为对象(它们映射到代码中的对象),那么表A和B都与表C有一个多对一的关系。也就是说,表/对象A和B都可以有许多C的实例。所以我设计它的方式是表C指向表A和表B中的主键:换句话说,表C有两个外键(A_Id和B_Id) 编辑:我还忘了提到表A可以有许多表B的实例。所以表B在表a中有一个外键。如果这有区别 我想知道这是否有意义,或者有没有更好的方法?谢谢。在您的场景中,第三个表引用了两个不同的表,这也很好。我的数据库中有3-4个甚

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

假设我有三个表,
表A
表B
表C
。如果我将表视为对象(它们映射到代码中的对象),那么表A和B都与表C有一个多对一的关系。也就是说,表/对象A和B都可以有许多C的实例。所以我设计它的方式是
表C
指向
表A
表B
中的主键:换句话说,
表C
有两个外键(A_Id和B_Id)

编辑:我还忘了提到
表A
可以有许多
表B
的实例。所以
表B
在表a中有一个外键。如果这有区别


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

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

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


请参阅关于为PHP和MySQL实现这种关系的内容。

这很好,但请注意,只有当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类似。

是的,这非常有意义。在一个表中有多个外键指向其他表并不少见

如果你不能以任何其他方式表达A、B、C对象之间的关系,那么像你那样定义FK是非常有意义的。

我认为这样做是可以的,但可能是因为我这样做。在我的例子中,我有一张满是人的桌子,还有一张满是这些人可以扮演的角色的桌子。因为每个人都可以扮演任意数量的角色,所以让它工作的最简单方法是添加第三个表来跟踪这些关系


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

表A和表B也有一对多的关系吗?是的,表A可以有表B的多个实例…对不起,我忘了指出这一点谢谢..我有点困惑。我理解你的第一点:任何给定的C实例都可以与A或B(不是两者)相关。我想不出一个好的解决方案(只是假设在代码中我会检查两列,并使用一个非空的)。这就是你第二点的意思吗?但是A和很多C有关。例如,表A可以是博客文章,表C是评论。因此,每个博客帖子都可以有许多评论。@kim:在你的例子中,B是什么?@kim:但是一条评论不会与多条帖子关联,因此在你的例子中,将FK添加到评论表而不是这样做会更简单。@Sheep-是的,这就是我在我的帖子中最初建议的:在评论表中添加两个FK(一个指向表A(例如博客帖子),另一个指向表B(这只是另一个可以有许多注释的对象…“前提是实体要求所有引用都存在”-如果没有这个要求,你会推荐什么?我会为并不总是存在的每一列创建一个单独的表。