多个外键列都指向同一父表——是个好主意吗?

3

对于那些熟悉数据库设计的人,你们是否曾经发现在一个表中有多个FK指向同一个父表是有充分理由的吗?

最近我们遇到这样一种情况,我们的一个表包含了六列,这六列都是指向同一个父表的FK列。我们正在讨论这是否表明我们的设计存在问题,或者这比我们想象的更为常见。

非常感谢。

8个回答

6
这很大程度上取决于情况。有时需要这样做,而其他时候则需要重新设计。首先想到的一个好用途是网站消息系统,其中“user_to”和“user_from”字段都将指向“users”表中的“user_id”。
但是对于6个指针,我认为需要重新设计,但如果不知道具体情况,则无法确定。

+1,基本上我的想法也是这样的。在本身上,将多个字段FK到同一张表中是可以的。但你有六个这样的字段让我觉得可能有一些空间可以添加另一个表来更好地管理至少一个逻辑关系,并且让你删除一些FK字段,这些字段实际上只是相同事物的多个实例(可能还需要一个序列号等额外信息)。 - heisenberg

4

这个问题不能在没有看到具体需求的情况下进行分析。主要是要确定这6个数据是否相关。

如果像这样设置列集:Item1,Item2,Item3,那么显然是错误的(应该使用连接表),但是如果每个列的含义彼此无关,那么即使看起来有点奇怪,也是可以的。


3

好的,可以有以下列的IMO表:

Owner(所有者),CreatedBy(创建者),LastModifiedBy(最后修改者),AcceptedBy(接受者),ProposedBy(提议者),它们都可以指向一个用户表。


1
我的想法完全一样。这种情况非常普遍。这里没有问题。 - leonbloy

1

当主键是人员表并且我们需要在同一张表中存储有关两种不同类型人员的详细信息时,我们偶尔会这样做。如果这六列是确实不同的信息(而且不太可能扩展到七列),那么这样做可能是可以的,但如果超过两个以上,我会考虑是否需要一个相关的表。


0
我无法想象为什么您需要6个指向同一父记录的字段...听起来像是您的想法有些混乱。您说“我们这边设计不好”,是您的公司以这种方式设计了表格吗?

不是同一个父记录...我相信他们的意思是这些列将引用同一个父表中的不同记录。 - Dave Costa

0

我有两个表之间多个外键的一些例子。

无论在你的情况下是否正确,我们可能需要更多的信息才能确定。

一个常见的例子:

假设我有一个带有关键字stuffID的表。我可能有一个子表,其中包含stuffID1、stuffID2来捕获成对的数据。或者三元组,有3个FK列。


0
拥有一个在线商店数据库,应该有一个包含地址的表和一个包含订单的表 - 现在在订单中有两个fk指向地址表,一个包含运输地址,另一个包含账单地址的键。

0

人员表 {人员ID 其他人员属性 ...} 人际关系表 {人员ID1 人员ID2 关系类型}

在这种情况下,拥有两个不同的外键指向相同的父表非常自然。


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