Theo kinh nghiệm của tôi, nhiều dự án tôi đã đọc trong quá khứ không có định nghĩa mối quan hệ trong cơ sở dữ liệu, thay vào đó họ chỉ định nghĩa chúng trong mã nguồn. Vì vậy, tôi tự hỏi những lợi thế / bất lợi của việc xác định mối quan hệ giữa các bảng trong cơ sở dữ liệu và trong mã nguồn là gì? Và câu hỏi rộng hơn là về các tính năng nâng cao khác trong cơ sở dữ liệu hiện đại như tầng, trình kích hoạt, quy trình ... Có một số điểm trong suy nghĩ của tôi:
Trong cơ sở dữ liệu:
Dữ liệu chính xác từ thiết kế. Ngăn chặn các lỗi ứng dụng có thể gây ra dữ liệu không hợp lệ.
Giảm chuyến đi khứ hồi mạng cho ứng dụng khi chèn / cập nhật dữ liệu vì ứng dụng phải tạo thêm truy vấn để kiểm tra tính toàn vẹn dữ liệu.
Trong mã nguồn:
Linh hoạt hơn.
Tốt hơn khi nhân rộng ra nhiều cơ sở dữ liệu, vì đôi khi mối quan hệ có thể là cơ sở dữ liệu chéo.
Kiểm soát nhiều hơn về tính toàn vẹn dữ liệu. Cơ sở dữ liệu không phải kiểm tra mỗi khi ứng dụng sửa đổi dữ liệu (độ phức tạp có thể là O (n) hoặc O (n log n) (?)). Thay vào đó, nó được ủy quyền cho ứng dụng. Và tôi nghĩ rằng việc xử lý tính toàn vẹn dữ liệu trong ứng dụng sẽ dẫn đến nhiều thông báo lỗi dài hơn so với sử dụng cơ sở dữ liệu. Ví dụ: khi bạn tạo một máy chủ API, nếu bạn xác định các mối quan hệ trong cơ sở dữ liệu và có lỗi xảy ra (như thực thể được tham chiếu không tồn tại), bạn sẽ nhận được một Ngoại lệ SQL với một thông báo. Cách đơn giản sẽ là trả lại 500 cho khách hàng rằng có "lỗi máy chủ nội bộ" và khách hàng sẽ không biết chuyện gì đang xảy ra. Hoặc máy chủ có thể phân tích thông điệp để tìm ra những gì sai, đó là một cách xấu, dễ bị lỗi theo ý kiến của tôi. Nếu bạn để ứng dụng xử lý việc này,
Có gì khác?
Chỉnh sửa: như Kilian chỉ ra, quan điểm của tôi về hiệu suất và tính toàn vẹn dữ liệu là rất sai lầm. Vì vậy, tôi chỉnh sửa để sửa quan điểm của tôi ở đó. Tôi hoàn toàn hiểu rằng để cho cơ sở dữ liệu xử lý nó sẽ là một cách tiếp cận hiệu quả và mạnh mẽ hơn. Vui lòng kiểm tra câu hỏi cập nhật và đưa ra một số suy nghĩ về nó.
Chỉnh sửa: cảm ơn mọi người. Các câu trả lời tôi nhận được đều chỉ ra rằng các ràng buộc / quan hệ phải được xác định trong cơ sở dữ liệu. :). Tôi có thêm một câu hỏi, vì nó nằm ngoài phạm vi của câu hỏi này, tôi vừa đăng nó dưới dạng một câu hỏi riêng biệt: Xử lý lỗi cơ sở dữ liệu cho máy chủ API . Xin hãy để lại một số hiểu biết.