Faut-il utiliser des contraintes de clé étrangère lors de la persistance des modèles de domaine?
-
21-08-2019 - |
Question
Il y a quelque temps j'ai eu une discussion avec mes collègues au sujet de la persistance des modèles de domaine et si nous devrions imposer des contraintes de clé étrangère au niveau de la base de données.
Ma première réaction a été que l'utilisation même d'une base de données relationnelle implique l'application de ces contraintes, mais certains ont fait valoir que la base de données doit être considérée comme rien d'autre qu'un mécanisme de persistance et donc nous devons éviter de placer toute la logique métier en elle. Nous avons fini par ne pas utiliser des contraintes clés étrangères.
Voici ma question (je l'espère, il est pas trop générique): est-il considéré comme une bonne pratique de faire respecter les principales contraintes dans les cas de thèses
?La solution
Faire respecter les contraintes, mais ne comptez pas sur eux dans votre logique métier
- Non logique métier sur la base de données: Je suis d'accord avec le principe. Et si votre non-SQL Code entreprise repose sur les contraintes de base de données pour vérifier la régularité de votre base de données, vous devez repenser votre logique métier.
- Il n'y a rien de mal d'avoir des contraintes de base de données en plus à votre logique métier. Surtout parce que les choses comme l'intégrité référentielle avec foreign keys et d'autres contraintes uniques sont faciles à faire et SGBDR font ce travail pour vous de façon très efficace, sans beaucoup d'entretien.
- raisonnez-vous pas indices sur la base de données aussi, parce que ce n'est pas uniquement liés persistance?
- Recherche et de corriger le bogue du logiciel peut prendre un certain temps, mais vous définitivement ne veulent pas dépenser encore plus de temps à nettoyer ou (pire) de perdre des données, juste parce que vous vous avez enregistré une peine de l'écriture script d'une ligne pour une FK. Vraiment: quelque chose de votre get gratuitement ici et votre rejettent ?
- [EDIT-1]: pouvez-vous garantir que les données dans votre base de données sera gérée uniquement via votre application? Il semble toujours y avoir des exceptions, la plupart du temps par les utilisateurs de puissance, qui font parfois (faire très rarement :-) erreurs et exécuter des instructions SQL à votre code de nettoyage, les statuts de mise à jour (à des valeurs non valides en raison de fautes de frappe) etc.
- [EDIT-2]: Bâtiment domaine conduit modèle ne constitue pas une excuse pour ne pas embaucher un bon DB admin. L'utilisation ORM est pas une excuse pour ne pas embaucher un bon développeur de DB.
Mais si vous et votre équipe êtes capable d'écrire logiciel sans bug et gérer tous les scénarios d'exception possibles dans votre code (y compris le matériel / réseau / factice utilisateur / échecs programmeur-erreur), puis "Hei, pourquoi embêter avec redondants contraintes FK ...." - -teaser -
Autres conseils
Je pense que oui, je considère qu'il est pas autant quelque chose pour la logique métier, mais empêchant les données « mauvais » d'être entré dans la base de données. Une fois la base de données devient très importante ces contraintes empêcheront des maux de tête à l'avenir.
Ce sera tout particulièrement entrera en vigueur lorsque plusieurs développeurs en développement des applications contre les mêmes données. Cela permettra d'assurer qu'ils ne peuvent ainsi entrer des données valides. Ayant des contraintes contrôlées 1 place au lieu de x applications est certainement bénéfique.
Je me sens comme ignorant vraiment des outils utiles (base de données de niveau d'intégrité des données) dans l'intérêt d'une méthodologie de développement pur est contre-productif. Les bases de données sont vraiment bons à ce genre de chose ... laissez-les faire.
À un certain point chaque méthode commence à se décomposer et il vous suffit d'être pratique.
Je pensais que oui, mais mon opinion a changé depuis que je commencé à écrire beaucoup de systèmes axés sur les ressources. En règle générale, beaucoup plus que les contraintes que la clé étrangère sont nécessaires pour valider une donnée - par exemple, un billet qui est en état « attribué » doit avoir une validité « assigned_to » valeur, et ainsi de suite. Toutes ces règles doivent être placées dans une routine de validation de quelque sorte, et en théorie, il pourrait ne pas mal pour avoir une validation supplémentaire au niveau de la base de données, si votre validation au niveau de l'application fonctionne, vérifier l'étranger contrainte de clé est juste cycles gaspillée. Bien pire, cependant, vous avez maintenant la logique de votre modèle de données répétées en deux endroits - le code de validation et les contraintes de base de données.
Pensez-y de cette façon: voudriez-vous déplacer toute autre logique d'application dans la base de données (par exemple, via des procédures stockées) si vous ne deviez pas? Si vous n'êtes pas obligé de le faire par des considérations de performance, je pense que la réponse devrait généralement être « non ».
"Ma première réaction a été que l'utilisation même d'une base de données relationnelle implique l'application de ces contraintes, mais certains ont fait valoir que la base de données doit être considérée comme rien d'autre qu'un mécanisme de persistance et donc nous devons éviter de placer toute la logique métier en elle. nous avons fini par ne pas utiliser des contraintes de clés étrangères ».
Oui, eh bien, la majorité médiocre gagne toujours ce genre de débat par simple force du nombre, hélas.
Si vous voulez continuer à combattre cette bataille, vous pourriez demander à vos adversaires comment ils ont l'intention de garder quiconque d'utiliser « éditeurs de base de données directe » (ala db2- aide, SPUFI, ...) et comment ils ont l'intention de garder tout le monde de corrompt la base de données à l'aide de ces outils (qui contournent les contraintes commerciales programmées par définition).
Si vous voulez suivre le paradigme de Domain Driven Design, alors la réponse est oui pour quoi que ce soit au sein d'un agrégat, et non pour les liens inter-agrégats.
Dans presque tous les cas, vous voulez quoi que ce soit sous la racine globale à supprimer lorsque la racine elle-même est supprimée, et ainsi avoir les clés étrangères qui représentent ce, avec cascade supprime, vous permettent d'atteindre cet objectif au niveau de la base de données. Vous pouvez également avoir votre Référentiels faire la cascade s'efface si vous ne voulez pas le faire à un niveau de DB, mais le point est toujours debout que les enfants agrégats ne devraient pas exister sans la racine.
Pour les centres d'intérêt globaux, vous serez probablement affaire à des décisions d'affaires à ce qui devrait se produire lorsque l'un ou l'autre est retiré. Souvent, vous aurez envie de traiter cette manière asynchrone permettre l'évolutivité, et ainsi votre modèle de domaine finit par être finalement cohérente. Par conséquent, il n'a pas de sens dans ces cas pour faire appliquer les clés étrangères comme il y aura une fenêtre de temps où l'une ou l'autre clé ne peut exister.
L'espoir qui aide! Et pour plus d'informations, consultez certainement livre d'Evans sur Domain Driven Design -. et les nombreux liens sur le web aussi