Giả sử chúng ta có một bảng có ràng buộc khóa ngoại đối với chính nó, như sau:
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
Bảng này sẽ có các hồ sơ sau:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
Có những trường hợp kiểu thiết kế này có thể có ý nghĩa (ví dụ như mối quan hệ "nhân viên và sếp-nhân viên" điển hình), và trong mọi trường hợp: Tôi đang ở trong tình huống tôi có điều này trong lược đồ của mình.
Kiểu thiết kế này không may cho phép tính tuần hoàn trong các bản ghi dữ liệu, như trong ví dụ trên.
Câu hỏi của tôi là:
- Có thể viết một ràng buộc kiểm tra điều này? và
- Có khả thi để viết một ràng buộc kiểm tra điều này? (nếu chỉ cần đến một độ sâu nhất định)
Đối với phần (2) của câu hỏi này có thể có liên quan để đề cập rằng tôi chỉ mong đợi hàng trăm hoặc có thể trong một số trường hợp hàng ngàn hồ sơ trong bảng của tôi, thông thường không được lồng sâu hơn khoảng 5 đến 10 cấp.
Tái bút Máy chủ MS SQL 2008
Cập nhật ngày 14 tháng 3 năm 2012
Có một số câu trả lời tốt. Bây giờ tôi đã chấp nhận một trong đó giúp tôi hiểu khả năng / tính khả thi được đề cập. Tuy nhiên, có một số câu trả lời tuyệt vời khác, một số có đề xuất thực hiện, vì vậy nếu bạn đến đây với cùng một câu hỏi, hãy xem tất cả các câu trả lời;)