Después de unos años, la pregunta sigue siendo importante ...
Una simple regla de oro para mí: si es 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ógica de negocios!). 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.
Evitar las bases de datos de volcado 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 omite completamente, los datos pueden tener un estado incoherente 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 razones principales del aumento de NoSQL; por supuesto, con la desventaja de que la aplicación tiene que cuidar toda la lógica en sí, lo que se ha incorporado en el DB 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 ellos mismos. Para las bases de datos relacionales, es simplemente abuso, causando cada vez 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 de 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 de DB
Cuando se trata de RDBMS con restricciones de clave externa y verificación, columnas calculadas, posiblemente activadores y vistas, este es el lugar para almacenar la lógica de negocios 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 el código y en la base de datos, estos mecanismos básicos de integridad de datos no deben omitirse!
¿Procedimientos almacenados?
Los procedimientos almacenados rara vez son necesarios en la actualidad, ya que las bases de datos mantienen los planes de ejecución compilados para SQL y los reutilizan cuando vuelve la misma consulta, solo con diferentes parámetros. Así que el argumento de precompilación para SPs 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 y cuando no utilice explícitamente elementos de procedimiento. Entonces, en el mejor de los casos, utiliza expresiones de código que pueden traducirse a SQL.
Mientras que el lado de la aplicación, incluido el 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. Debido a que aún requiere conocimientos de SQL y bases de datos (excepto el CRUD más simple) y, si se aplica correctamente, funciona de manera muy diferente al código de procedimiento generalmente creado con lenguajes de programación como C # o Java.