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, sino que solo las definían en el código fuente. Entonces, 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 sobre otras características avanzadas en bases de datos modernas como cascada, disparadores, procedimientos ... Hay algunos puntos en mis pensamientos:
En la base de datos:
Datos correctos del diseño. Evitar 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 al insertar / actualizar datos, ya que la aplicación debe realizar más consultas para verificar la integridad de los datos.
En código fuente:
Mas flexible.
Mejor al escalar a múltiples bases de datos, ya que a veces la relación puede ser entre bases de datos.
Más control sobre la integridad de los datos. La base de datos no tiene que verificar cada vez que la aplicación modifica datos (la complejidad puede ser O (n) u O (n log n) (?)). En cambio, se delega a la aplicación. Y creo que manejar la integridad de los datos en la aplicación generará mensajes de error más detallados que el uso de la base de datos. Por ejemplo: cuando crea un servidor API, si define las relaciones en la base de datos y algo sale mal (como si la entidad a la que se hace referencia no existe), obtendrá una excepción SQL con un mensaje. La manera simple será devolver 500 al cliente que hay un "error interno del servidor" y el cliente no tendrá idea de qué está yendo mal. O el servidor puede analizar el mensaje para descubrir qué está mal, lo cual es una forma fea y propensa a errores en mi opinión. Si deja que la aplicación maneje esto,
¿Hay algo mas?
Editar: como señala Kilian, mi punto sobre el rendimiento y la integridad de los datos es muy equivocado. 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 robusto. Por favor, revise la pregunta actualizada y piense al respecto.
Editar: gracias a todos. Todas las respuestas que recibí señalan 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 acabo de publicar como una pregunta separada: manejar el error de la base de datos para el servidor API . Por favor, deje algunas ideas.