Tôi cho rằng bạn đang nói về các ràng buộc khóa ngoại được thực thi bởi cơ sở dữ liệu . Có thể bạn đã sử dụng khóa ngoại, chỉ là bạn chưa nói với cơ sở dữ liệu về nó.
Giả sử một lập trình viên đã thực sự làm điều này theo đúng cách, thì liệu chúng ta có thực sự cần khái niệm về khóa ngoại không?
Về mặt lý thuyết, không. Tuy nhiên, chưa bao giờ có một phần mềm nào không có lỗi.
Các lỗi trong mã ứng dụng thường không nguy hiểm - bạn xác định lỗi và sửa nó, sau đó ứng dụng chạy mượt mà trở lại. Nhưng nếu một lỗi cho phép dữ liệu bị gián đoạn xâm nhập vào cơ sở dữ liệu, thì bạn đang mắc kẹt với nó! Rất khó để khôi phục dữ liệu bị hỏng trong cơ sở dữ liệu.
Xem xét liệu một lỗi nhỏ trong FogBugz có cho phép ghi khóa ngoại bị hỏng trong cơ sở dữ liệu hay không. Có thể dễ dàng sửa lỗi và nhanh chóng đưa bản sửa lỗi cho khách hàng trong bản phát hành sửa lỗi. Tuy nhiên, làm thế nào để sửa dữ liệu bị hỏng trong hàng chục cơ sở dữ liệu? Mã đúng bây giờ có thể đột nhiên bị hỏng vì các giả định về tính toàn vẹn của khóa ngoại không còn giữ nữa.
Trong các ứng dụng web, bạn thường chỉ có một chương trình nói chuyện với cơ sở dữ liệu, vì vậy chỉ có một nơi mà lỗi có thể làm hỏng dữ liệu. Trong một ứng dụng doanh nghiệp có thể có một số ứng dụng độc lập nói chuyện với cùng một cơ sở dữ liệu (chưa kể những người làm việc trực tiếp với vỏ cơ sở dữ liệu). Không có cách nào để chắc chắn rằng tất cả các ứng dụng tuân theo cùng một giả định mà không có lỗi, luôn luôn và mãi mãi.
Nếu các ràng buộc được mã hóa trong cơ sở dữ liệu, thì điều tồi tệ nhất có thể xảy ra với lỗi là người dùng được hiển thị một thông báo lỗi xấu xí về một số ràng buộc SQL không được thỏa mãn. Điều này rất có lợi khi để dữ liệu bị gián đoạn vào cơ sở dữ liệu doanh nghiệp của bạn, nơi nó sẽ phá vỡ tất cả các ứng dụng của bạn hoặc chỉ dẫn đến tất cả các loại đầu ra sai hoặc sai lệch.
Ồ, và các ràng buộc khóa ngoại cũng cải thiện hiệu suất vì chúng được lập chỉ mục theo mặc định. Tôi không thể nghĩ ra bất kỳ lý do gì để không sử dụng các ràng buộc khóa ngoại.