Sé que los desencadenantes se pueden usar para validar los datos almacenados para mantener la base de datos coherente. Sin embargo, ¿por qué no realizar la validación de datos en el lado de la aplicación antes de almacenarlos en la base de datos?
Por ejemplo, almacenamos clientes y queremos realizar alguna validación que no se puede hacer fácilmente en el nivel DDL. https://severalnines.com/blog/postgresql-triggers-and-stored-function-basics
Otro ejemplo es la auditoría.
Actualizar
Cómo los disparadores y la transacción de la base de datos funcionan juntos. Por ejemplo, si quisiera realizar la validación de los datos que se están insertando. Se realiza dentro de una transacción. ¿Qué sucede antes: la transacción se confirma o se ejecuta el disparador?
database
database-design
postgres
Yan Khonski
fuente
fuente
However, why not perform validation of data on the application side before storing them into the database?
bueno, estos dos no son mutuamente excluyentes. Es probable que valide diferentes cosas en ambos lados. Si bien las validaciones en el lado de la aplicación están centradas en el negocio, las validaciones en la base de datos están más centradas en los datos. Piense en una base de datos alimentada por varias y diferentes aplicaciones.Respuestas:
Depende del tipo de sistema de aplicación que esté creando:
Si está creando un sistema centrado en la aplicación que contiene solo una aplicación principal, con una base de datos dedicada específicamente para esta aplicación, e idealmente un equipo responsable de la evolución de la aplicación y la base de datos en paralelo, puede mantener toda la lógica de validación y también auditar lógica dentro de la aplicación.
El principal beneficio de esto es que no tiene que distribuir la lógica de negocios entre la aplicación y la base de datos, por lo que el mantenimiento y la evolución del sistema a menudo se vuelve más fácil. Como beneficio adicional, no vincula demasiado la aplicación a un tipo específico de DBMS o proveedor de DBMS. Obviamente, este enfoque es necesario si su aplicación quiere poder usar un sistema de base de datos liviano que no proporciona disparadores.
Sin embargo, si crea un sistema en el que muchas aplicaciones diferentes comparten una base de datos común, y no puede prever de antemano qué aplicaciones le escribirán en el futuro, o qué equipos desarrollarán aplicaciones para completar datos en la base de datos en el futuro, entonces es mejor que su base de datos sea responsable de garantizar la mayor consistencia de datos posible. Y ahí es donde los desencadenantes se vuelven realmente útiles. En sistemas más grandes, las restricciones referenciales a menudo no son suficientes para esto, pero un disparador que llama a un procedimiento almacenado puede implementar casi cualquier tipo de validación que necesite.
Otra razón para usar desencadenantes puede ser el rendimiento: en modelos de datos complejos, no es raro encontrar reglas de coherencia complejas que requieren el uso de muchos datos adicionales que no forman parte del conjunto de trabajo actual disponible en la aplicación cliente. Transferir todos esos datos a través de la red primero para hacer posible la validación en el lado del cliente puede tener un impacto notable en el rendimiento.
Vea también esta publicación anterior de SE: Application Logic Vs DB Triggers para la limpieza de la base de datos
Así que decida por sí mismo qué tipo de sistema está construyendo, luego puede tomar una decisión fundada si los disparadores son la herramienta adecuada para su caso o no.
fuente
Creo que la pregunta es sobre la responsabilidad de la calidad de los datos.
La respuesta depende de cómo veas el sistema.
Si ve la base de datos como un servicio independiente, distinto y autónomo separado de la aplicación, la base de datos es responsable de garantizar la coherencia y la calidad de los datos que contiene. Esencialmente porque esa base de datos podría ser utilizada por una aplicación diferente, por lo que no puede confiar en que la segunda aplicación tenga los mismos comportamientos de calidad y consistencia. En estas circunstancias, la base de datos debe diseñarse para exponer una API y un comportamiento autónomo. En esta vista hay al menos dos aplicaciones, una de ellas es la base de datos y la otra es la aplicación que la usa.
Por el contrario, la base de datos podría considerarse una forma complicada de archivo que está bajo el control directo y total de la aplicación. En este sentido, la base de datos se convierte en una pura herramienta de serialización y navegación de documentos. Puede proporcionar algunos comportamientos avanzados para admitir consultas y mantenimiento de documentos (como JSON o las herramientas XML) pero, de nuevo, no es necesario (como lo hacen la mayoría de las secuencias de archivos). En este caso, es puramente responsabilidad del programa mantener el formato y contenido correctos dentro del archivo. En esta vista hay una aplicación.
En ambas vistas, la siguiente pregunta es cómo admitir el uso de la base de datos como un archivo elegante o como un servicio separado. Puede lograr esto al:
Cada uno viene con sus propios pros / contras y dependerá de las limitaciones arquitectónicas del entorno en el que opera el sistema.
Independientemente de la vista que tome, siempre vale la pena validar los datos en los límites.
La cantidad de validación garantizada en cada límite depende de lo arriesgado que sea no validarla.
fuente
No, nunca debes usar disparadores para hacer la validación.
La base de datos solo es responsable de su propia integridad. Cualquier aplicación que se enfrente a la validación debe realizarla su aplicación
Las bases de datos realizan tres niveles de validación para integridad. El primero es la validación a nivel de campo. Se puede requerir un campo, si no hay ningún valor (nulo) es un error. También puede ser una restricción de verificación; un dominio tiene un número enumerado de valores.
En segundo lugar hay relaciones entre tablas. En una tabla, almacena una o más claves foráneas, relaciona esta tabla con otras tablas y requiere que los valores sean claves válidas para la "otra tabla". Piense en una base de datos de direcciones, donde admitimos direcciones de diferentes países. Una clave de país en una dirección debe apuntar a un país conocido. Si los datos (por ejemplo, un código postal) son válidos, no es una preocupación de esta verificación de integridad.
En tercer lugar y más complicado son los desencadenantes. Como regla general, estos deben abordar (juego de palabras no intencionado) se refiere a reglas de integridad que son condicionales. Para volver al ejemplo de la dirección: si un país no tiene códigos postales, sería un problema si un país en esta lista tuviera un código postal. Por lo tanto, la comprobación sería: si este país no tiene códigos postales, el campo del código postal debería ser nulo.
La validación es la preocupación de la aplicación. El hecho de que un código postal alemán consista solo en dígitos es un control que la aplicación debe hacer, no la base de datos. La línea es delgada, por lo que es posible que necesite pensar / debatir en algunos casos si algo debe estar en un disparador (proteger la integridad de su base de datos) o en la aplicación (validación de cara al usuario).
fuente
La auditoría es un ejemplo clásico del uso efectivo de los desencadenantes. He encontrado algunos errores cometidos por el probador (moviendo un cliente de un nivel de servicio a otro) gracias a una tabla de Auditoría que fue implementada por disparadores. Recomiendo encarecidamente utilizar disparadores para la auditoría.
La validación se puede hacer en el nivel frontal, pero he visto errores extraños en la base de datos que he manejado (personas que nacieron en 3000, etc.), y como algunos de ellos los hice yo mismo, recomiendo tener una capa adicional. de validación en la base de datos, por si acaso. Por supuesto, esos tipos de errores podrían evitarse con restricciones de verificación, y muchas veces son más efectivos (en MS SQL son el método preferido; siempre verifique la documentación).
fuente
Debido a que la pregunta es acerca de si realmente necesitamos disparadores para bases de datos relacionales, aquí hay algunos otros casos de uso donde usar disparadores:
instead of
. Con este medio, uno puede insertar, actualizar y eliminar entradas de una vista. Los desencadenantes pueden extender estas acciones en varias tablas. Esta es una forma de hacer que una vista restringida esté disponible sin exponer los detalles de las tablas subyacentes.Como inconveniente, la lógica de negocios se distribuye entre las capas y esto es una desventaja importante para el mantenimiento. Como escribió otro autor, es un límite delgado entre la aplicación y la base de datos y la elección no siempre es clara. Mi opinión personal es que los disparadores suponen una carga para los desarrolladores. Pueden ahorrar tiempo en el desarrollo. Definitivamente mejoran la experiencia del usuario porque aumentan el rendimiento en conexiones de red lentas.
fuente