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:
- utilizando las herramientas que proporciona la plataforma de base de datos en forma de tablas / vistas / procedimientos almacenados / disparadores / etc.
- envolver la base de datos en un servicio que todos los clientes deben usar para acceder a la base de datos
- envolviendo la base de datos en una biblioteca que debe ser utilizada por todos los clientes para acceder a los datos.
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.
- Valide los campos en una IU que ingresa un usuario
- Valide la solicitud de red / API antes de que salga del cliente
- Valide la solicitud de red / API en el servidor antes de hacer nada
- Validar los datos que se pasan a las reglas comerciales
- Validar los datos antes de ser persistentes
- Validar los datos después de ser recuperados de la persistencia.
- Y así sucesivamente
La cantidad de validación garantizada en cada límite depende de lo arriesgado que sea no validarla.
- multiplicando dos números juntos?
- obtienes el número equivocado, ¿eso es un problema?
- invocando un procedimiento en una ubicación de memoria dada?
- ¿Qué hay en esa ubicación de memoria?
- ¿Qué sucede si el objeto no existe o está en mal estado?
- usando una expresión regular en una cadena que contiene kanji?
- ¿Puede el módulo regex manejar unicode?
- ¿Puede la expresión regular manejar unicode?
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.