Dopo alcuni anni, la domanda è ancora importante ...
Semplice regola empirica per me: se si tratta di un vincolo logico o un'espressione onnipresente (singola istruzione), inseriscilo nel database (sì, anche le chiavi esterne e i vincoli di controllo sono logiche di business!). Se è procedurale, racchiudendo loop e rami condizionali (e in realtà non può essere modificato in un'espressione), inseriscilo nel codice.
Evita i DB di scarico del cestino
I tentativi di collocare davvero tutta la logica aziendale nel codice dell'applicazione probabilmente degenereranno il database (relazionale) in un dump della spazzatura, dove la progettazione relazionale è per lo più completamente omessa, dove i dati possono avere uno stato incoerente e la normalizzazione è mancante (spesso XML, JSON, CSV ecc. Colonne trashbin).
Questo tipo di logica solo per applicazione è probabilmente una delle ragioni principali per l'aumento di NoSQL - ovviamente con lo svantaggio che l'applicazione deve prendersi cura di tutta la logica stessa, ciò che è stato incorporato nel DB relazionale per decenni . Tuttavia, i database NoSQL sono più adatti a questo tipo di gestione dei dati, ad esempio, i documenti di dati mantengono una "integrità relazionale" implicita all'interno di se stessi. Per i DB relazionali, è semplicemente un abuso, causando sempre più problemi.
Espressioni (basate su set) anziché codice procedurale
Nel migliore dei casi, ogni query o operazione di dati dovrebbe essere codificata come un'espressione, piuttosto che come codice procedurale. Un grande supporto per questo è quando i linguaggi di programmazione supportano le espressioni, come LINQ nel mondo .NET (sfortunatamente solo le query al momento, nessuna manipolazione). Sul lato relazionale del DB, è stato insegnato per molto tempo a preferire espressioni di istruzioni SQL su loop di cursori procedurali. Quindi il DB può ottimizzare, eseguire l'operazione in parallelo o qualunque cosa possa essere utile.
Utilizza i meccanismi di integrità dei dati DB
Quando si tratta di RDBMS con chiave esterna e vincoli di controllo, colonne calcolate, possibili trigger e visualizzazioni, questo è il posto in cui archiviare la logica aziendale di base nel database. Una corretta normalizzazione aiuta a mantenere l'integrità dei dati, per garantire un'istanza unica e distinta dei dati. Anche se devi duplicarlo in codice e DB, questi meccanismi di base dell'integrità dei dati non dovrebbero essere omessi!
Procedure memorizzate?
Le stored procedure sono raramente necessarie al giorno d'oggi, dal momento che i database mantengono piani di esecuzione compilati per SQL e li riutilizzano quando viene restituita la stessa query, solo con parametri diversi. Quindi l'argomento di precompilazione per SP non è più valido. È possibile memorizzare o generare automaticamente query SQL nell'applicazione o nell'ORM, che troveranno per la maggior parte del tempo piani di query precompilati. SQL è un linguaggio di espressione, 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 applicazione, incluso l'ORM generato, SQL, non è più all'interno del database, a differenza delle stored procedure, lo considero comunque come codice del database. Perché richiede ancora la conoscenza di SQL e database (tranne il più semplice CRUD) e, se applicato correttamente, funziona in modo molto diverso rispetto al codice procedurale solitamente creato con linguaggi di programmazione come C # o Java.