En mi experiencia, muchos de los proyectos que he leído en el pasado no tenían definiciones de relación en la base de datos, en su lugar solo los definían en el código fuente. Así que me pregunto cuáles son las ventajas / desventajas de definir relaciones entre tablas en la base de datos y en el código fuente. Y la pregunta más amplia es acerca de otras características avanzadas en bases de datos modernas como cascada, disparadores, procedimientos ... Hay algunos puntos en mis pensamientos:
En la base de datos:
-
Corregir datos desde el diseño. Prevenga los errores de aplicación que pueden causar datos no válidos.
-
Reduzca el viaje de ida y vuelta de la red a la aplicación cuando inserte / actualice los datos, ya que la aplicación debe realizar más consultas para verificar la integridad de los datos.
En el código fuente:
-
Más flexible.
-
Es mejor cuando se escala a múltiples bases de datos, ya que a veces la relación puede ser de base de datos cruzada.
-
Más control sobre la integridad de los datos. La base de datos no tiene que verificar cada vez que la aplicación modifica los datos (la complejidad puede ser O (n) u O (n log n) (?)). En su lugar, está delegado a la aplicación. Y creo que manejar la integridad de los datos en la aplicación conducirá a mensajes de error más detallados que al usar la base de datos. Por ejemplo: cuando crea un servidor de API, si define las relaciones en la base de datos y algo sale mal (como la entidad a la que se hace referencia), obtendrá una excepción de SQL con un mensaje. La forma más sencilla será devolver 500 al cliente que hay un "error interno del servidor" y el cliente no tendrá idea de lo que está mal. O el servidor puede analizar el mensaje para descubrir qué está mal, lo que en mi opinión es una forma fea y propensa a errores. Si deja que la aplicación maneje esto, el servidor puede generar un mensaje más significativo para el cliente.
¿Hay algo más?
Editar: como señala Kilian, mi punto sobre el rendimiento y amp; La integridad de los datos es muy errónea. Así que edité para corregir mi punto allí. Entiendo totalmente que dejar que la base de datos lo maneje será un enfoque más eficiente y sólido. Por favor revise la pregunta actualizada y dé algunas ideas al respecto.
Edit: gracias a todos. Las respuestas que recibí indican que las restricciones / relaciones deben definirse en la base de datos. :). Tengo una pregunta más, ya que está bastante fuera del alcance de esta pregunta, la publiqué como una pregunta separada: Manejar el error de la base de datos para el servidor API . Por favor, deje algunos puntos de vista.