Misalkan kita memiliki tabel yang memiliki batasan kunci asing untuk dirinya sendiri, seperti:
CREATE TABLE Foo
(FooId BIGINT PRIMARY KEY,
ParentFooId BIGINT,
FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) )
INSERT INTO Foo (FooId, ParentFooId)
VALUES (1, NULL), (2, 1), (3, 2)
UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1
Tabel ini akan memiliki catatan berikut:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
Ada kasus-kasus di mana desain semacam ini bisa masuk akal (misalnya hubungan "karyawan-dan-bos-karyawan" yang khas), dan dalam kasus apa pun: Saya berada dalam situasi di mana saya memiliki ini dalam skema saya.
Sayangnya, jenis desain ini memungkinkan untuk melingkar dalam catatan data, seperti ditunjukkan pada contoh di atas.
Pertanyaan saya kemudian adalah:
- Apakah mungkin untuk menulis batasan yang memeriksa ini? dan
- Apakah layak untuk menulis batasan yang memeriksa ini? (jika hanya perlu sampai kedalaman tertentu)
Untuk bagian (2) dari pertanyaan ini, mungkin relevan untuk menyebutkan bahwa saya mengharapkan hanya ratusan atau mungkin dalam beberapa kasus ribuan catatan dalam tabel saya, biasanya tidak bersarang lebih dalam dari level sekitar 5 hingga 10.
PS. MS SQL Server 2008
Pembaruan 14 Maret 2012
Ada beberapa jawaban bagus. Saya sekarang telah menerima salah satu yang membantu saya memahami kemungkinan / kelayakan yang disebutkan. Ada beberapa jawaban hebat lainnya, beberapa dengan saran implementasi juga, jadi jika Anda mendarat di sini dengan pertanyaan yang sama, lihat semua jawaban;)