Siempre hay un debate sobre el tema: "¿Se debe poner la lógica empresarial en el Procedimiento almacenado o no?". Si decidimos no usar la herramienta ORM y no poner la lógica de negocios en el procedimiento almacenado, ¿dónde pondríamos la lógica de negocios?
En mis solicitudes anteriores, siempre he preferido poner toda la lógica de negocios solo en procedimientos almacenados. Luego, desde el código .NET, llamo a estos procedimientos almacenados utilizando bloques de aplicaciones de acceso a datos. SQLHelper, etc. Pero este no puede ser el escenario todo el tiempo. Así que busqué en Google pero terminé confundido ...
Alguna sugerencia ...?
Respuestas:
Adoptaría un enfoque pragmático: históricamente, el principal 'beneficio' de mantener la lógica de negocios en procesos almacenados es por razones de rendimiento (arquitectura de 2.5 niveles), mientras que la separación de la lógica de negocios en un nivel BLL (nivel 3 / N) es generalmente más limpio de un perspectiva de mantenimiento y más fácil de probar (Mock / Stub out el acceso a datos).
Sin embargo, dado que los ORMS .NET habilitados para LINQ como LINQ2SQL, EF y NHibernate ahora crean consultas SQL parametrizadas, donde los planes de consulta se pueden almacenar en caché, se escapan para inyección SQL, etc., supongo que el movimiento hacia la arquitectura de nivel 3 / N es más convincente que nunca, y la mayoría de los SPROC (especialmente los centrados en consultas) se pueden evitar por completo. Los patrones de repositorio en .NET comúnmente exponen los parámetros del árbol IQueryable / accept Expression, lo que permite un acceso seguro y flexible a sus tablas. (Personalmente en arquitecturas de tipo SOA, no expondría IQueryable más allá de BLL, es decir, sus niveles de Servicio y Presentación deberían funcionar con un conjunto bien definido de métodos. La razón es que de lo contrario nunca podrá probar completamente su sistema, y ganó '
Sin embargo, en un sistema de tamaño decente, siempre habrá algunas excepciones, en las que una pieza de código realmente intensiva en datos aún podría tener que escribirse como un Procedimiento almacenado por razones de rendimiento. En estos casos, mantendría el SPROC y expondría el SPROC a través del ORM, pero aún expondría la función como un método de transferencia en su BLL.
fuente
Como desarrollador de Java, mi preferencia era poner la lógica de negocios en el BLL (control de fuente agradable y fácil, familiaridad, etc., etc.).
Sin embargo, después de trabajar para una gran empresa con muchas aplicaciones distribuidas que utilizan diferentes tecnologías (C #, Java, Pick (no preguntar)) se hizo evidente un beneficio significativo de usar procedimientos almacenados:
Los procedimientos almacenados se pueden compartir entre diferentes aplicaciones .
fuente
Nuestro equipo tiene una regla suave aquí. A veces es mejor resolver Business Logic en T-SQL, a veces es más fácil hacerlo en c # (Business Layer).
Entonces tenemos una solución pragmática: poner donde mejor se ajuste. Sé que la teoría es a veces muy estricta al respecto ... pero esa es la teoría :-)
fuente
Hay ventajas y desventajas para ambos (en mi opinión):
Los procedimientos almacenados pueden convertirse en una pesadilla si no está utilizando algún tipo de control de fuente SQL (que muchos lugares no lo hacen) y tiene varios desarrolladores trabajando en ellos. Alguien puede cambiar un procedimiento almacenado y olvidarse de actualizar el código que llama a ese procedimiento y, antes de que se dé cuenta, acaba de construir e implementar un sitio que arrojará excepciones no controladas (falta de coincidencia de recuento de parámetros, etc.).
Por otro lado, los procedimientos almacenados permiten una corrección de errores más rápida en ciertas situaciones. Si hay un error con un procedimiento almacenado, simplemente corríjalo y ya está. Una corrección de error en un ORM requiere una reconstrucción. Dependiendo de su proceso de construcción, esto podría ser largo / molesto.
fuente
Siempre ponemos nuestra lógica de negocios en la capa de lógica de negocios. Si lo coloca en Procedimiento almacenado, se perderá una vez que cambie su RDBMS.
fuente
"Lógica empresarial" es un término un tanto vago. Quiero decir que no tiene una sola definición. Una regla de oro es minimizar la comunicación entre los niveles cuando sea posible. Por lo tanto, no necesita enviar un nombre de cliente en blanco al servidor para verificarlo antes de insertar una fila.
Hay casos en que una regla se basa en una lectura de base de datos. Supongamos que desea transferir dinero de la Cuenta 1 a la Cuenta 2. Debe leer ambas cuentas, asegurarse de que estén en buen estado y que la cantidad en la Cuenta 1 sea suficiente. En este caso, el servidor es un mejor candidato para esta regla porque el cliente (siendo el BL aquí) no necesita emitir 3 llamadas al nivel de la base de datos para este proceso.
Por supuesto, si necesita que su solución sea independiente de la base de datos, haga procs almacenados solo para CRUD (si se usa).
fuente
La lógica debe estar en el BLL siempre porque:
Creo que debería haber una ley que establezca que después de que un SP tiene más de X líneas de largo, no funciona según lo previsto.
fuente
Creamos una capa de servicios que contiene toda nuestra lógica de negocios implementada en el idioma elegido y solo usamos la base de datos para consultas. Este enfoque es obligatorio por nuestra parte porque nuestro objetivo es crear soluciones COTS para entregar aplicaciones con diversas implementaciones de bases de datos. Hibernate ha demostrado ser un salvavidas para nosotros en estas circunstancias.
Creo que la mayor ventaja de este enfoque, además de la portabilidad de la base de datos, es que puede encontrar todas sus respuestas en una sola búsqueda.
Además, a pesar de algunas de las respuestas a un foro, tengo un amigo que trabaja para una compañía de seguros Fortune 100 que ha realizado 2 conversiones de bases de datos en tres años porque la base de datos elegida por la compañía cambió.
fuente
En mi experiencia limitada, prefiero mantener la integridad de los datos con los procedimientos almacenados y otras características de la base de datos. Por ejemplo, si estuviera implementando una transferencia de fondos entre dos cuentas, escribiría un procedimiento almacenado. Encuentro valioso poder usar múltiples lenguajes de aplicación.
fuente