2013-03-25 59 views
0

我正在考虑将关系表添加到数据库,我想通过使用指向同一个表中的PK的FK来包含一种反向关系功能。例如,说我有以下关系表:SQL Server FK同一张表

ID (PK) Relation  ReverseID (FK) 
1   Parent  2 
2   Child   1 
3   Grandparent 4 
4   Grandchild 3 
5   Sibling  5 

首先,这甚至可能吗?其次,这是一个好办法吗?如果不是,你有什么建议?

+1

是的,可以用FK关系引用同一个表。 – Todd 2013-03-25 21:48:25

+2

这称为[“自引用外键”](http://technet.microsoft.com/en-us/library/ms189049.aspx)。是的,这是可能的,为什么使用它的一些原因[已经讨论过](http://stackoverflow.com/questions/246477/should-you-make-a-self-referencing-table-column-a-foreign-键)。 – Pondlife 2013-03-25 21:49:39

+0

那么是否有可能将记录指向自己呢? (即兄弟姐妹,配偶等) – 2013-03-25 21:54:08

回答

2

1)这是可能的。

2)在你的情况下,你可能不想要这样做 - 你有循环,而不是非循环结构 - 因为如果你的FK就位,你不能插入任何这些行,因为它们是。一种可能性是,在表DDL的ReverseID列中允许NULL之后,必须使用NULL ReverseID插入所有行,然后执行UPDATE以设置ReverseID列,该列现在将引用有效的行。另一种可能是禁用外键,或者直到数据处于完全有效的状态然后再应用它才创建它。

3)您几乎每次都必须执行这样的操作,如果每个关系都有相反的结果,您或者无法在模式中强制执行NOT NULL,或者您经常会禁用并重新启用限制。

4)兄弟姐妹的情况是一样的。

如果以某种方式控制这种设计并理解其含义,我会很好地使用该设计。