Ya sea para poner la lógica de negocios en procedimiento almacenado o no?

21

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 ...?

Pravin Patil
fuente
Soy parcial -> Procs almacenados siempre. Pero entonces soy parcial. Olvídese de la programación ágil, la triste realidad es que en el mundo de los negocios los cambios siempre suceden ad-hoc y deben hacerse "inmediatamente". Los procedimientos almacenados lo permiten. Es un salvavidas. Intentar hacer tales cambios a través de la base de código no sería factible.
Darknight
44
@Darknight, depende en gran medida de su plataforma y arquitectura para hacer una declaración como esa. No veo por qué la implementación de un procedimiento almacenado en una base de datos requiere mucho menos tiempo que, por ejemplo, ejecutar un script de compilación e implementación para compilar un nuevo archivo WAR, implementarlo y reiniciar el servidor de aplicaciones.
maple_shaft
77
Procedimientos almacenados: el tanque séptico de la informática.
Mongus Pong
1
Procedimientos almacenados: solo otra herramienta como cualquier otra.
Sam yi

Respuestas:

15

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.

StuartLC
fuente
1
+1 para pruebas de unidad más fáciles de escribir en el nivel de aplicación, sin embargo, los marcos de prueba de unidad de base de datos automatizados han recorrido un largo camino.
maple_shaft
14

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 .

NimChimpsky
fuente
Muy buen punto
NoChance
1
Esto es muy cierto, y lo usamos con buenos resultados en nuestro entorno. Sin embargo, compartir código usando la capa de datos siempre me ha parecido un poco peligroso. Si tiene múltiples consumidores de una determinada pieza de lógica / datos, prefiero poner un servicio en lugar de tener múltiples consumidores de la misma base de datos.
RationalGeek
2
Si divide su gestión de datos en bibliotecas, esas bibliotecas también podrían compartirse en diferentes aplicaciones en teoría ...
glenatron
2
Estoy de acuerdo en parte. Todas estas tecnologías están accediendo a la base de datos directamente; entonces estás usando procedimientos almacenados para compartir código común entre ellos. También podría resolver el mismo problema teniendo un nivel medio y tener las soluciones heterogéneas accediendo a su nivel medio en lugar de a su base de datos, y ese nivel medio comparte dicho código.
Ekevoo
1
Fyi esta respuesta es tonta, 6 años después, solo los datos van en la base de datos. Pones la lógica allí, tienes muchos problemas en el futuro. Simplemente cree un microservicio en el idioma de su elección que acceda a la base de datos.
NimChimpsky
6

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 :-)

gsharp
fuente
2
¿Seguramente esta es la peor solución de todas? ¿Cómo sabe un desarrollador de mantenimiento dónde se almacena la lógica? Me imagino que a veces también se desliza hacia la capa de aplicación, o peor aún, la interfaz de usuario.
Paul T Davies
2
No Siempre está en Business Layer o T-SQL. Averiguar dónde se almacena la lógica es probablemente el problema más pequeño cuando se trata de mantenimiento.
gsharp
¿Qué sucede cuando alguien se une al equipo y usted les dice esta regla? ¿Cómo se supone que deben saber dónde algo "encaja mejor"? Esto casi me parece una no regla. Muy subjetivo basado en el individuo.
RationalGeek
3
Vamos chicos, ¿en serio? Empleamos personas que tienen un cerebro para pensar y vienen con algo de experiencia a bordo. Entonces ... oh sí, tienen una boca para preguntar y conversar. Puedo decir que nuestro software necesita muy poco mantenimiento y que casi todas las personas de nuestro equipo pueden implementar nuevas funciones. No puede estar tan mal lo que hacemos.
gsharp
44
Realmente no veo el sentido de hacer un mal uso de c # para cosas que SQLServer puede hacer mucho mejor, y viceversa.
gsharp
3

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.

AndrewC
fuente
+1 para la necesidad de control de fuente con procs almacenados si va a utilizarlos en gran medida. Muchos DBA con los que he trabajado son muy resistentes a esta idea.
RationalGeek
2

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.

šljaker
fuente
16
Lo último que cambia es el RDBMS ;-)
gsharp
Entonces, ¿significa que limita el Procedimiento almacenado a buscar, actualizar e insertar los datos ...?
Pravin Patil
1
En todos los sistemas grandes que he visto, la realidad es que la base de datos ES el sistema. Los lenguajes de programación casi se convierte en irrelevante en este momento tan sólo el "front-end" ..
Darknight
2
@gsharp, eso no siempre es cierto. Es posible que desee agregar otro RDBMS como Oracle, o reemplazar completamente el existente. O, en algunos casos, desea reemplazar datos reales con datos ficticios.
šljaker
2
@ šljaker, por supuesto, no siempre es cierto. Pero es más probable que el programa cambie (rediseño del software, nuevos lenguajes de programación, etc.) en lugar de la base de datos.
gsharp
2

"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).

Ninguna posibilidad
fuente
1

La lógica debe estar en el BLL siempre porque:

  • Se puede probar adecuadamente
  • Cuando SQL 20XX se vuelve obsoleto y necesita cambiar a la última versión, no tiene que volver a escribir su código.
  • La gente no se siente tentada a hacer cambios sobre la marcha (lo que parece estar siendo presentado como un argumento a favor de los SP)
  • Los SP, en mi experiencia, son el principal punto de error del desarrollador, especialmente después de algunas generaciones de mantenimiento / cambios.

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.

Paul T Davies
fuente
¿Qué hay de malo con los cambios sobre la marcha? Si hay un error en un procedimiento almacenado y se soluciona fácilmente, entonces corríjalo. Es positivo porque significa que no tienes que hacer un relanzamiento para algo trivial. Mientras las personas no comiencen a enmascarar errores en el código cambiando los procedimientos almacenados, no veo ningún problema.
AndrewC
Por cambios sobre la marcha me refiero a cosas que no se prueban y no siguen un procedimiento de liberación formal. Y sí, los cambios sp para enmascarar errores de código es algo de lo que he visto bastante.
Paul T Davies
0

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ó.

Thom
fuente
0

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.

Kevin Cline
fuente