Po kilku latach pytanie jest nadal ważne ...
Prosta praktyczna zasada: jeśli jest to ograniczenie logiczne lub wszechobecne wyrażenie (pojedyncza instrukcja), umieść je w bazie danych (tak, klucze obce i ograniczenia sprawdzania również są logiką biznesową!). Jeśli jest to proceduralne, zawierające pętle i gałęzie warunkowe (i tak naprawdę nie można ich zmienić w wyrażenie), umieść je w kodzie.
Unikaj baz danych zrzutu śmieci
Próby umieszczenia naprawdę całej logiki biznesowej w kodzie aplikacji prawdopodobnie zdegenerują (relacyjną) bazę danych do kosza na śmieci, gdzie projekt relacyjny jest w większości całkowicie pomijany, gdzie dane mogą mieć dowolny niespójny stan i brakuje normalizacji (często głównie XML, JSON , CSV itp. Kolumny kosza).
Ten rodzaj logiki opartej tylko na aplikacjach jest prawdopodobnie jednym z głównych powodów wzrostu NoSQL - oczywiście z wadą, że aplikacja musi zadbać o całą logikę, która była wbudowana w relacyjną bazę danych od dziesięcioleci. Jednak bazy danych NoSQL są bardziej odpowiednie do tego rodzaju przetwarzania danych, na przykład dokumenty danych zachowują w sobie „integralność relacyjną”. W przypadku relacyjnych baz danych jest to po prostu nadużycie, powodujące coraz więcej problemów.
Wyrażenia (oparte na zestawie) zamiast kodu proceduralnego
W najlepszym przypadku każde zapytanie lub operacja na danych powinny być kodowane jako wyrażenie, a nie kod proceduralny. Świetnym wsparciem jest to, gdy języki programowania obsługują wyrażenia, takie jak LINQ w świecie .NET (niestety, tylko zapytania obecnie, bez manipulacji). Po stronie relacyjnej bazy danych od dłuższego czasu uczy się, jak preferować wyrażenia instrukcji SQL zamiast proceduralnych pętli kursora. Więc DB może zoptymalizować, wykonać operację równolegle lub cokolwiek, co może być przydatne.
Wykorzystaj mechanizmy integralności danych DB
Jeśli chodzi o RDBMS z ograniczeniami klucza obcego i sprawdzania, kolumn obliczeniowych, ewentualnie wyzwalaczy i widoków, jest to miejsce do przechowywania podstawowej logiki biznesowej w bazie danych. Właściwa normalizacja pomaga zachować integralność danych, aby zapewnić unikalny i wyraźny przypadek danych. Nawet jeśli musisz powielić go w kodzie i DB, te podstawowe mechanizmy integralności danych nie powinny zostać pominięte!
Procedury przechowywane?
Procedury przechowywane są w dzisiejszych czasach rzadko potrzebne, ponieważ bazy danych przechowują skompilowane plany wykonania dla SQL i wykorzystują je ponownie, gdy pojawi się to samo zapytanie, tylko z różnymi parametrami. Zatem argument prekompilacji dla SP nie jest już prawidłowy. Można przechowywać lub automatycznie generować zapytania SQL w aplikacji lub ORM, które przez większość czasu znajdą wstępnie skompilowane plany zapytań. SQL jest językiem wyrażeń, o ile nie używa się jawnie elementów proceduralnych. Zatem w najlepszym przypadku używasz wyrażeń kodu, które można przetłumaczyć na SQL.
Podczas gdy strona aplikacji, w tym wygenerowany ORM, SQL, nie znajduje się już w bazie danych, w przeciwieństwie do procedur przechowywanych, nadal liczę go jako kod bazy danych. Ponieważ nadal wymaga znajomości SQL i bazy danych (z wyjątkiem najprostszego CRUD), a przy prawidłowym zastosowaniu działa znacznie inaczej niż kod proceduralny zwykle tworzony w językach programowania takich jak C # lub Java.