Dopo qualche anno, la domanda è ancora importante ...
Semplice regola empirica per me: se si tratta di un vincolo logico o di un'espressione onnipresente (singola istruzione), inseriscilo nel database (sì, anche le chiavi esterne e i vincoli di controllo sono una logica aziendale!). Se è procedurale, contenendo loop e rami condizionali (e davvero non può essere modificato in un'espressione), inseriscilo in codice.
Evitare i DB di dump del cestino
I tentativi di inserire davvero tutta la logica aziendale nel codice dell'applicazione probabilmente degenereranno il database (relazionale) in una discarica, in cui la progettazione relazionale deve essere quasi completamente omessa, dove i dati possono avere uno stato incoerente e manca la normalizzazione (spesso principalmente XML, JSON , CSV ecc. Colonne cestino).
Questo tipo di logica solo per l'applicazione è probabilmente uno dei motivi principali per l'ascesa di NoSQL - ovviamente con il rovescio della medaglia che l'applicazione deve occuparsi di tutta la logica stessa, ciò che è stato incorporato nel database relazionale per decenni. Tuttavia, i database NoSQL sono più adatti a questo tipo di gestione dei dati, ad esempio i documenti di dati mantengono in sé implicita "integrità relazionale". Per i DB relazionali, è semplicemente un abuso, che causa sempre più problemi.
Espressioni (basate su set) anziché codice procedurale
Nel migliore dei casi, ogni query o operazione di dati dovrebbe essere codificata come espressione, piuttosto che come codice procedurale. Un ottimo supporto per questo è quando i linguaggi di programmazione supportano espressioni, come LINQ nel mondo .NET (sfortunatamente, al momento solo query, nessuna manipolazione). Dal punto di vista del DB relazionale, è stato insegnato per molto tempo a preferire espressioni di istruzioni SQL rispetto ai loop procedurali del cursore. In questo modo il DB può ottimizzare, eseguire l'operazione in parallelo o qualunque cosa possa essere utile.
Utilizzare meccanismi di integrità dei dati DB
Quando si tratta di RDBMS con vincoli di chiave esterna e verifica, colonne calcolate, possibilmente trigger e viste, questo è il posto in cui archiviare la logica aziendale di base nel database. Una corretta normalizzazione aiuta a mantenere l'integrità dei dati, a garantire un'istanza univoca e distinta dei dati. Anche se devi duplicarlo in codice e DB, questi meccanismi di base per l'integrità dei dati non dovrebbero essere omessi!
Procedura di archiviazione?
Oggigiorno le procedure memorizzate sono raramente necessarie, poiché i database mantengono i piani di esecuzione compilati per SQL e li riutilizzano quando viene ripetuta la stessa query, solo con parametri diversi. Quindi l'argomento precompilato per SP non è più valido. È possibile archiviare o generare automaticamente query SQL nell'applicazione o ORM, che troveranno piani di query precompilati per la maggior parte del tempo. SQL è un linguaggio di espressioni, purché non si utilizzino esplicitamente elementi procedurali. Quindi, nel migliore dei casi, usi espressioni di codice che possono essere tradotte in SQL.
Mentre il lato dell'applicazione, incluso SQL generato da ORM, non è più all'interno del database, a differenza delle Stored Procedure, lo considero ancora come codice del database. Perché richiede ancora conoscenza di SQL e database (tranne il CRUD più semplice) e, se applicato correttamente, funziona in modo molto diverso dal codice procedurale normalmente creato con linguaggi di programmazione come C # o Java.