Sau một vài năm, câu hỏi vẫn còn quan trọng ...
Quy tắc đơn giản đối với tôi: nếu đó là một ràng buộc logic hoặc một biểu thức phổ biến (câu lệnh đơn), hãy đặt nó vào cơ sở dữ liệu (vâng, các khóa ngoại và kiểm tra các ràng buộc cũng là logic nghiệp vụ!). Nếu đó là thủ tục, bằng cách chứa các vòng lặp và các nhánh có điều kiện (và thực sự không thể thay đổi thành biểu thức), hãy đặt nó vào mã.
Tránh đổ rác DB
Các nỗ lực đặt thực sự tất cả logic nghiệp vụ vào mã ứng dụng có thể sẽ làm suy giảm cơ sở dữ liệu (quan hệ) thành một bãi rác, trong đó thiết kế quan hệ chủ yếu bị bỏ qua hoàn toàn, trong đó dữ liệu có thể có bất kỳ trạng thái không nhất quán nào và thiếu chuẩn hóa (thường chủ yếu là XML, JSON , CSV vv cột thùng rác).
Loại logic chỉ dành cho ứng dụng này có lẽ là một trong những lý do chính cho sự phát triển của NoQuery - tất nhiên với nhược điểm là ứng dụng phải tự xử lý tất cả logic, thứ đã được tích hợp vào DB trong nhiều thập kỷ. Tuy nhiên, cơ sở dữ liệu NoQuery phù hợp hơn cho loại xử lý dữ liệu này, ví dụ, các tài liệu dữ liệu duy trì một "tính toàn vẹn quan hệ" tiềm ẩn trong chính chúng. Đối với các DB quan hệ, nó chỉ đơn giản là lạm dụng, gây ra nhiều rắc rối hơn bao giờ hết.
Biểu thức (dựa trên tập hợp) thay vì mã thủ tục
Trong trường hợp tốt nhất, mọi truy vấn hoặc thao tác dữ liệu nên được mã hóa dưới dạng biểu thức, thay vì mã thủ tục. Một hỗ trợ tuyệt vời cho điều này là khi các ngôn ngữ lập trình hỗ trợ các biểu thức, chẳng hạn như LINQ trong thế giới .NET (thật không may, hiện tại chỉ có các truy vấn, không có thao tác). Về phía DB quan hệ, nó đã được dạy từ lâu, để thích các biểu thức câu lệnh SQL hơn các vòng lặp con trỏ thủ tục. Vì vậy, DB có thể tối ưu hóa, thực hiện thao tác song song hoặc bất cứ điều gì có thể hữu ích.
Sử dụng các cơ chế toàn vẹn dữ liệu DB
Khi nói đến RDBMS với các ràng buộc Khóa ngoài và Kiểm tra, các cột được tính toán, có thể kích hoạt và các khung nhìn, đây là nơi lưu trữ logic nghiệp vụ cơ bản trong cơ sở dữ liệu. Chuẩn hóa đúng cách giúp duy trì tính toàn vẹn dữ liệu, để đảm bảo một trường hợp duy nhất và khác biệt của dữ liệu. Ngay cả khi bạn phải sao chép nó trong mã và DB, các cơ chế toàn vẹn dữ liệu cơ bản này không nên bị bỏ qua!
Thủ tục lưu trữ?
Ngày nay, các thủ tục lưu trữ hiếm khi cần thiết, vì cơ sở dữ liệu giữ các kế hoạch thực thi được biên dịch cho SQL và sử dụng lại chúng khi cùng một truy vấn xuất hiện trở lại, chỉ với các tham số khác nhau. Vì vậy, đối số tiền biên dịch cho SP không còn hợp lệ. Người ta có thể lưu trữ hoặc tự động tạo các truy vấn SQL trong ứng dụng hoặc ORM, phần lớn sẽ tìm thấy các gói truy vấn được biên dịch trước hầu hết thời gian. SQL là một ngôn ngữ biểu thức, miễn là bạn không sử dụng rõ ràng các yếu tố thủ tục. Vì vậy, trong trường hợp tốt nhất, bạn sử dụng các biểu thức mã có thể được dịch sang SQL.
Mặc dù phía ứng dụng, bao gồm ORM được tạo, SQL, không còn bên trong cơ sở dữ liệu, không giống như Thủ tục lưu trữ, tôi vẫn tính nó là mã cơ sở dữ liệu. Bởi vì nó vẫn đòi hỏi kiến thức về SQL và cơ sở dữ liệu (trừ CRUD đơn giản nhất) và, nếu được áp dụng đúng cách, sẽ hoạt động khác rất nhiều so với mã thủ tục thường được tạo bằng các ngôn ngữ lập trình như C # hoặc Java.