2013-03-25 121 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)兄弟姐妹的情況是一樣的。

如果以某種方式控制這種設計並理解其含義,我會很好地使用該設計。