Après quelques années, la question est toujours importante ...
Pour moi, la règle est simple: s'il s'agit d'une contrainte logique ou d'une expression omniprésente (instruction unique), placez-la dans la base de données (oui, les clés étrangères et les contraintes de vérification sont également de la logique métier!). Si c'est procédural, en contenant des boucles et des branches conditionnelles (et ne peut vraiment pas être transformé en une expression), mettez-le en code.
Éviter les bases de données de vidage de corbeille
Les tentatives visant à placer réellement toute la logique métier dans le code d’application vont probablement dégénérer la base de données (relationnelle) en un vidage de la corbeille, où la conception relationnelle est presque complètement omise, où les données peuvent avoir un état incohérent et où la normalisation est absente (souvent principalement XML, , Colonnes de corbeille CSV etc.).
Ce type de logique réservée aux applications est probablement l’une des principales raisons de l’essor de NoSQL - bien sûr, mais l’inconvénient est que l’application doit prendre en charge toute la logique elle-même, qui est intégrée à la base de données relationnelle depuis des décennies. Cependant, les bases de données NoSQL conviennent mieux à ce type de traitement de données. Par exemple, les documents de données conservent une "intégrité relationnelle" implicite en eux-mêmes. Pour les bases de données relationnelles, il s’agit tout simplement d’abus et de problèmes.
Expressions (basées sur les ensembles) au lieu de code procédural
Dans le meilleur des cas, chaque requête ou opération de données doit être codée comme une expression plutôt que comme un code de procédure. Les langages de programmation prennent en charge des expressions telles que LINQ dans le monde .NET (malheureusement, seules les requêtes pour le moment, pas de manipulation). Du côté des bases de données relationnelles, on a appris depuis longtemps à préférer les expressions d'instructions SQL aux boucles procédurales du curseur. Ainsi, la base de données peut être optimisée, effectuer l’opération en parallèle, ou ce qui peut être utile.
Utiliser les mécanismes d'intégrité des données de la base de données
Lorsqu'il s'agit de SGBDR avec une clé étrangère et des contraintes de vérification, des colonnes calculées, éventuellement des déclencheurs et des vues, c'est l'endroit idéal pour stocker la logique métier de base dans la base de données. Une normalisation appropriée aide à maintenir l'intégrité des données, afin de garantir une instance unique et distincte des données. Même si vous devez le dupliquer dans le code et la base de données, ces mécanismes de base de l'intégrité des données ne doivent pas être omis!
Procédures stockées?
Les procédures stockées sont rarement nécessaires de nos jours, car les bases de données conservent les plans d'exécution compilés pour SQL et les réutilisent lorsque la même requête revient, uniquement avec des paramètres différents. Ainsi, l'argument de précompilation pour les SP n'est plus valide. On peut stocker ou générer automatiquement des requêtes SQL dans l'application ou l'ORM, qui trouvera la plupart du temps des plans de requête précompilés. SQL est un langage d'expression, tant que vous n'utilisez pas explicitement des éléments procéduraux. Donc, dans le meilleur des cas, vous utilisez des expressions de code pouvant être traduites en SQL.
Bien que le côté application, y compris SQL généré par ORM, ne soit plus dans la base de données, contrairement aux procédures stockées, je le considère toujours comme du code de base de données. Parce qu'il nécessite toujours des connaissances en SQL et en base de données (à l'exception du CRUD le plus simple), il fonctionne de manière très différente du code de procédure généralement créé avec des langages de programmation tels que C # ou Java.