Después de unos años, la pregunta sigue siendo importante ...
Una regla general simple para mí: si se trata de una restricción lógica o una expresión ubicua (declaración única), colóquela en la base de datos (sí, ¡las claves externas y las restricciones de verificación también son lógicas comerciales!). Si es de procedimiento, al contener bucles y ramas condicionales (y realmente no se puede cambiar en una expresión), póngalo en código.
Evite los basureros de basura
Los intentos de colocar realmente toda la lógica empresarial en el código de la aplicación probablemente degenerarán la base de datos (relacional) en un basurero, donde el diseño relacional se omitirá por completo, donde los datos pueden tener un estado inconsistente y falta la normalización (a menudo principalmente XML, JSON , CSV, etc. columnas de basura).
Este tipo de lógica de solo aplicación es probablemente una de las principales razones del surgimiento de NoSQL, por supuesto, con la desventaja de que la aplicación tiene que ocuparse de toda la lógica en sí, lo que se ha incorporado en la base de datos relacional durante décadas. Sin embargo, las bases de datos NoSQL son más adecuadas para este tipo de manejo de datos, por ejemplo, los documentos de datos mantienen una "integridad relacional" implícita dentro de sí mismos. Para bases de datos relacionales, es simplemente abuso, causando aún más problemas.
Expresiones (basadas en conjuntos) en lugar de código de procedimiento
En el mejor de los casos, cada consulta u operación de datos debe codificarse como una expresión, en lugar de un código de procedimiento. Un gran soporte para esto es cuando los lenguajes de programación admiten expresiones, como LINQ en el mundo .NET (desafortunadamente, solo consultas actualmente, sin manipulación). En el lado de la base de datos relacional, se ha enseñado durante mucho tiempo a preferir expresiones de sentencias SQL en lugar de bucles de cursor de procedimiento. Por lo tanto, la base de datos puede optimizar, hacer la operación en paralelo o lo que sea útil.
Utilizar mecanismos de integridad de datos DB.
Cuando se trata de RDBMS con restricciones de clave externa y verificación, columnas calculadas, posiblemente disparadores y vistas, este es el lugar para almacenar la lógica empresarial básica en la base de datos. La normalización adecuada ayuda a mantener la integridad de los datos, para garantizar una instancia única y distinta de los datos. Incluso si tiene que duplicarlo en código y DB, ¡estos mecanismos básicos de integridad de datos no deben omitirse!
¿Procedimientos almacenados?
Los procedimientos almacenados son raramente necesarios hoy en día, ya que las bases de datos mantienen planes de ejecución compilados para SQL y los reutilizan cuando vuelve la misma consulta, solo con diferentes parámetros. Por lo tanto, el argumento de precompilación para SP ya no es válido. Uno puede almacenar o generar automáticamente consultas SQL en la aplicación u ORM, que encontrará planes de consulta precompilados la mayor parte del tiempo. SQL es un lenguaje de expresión, siempre que no utilice explícitamente elementos de procedimiento. Entonces, en el mejor de los casos, usa expresiones de código que se pueden traducir a SQL.
Si bien el lado de la aplicación, incluido ORM generado, SQL, ya no está dentro de la base de datos, a diferencia de los Procedimientos almacenados, todavía lo cuento como código de base de datos. Porque todavía requiere conocimientos de SQL y de la base de datos (excepto el CRUD más simple) y, si se aplica correctamente, funciona de manera muy diferente al código de procedimiento que generalmente se crea con lenguajes de programación como C # o Java.