2012-11-11 24 views
5

Tôi đã đi qua một cơ sở dữ liệu di sản và tìm thấy một vài khóa nước ngoài tham chiếu một cột cho chính nó. Cột được tham chiếu là cột khóa chính.Ý nghĩa của việc tự tham chiếu khóa ngoại là gì?

ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD 
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id]) 
REFERENCES [SchemaName].[TableName] ([Id]) 

Ý nghĩa của nó là gì?

Trả lời

14
ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD 
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id]) 
REFERENCES [SchemaName].[TableName] ([Id]) 

Khóa ngoại này hoàn toàn dư thừa và vô nghĩa chỉ cần xóa nó. Nó không bao giờ có thể bị vi phạm vì một hàng khớp với chính nó để xác nhận ràng buộc.

Trong một bảng phân cấp các mối quan hệ sẽ là giữa hai cột khác nhau (ví dụ IdParentId)

Đối với lý do tại sao nó có thể đã được tạo ra khá nhiều khả năng thông qua việc sử dụng thiết kế trực quan nếu bạn kích chuột phải vào "Keys" nút trong đối tượng thám hiểm và chọn "New Foreign Key" sau đó đóng hộp thoại mà không xóa khóa nước ngoài tạo ra và sau đó thực hiện một số thay đổi khác trong thiết kế bảng mở và lưu nó sẽ tạo ra loại hạn chế dư thừa.

+1

Tôi nghĩ vậy. Tôi ngạc nhiên rằng nó thậm chí còn có thể. – HuBeZa

-7

Trong một số trường hợp, đây là cách ưu tiên để giảm dự phòng trong mô hình của bạn. Khi sử dụng khóa ngoại tự tham chiếu (như trong ví dụ của bạn), bạn tạo một mối quan hệ phân cấp giữa các hàng trong bảng của bạn. Hãy chú ý đến những gì sẽ xảy ra khi bạn xóa một hàng khỏi bảng, tầng trên xóa có thể xóa các hàng bạn vẫn muốn. Sử dụng các loại khóa này di chuyển một số xác thực dữ liệu sang mô hình DB trái ngược với việc thực hiện trách nhiệm này của chương trình/lập trình viên. Một số trang phục thích cách làm việc này. Tôi muốn đảm bảo rằng các chương trình và lập trình viên có trách nhiệm - các mô hình dữ liệu có thể khó tái cấu trúc và nâng cấp trong môi trường sản xuất.

+7

Tham chiếu nằm giữa cùng một cột. Điều đó khó có thể hoạt động như một mối quan hệ phân cấp. –