Khi tôi xem xét các mô hình cơ sở dữ liệu cho RDBMS, tôi thường ngạc nhiên khi thấy ít hoặc không có ràng buộc nào (dành PK / FK). Ví dụ, phần trăm thường được lưu trữ trong một cột loại int
(trong khi tinyint
sẽ phù hợp hơn) và không có CHECK
ràng buộc nào để giới hạn giá trị trong phạm vi 0..100. Tương tự như vậy trên SE.SE, các câu trả lời gợi ý các ràng buộc kiểm tra thường nhận được các bình luận cho thấy rằng cơ sở dữ liệu là vị trí sai cho các ràng buộc.
Khi tôi hỏi về quyết định không thực hiện các ràng buộc, các thành viên trong nhóm trả lời:
Hoặc là họ thậm chí không biết rằng các tính năng như vậy tồn tại trong cơ sở dữ liệu yêu thích của họ. Có thể hiểu được từ các lập trình viên chỉ sử dụng ORM, nhưng ít hơn nhiều từ các DBA, những người tuyên bố có hơn 5 năm kinh nghiệm với một RDBMS nhất định.
Hoặc họ thực thi các ràng buộc như vậy ở cấp ứng dụng và sao chép các quy tắc đó trong cơ sở dữ liệu không phải là ý tưởng hay, vi phạm SSOT.
Gần đây, tôi thấy ngày càng nhiều dự án mà thậm chí không sử dụng khóa ngoại. Tương tự, tôi đã thấy một vài bình luận ở đây trên SE.SE cho thấy rằng người dùng không quan tâm nhiều đến tính toàn vẹn tham chiếu, hãy để ứng dụng xử lý nó.
Khi hỏi các đội về lựa chọn không sử dụng FK, họ nói rằng:
Chẳng hạn, đó là PITA khi người ta phải loại bỏ một phần tử được tham chiếu trong các bảng khác.
Đá NoQuery, và không có khóa ngoại ở đó. Do đó, chúng tôi không cần chúng trong RDBMS.
Đó không phải là vấn đề lớn về hiệu năng (bối cảnh thường là các ứng dụng web mạng nội bộ nhỏ hoạt động trên các tập dữ liệu nhỏ, do đó, ngay cả các chỉ mục cũng không quan trọng lắm; không ai quan tâm nếu hiệu suất của một truy vấn nhất định vượt qua từ 1,5 giây đến 20 ms.)
Khi tôi nhìn vào ứng dụng, tôi nhận thấy một cách có hệ thống hai mẫu:
Ứng dụng vệ sinh dữ liệu đúng cách và kiểm tra nó trước khi gửi đến cơ sở dữ liệu. Chẳng hạn, không có cách nào để lưu trữ một giá trị
102
dưới dạng phần trăm thông qua ứng dụng.Ứng dụng giả định rằng tất cả dữ liệu từ cơ sở dữ liệu là hoàn toàn hợp lệ. Đó là, nếu
102
đến như một tỷ lệ phần trăm, một cái gì đó, một nơi nào đó sẽ sụp đổ, hoặc nó sẽ chỉ đơn giản được hiển thị như là cho người dùng, dẫn đến tình huống kỳ lạ.Mặc dù hơn 99% các truy vấn được thực hiện bởi một ứng dụng, theo thời gian, các tập lệnh bắt đầu xuất hiện một trong hai tập lệnh được chạy bằng tay khi cần hoặc các công việc định kỳ. Một số thao tác dữ liệu cũng được thực hiện bằng tay trên chính cơ sở dữ liệu. Cả tập lệnh và truy vấn SQL thủ công đều có rủi ro cao khi đưa ra các giá trị không hợp lệ.
Và đây là câu hỏi của tôi:
Các lý do để mô hình hóa cơ sở dữ liệu quan hệ mà không có ràng buộc kiểm tra và cuối cùng thậm chí không có khóa ngoại?
Đối với những gì nó có giá trị, câu hỏi này và câu trả lời tôi nhận được (đặc biệt là cuộc thảo luận thú vị với Thomas Kilian) đã khiến tôi viết một bài báo với kết luận của tôi về chủ đề hạn chế cơ sở dữ liệu .