online - google database design tool
Dónde ubicar tu código: base de datos vs. aplicación? (10)
@DannySmurf:
No es depurable
Dependiendo de su servidor, sí, son depurables. Esto proporciona un ejemplo para SQL Server 2000 . Supongo que los más nuevos también tienen esto. Sin embargo, el servidor MySQL gratuito no tiene esto (hasta donde yo sé).
No está sujeto al control de la fuente
Sí lo es. Mas o menos. Las copias de seguridad de la base de datos deben incluir procedimientos almacenados. Esos archivos de respaldo pueden estar o no en su depósito de control de versiones. Pero de cualquier manera, tiene copias de seguridad de sus procedimientos almacenados.
He estado desarrollando aplicaciones web / de escritorio durante aproximadamente 6 años. Durante el transcurso de mi carrera, encontré una aplicación que estaba fuertemente escrita en la base de datos usando procedimientos almacenados, mientras que mucha aplicación solo tenía unos pocos procedimientos básicos almacenados (para leer, insertar, editar y eliminar registros de entidades) para cada entidad .
He visto a gente discutir diciendo que si ha pagado por una base de datos empresarial, use sus funciones extensivamente. Mientras que muchos "arquitectos orientados a objetos" me dijeron que era un crimen absoluto poner algo más de lo necesario en la base de datos y ¿debería poder conducir la aplicación usando los métodos de esas clases?
¿Dónde crees que está el saldo?
Gracias, Krunal
@Thomas Owens: (control de fuente re) Sí, pero eso no es control de fuente en el mismo sentido en que puedo verificar en un archivo .cs (o archivo .cpp o lo que sea) e ir y seleccionar cualquier revisión que desee. Hacer eso con el código de la base de datos requiere una cantidad de esfuerzo potencialmente significativa para recuperar el procedimiento de la base de datos y transferirlo a algún lugar en el árbol fuente, o hacer una copia de seguridad de la base de datos cada vez que se realiza un cambio menor. En cualquier caso (y sin importar la cantidad de esfuerzo), no es intuitivo; y para muchas tiendas, tampoco es una solución lo suficientemente buena. También existe el potencial aquí para que los desarrolladores que no sean tan estudiosos como otros olviden recuperar y verificar una revisión. Es técnicamente posible poner CUALQUIER COSA en el control de la fuente; la desconexión aquí es con lo que tengo problemas.
(re debuggable) Bastante justo, aunque eso no proporciona mucha integración con el resto de la aplicación (donde podría vivir la mayoría del código). Eso puede o no ser importante.
Bueno, este es difícil. Como programador, querrás evitar TSQL y los "lenguajes de base de datos" tanto como sea posible, porque son terribles, difíciles de depurar, no extensibles y no hay nada que puedas hacer con ellos que no puedas hacer. usando código en su aplicación.
Las únicas razones que veo para escribir procedimientos almacenados son:
- Su base de datos no es buena (piense cómo SQL Server no implementa LIMIT y tiene que trabajar en eso usando un procedimiento.
- Desea poder cambiar un comportamiento cambiando el código en un solo lugar sin volver a implementar sus aplicaciones cliente.
- Las máquinas cliente tienen grandes restricciones de cálculo de potencia (piense en pequeños dispositivos integrados).
Sin embargo, para la mayoría de las aplicaciones, debe intentar mantener el código en la aplicación donde puede depurarlo, mantenerlo bajo control de versiones y corregirlo usando todas las herramientas que le proporciona su idioma.
Creo que es una lógica de negocios frente a la lógica de datos. Si hay una lógica que garantiza la coherencia de sus datos, colóquela en un procedimiento almacenado. Lo mismo para las funciones de conveniencia para la recuperación / actualización de datos.
Todo lo demás debería ir al código.
Un amigo mío está desarrollando una serie de procedimientos almacenados para algoritmos de análisis de datos en bioinformática. Creo que su enfoque es bastante interesante, pero no es el correcto en el largo plazo. Mis principales objeciones son la mantenibilidad y la falta de adaptabilidad.
Estoy en el campamento de arquitectos orientados a objetos. No es necesariamente un crimen poner código en la base de datos, siempre y cuando comprenda las advertencias que lo acompañan. Aquí están algunas:
- No es depurable
- No está sujeto al control de la fuente
- Los permisos en sus dos juegos de código serán diferentes
- Hará más difícil rastrear de dónde vino un error en los datos si está accediendo a información en la base de datos desde ambos lugares
Mi preferencia personal es tratar de mantener la mayor cantidad posible de lógica y configuración fuera de la base de datos. En estos días, dependo mucho de Spring e Hibernate para que sea mucho más fácil. Tiendo a utilizar consultas con nombre de Hibernate en lugar de procedimientos almacenados y la información de configuración estática en archivos XML de contexto de la aplicación Spring. Todo lo que necesita ir a la base de datos debe cargarse usando un script y mantengo esos scripts en control de versiones.
Vengo de casi el mismo fondo y he escuchado los mismos argumentos. Entiendo que hay razones muy válidas para poner la lógica en la base de datos. Sin embargo, depende del tipo de aplicación y la forma en que maneja los datos, qué enfoque debe elegir.
En mi experiencia, una aplicación de entrada de datos típica como alguna gestión de clientes (o xyz) se beneficiará enormemente del uso de una capa ORM ya que no hay tantas vistas diferentes en los datos y puede reducir al mínimo el código repetitivo CRUD.
Por otro lado, supongamos que tiene una aplicación con mucha concurrencia y cálculos que abarcan muchas tablas y que tiene un concepto de seguridad de nivel de columna detallado con bloqueo y demás, probablemente sea mejor que haga cosas como eso directamente en la base de datos.
Como se mencionó anteriormente, también depende de la variedad de vistas que anticipa para sus datos. Si hay muchas combinaciones diferentes de columnas y tablas que se deben presentar al usuario, también puede ser mejor devolver simplemente diferentes conjuntos de resultados en lugar de asignar sus objetos uno a uno a otra representación.
Después de todo, la base de datos es buena para tratar con conjuntos, mientras que el código OO es bueno para tratar con entidades individuales.
Todo lo que se relacione con la integridad referencial o la consistencia debe figurar en la base de datos como un mínimo. Si está en su aplicación y alguien quiere escribir una aplicación contra la base de datos, tendrá que duplicar el código en su código para asegurarse de que los datos sean consistentes.
PLSQL for Oracle es un lenguaje bastante bueno para acceder a la base de datos y también puede proporcionar mejoras de rendimiento. Su aplicación también puede ser mucho más ''ordenada'', ya que puede tratar los procedimientos almacenados de la base de datos como una ''caja negra''.
Los sprocs también se pueden sintonizar y modificar sin tener que acercarse a la aplicación compilada, esto también es útil si el proveedor de su aplicación ha cerrado o no está disponible.
No estoy defendiendo que ''todo'' debería estar en la base de datos, ni mucho menos. Trate cada caso por separado y lógicamente y verá qué tiene más sentido, colóquelo en la aplicación o póngalo en la base de datos.
Bueno, si le importa la coherencia de sus datos, existen razones para implementar código dentro de la base de datos. Como han dicho otros, colocar código (y / o RI / restricciones) dentro de la base de datos actúa para hacer cumplir la lógica de negocio, cerca de los datos en sí. Además, proporciona una interfaz común y encapsulada para que su nuevo desarrollador no cree accidentalmente registros huérfanos o datos incoherentes.
Al leer estas respuestas, estoy bastante confundido por la falta de comprensión de la programación de la base de datos. Soy un desarrollador de Oracle Pl / sql, nos encargamos del control de cada bit de código que ingrese a la base de datos. Muchos de los IDE proporcionan complementos para la mayoría de los principales productos de control de origen. De ClearCase a SourceSafe. Las herramientas de Oracle que utilizamos nos permiten depurar el código, por lo que la depuración no es un problema. El problema es más de lógica y accesibilidad.
Como gerente de soporte para unos 5000 usuarios, cuanto menos lugares tenga que buscar la lógica, mejor. Si quiero asegurarme de que la lógica se aplica a TODAS las aplicaciones que usan los datos, incluso la lógica comercial, la pongo en la base de datos. Si la lógica es diferente según la aplicación, pueden ser responsables de ella.