D'après mon expérience, de nombreux projets que j'ai lus dans le passé ne contenaient pas de définition de relation dans la base de données, ils ne les définissaient que dans le code source. Je me demande donc quels sont les avantages / inconvénients de la définition des relations entre les tables de la base de données et du code source? Et la question plus générale concerne d’autres fonctionnalités avancées des bases de données modernes telles que la cascade, les déclencheurs, les procédures… Il ya quelques points dans mes pensées:
Dans la base de données:
Corrigez les données de la conception. Prévenez les erreurs d'application pouvant générer des données non valides.
Réduisez l'aller-retour réseau vers l'application lors de l'insertion / de la mise à jour de données, car l'application doit effectuer davantage de requêtes pour vérifier l'intégrité des données.
En code source:
Plus flexible.
Il est préférable d’effectuer une mise à l’échelle sur plusieurs bases de données, car la relation peut parfois être cross-database.
Plus de contrôle sur l'intégrité des données. La base de données n'a pas à vérifier chaque fois que l'application modifie des données (la complexité peut être O (n) ou O (n log n) (?)). Au lieu de cela, il est délégué à l'application. Et je pense que la gestion de l'intégrité des données dans l'application entraînera plus de messages d'erreur détaillés que l'utilisation de la base de données. Exemple: lorsque vous créez un serveur d'API, si vous définissez les relations dans la base de données et que quelque chose ne va pas (l'entité référencée n'existe pas), vous obtiendrez une exception SQL avec un message. Le moyen le plus simple consiste à renvoyer 500 informations au client en signalant une "erreur de serveur interne" et le client n’a aucune idée de ce qui ne va pas. Ou le serveur peut analyser le message pour déterminer ce qui ne va pas, ce qui est une manière laide et sujette aux erreurs, à mon avis. Si vous laissez l'application gérer cela,
Y a-t-il autre chose?
Edit: comme le fait remarquer Kilian, mon point sur les performances et l’intégrité des données est très erroné. Donc j'ai édité pour corriger mon point là. Je comprends tout à fait que laisser la base de données la gérer sera une approche plus efficace et robuste. S'il vous plaît vérifier la question mise à jour et donner quelques idées à ce sujet.
Edit: merci à tous. Les réponses que j'ai reçues indiquent toutes que les contraintes / relations doivent être définies dans la base de données. :) J'ai une autre question, car elle est tout à fait hors de portée de cette question. Je viens de l'afficher sous la forme d'une question distincte: Gestion des erreurs de base de données pour le serveur d'API . S'il vous plaît laissez quelques idées.