Lorsque je passe en revue les modèles de base de données pour le SGBDR, je suis généralement surpris de constater peu de contraintes, voire aucune (à part PK / FK). Par exemple, le pourcentage est souvent stocké dans une colonne de type int
(alors que ce tinyint
serait plus approprié) et il n'y a pas de CHECK
contrainte pour restreindre la valeur à la plage 0..100. De même sur SE.SE, les réponses suggérant des contraintes de vérification reçoivent souvent des commentaires suggérant que la base de données est le mauvais endroit pour les contraintes.
Lorsque je pose la question sur la décision de ne pas appliquer de contraintes, les membres de l'équipe répondent:
Soit qu'ils ne savent même pas que de telles fonctionnalités existent dans leur base de données préférée. Cela est compréhensible pour les programmeurs utilisant uniquement des ORM, mais beaucoup moins pour les administrateurs de bases de données qui prétendent avoir plus de 5 ans d'expérience avec un SGBDR donné.
Ou qu'ils appliquent de telles contraintes au niveau de l'application et que la duplication de ces règles dans la base de données n'est pas une bonne idée, violant SSOT.
Plus récemment, je vois de plus en plus de projets dans lesquels même les clés étrangères ne sont pas utilisées. De même, j'ai lu quelques commentaires sur SE.SE qui montrent que les utilisateurs ne se soucient guère de l'intégrité référentielle, laissant l'application gérer.
En interrogeant les équipes sur le choix de ne pas utiliser de FK, elles disent que:
C'est PITA, par exemple, quand on doit supprimer un élément qui est référencé dans d'autres tables.
NoSQL est génial, et il n'y a aucune clé étrangère là-bas. Par conséquent, nous n'en avons pas besoin dans le SGBDR.
Ce n’est pas un gros problème en termes de performances (le contexte est généralement constitué de petites applications Web intranet fonctionnant sur de petits ensembles de données. Ainsi, même les index n’auraient pas trop d’importance; personne ne se soucierait de savoir si la performance d’une requête donnée dépassait 1,5 s. à 20 ms.)
Lorsque je regarde l'application elle-même, je remarque systématiquement deux tendances:
L’application nettoie correctement les données et les vérifie avant de les envoyer à la base de données. Par exemple, il n’existe aucun moyen de stocker une valeur
102
sous forme de pourcentage dans l’application.L'application suppose que toutes les données provenant de la base de données sont parfaitement valables. C’est-à-dire que s’il
102
s’agit d’un pourcentage, soit que quelque chose, quelque part, tombe en panne ou s’affiche simplement tel quel à l’utilisateur, menant à des situations étranges.Bien que plus de 99% des requêtes soient effectuées par une seule application, avec le temps, les scripts commencent à apparaître - soit des scripts exécutés manuellement si nécessaire, soit des tâches périodiques. Certaines opérations de données sont également effectuées manuellement sur la base de données elle-même. Les scripts et les requêtes SQL manuelles présentent un risque élevé d'introduire des valeurs non valides.
Et voici ma question:
Quelles sont les raisons pour modéliser des bases de données relationnelles sans contrainte de vérification et éventuellement sans clé étrangère?
Pour ce qui en vaut la peine, cette question et les réponses que j'ai reçues (en particulier l'intéressante discussion avec Thomas Kilian) m'ont amené à rédiger un article avec mes conclusions sur les contraintes de base de données .
la source
Réponses:
Il est important de distinguer les différents cas d'utilisation des bases de données.
La base de données professionnelle traditionnelle est accessible par plusieurs applications et services indépendants et peut-être directement par des utilisateurs autorisés. Il est essentiel de disposer d'un schéma bien pensé et de contraintes au niveau de la base de données, afin qu'un bogue ou un oubli dans une seule application ne corrompe pas la base de données. La base de données est critique pour l'entreprise, ce qui signifie que des données incohérentes ou corrompues peuvent avoir des résultats désastreux pour l'entreprise. Les données vivront éternellement pendant que les applications vont et viennent. Ce sont les emplacements qui peuvent avoir un DBA dédié pour assurer la cohérence et la santé de la base de données.
Mais il existe également des systèmes dans lesquels la base de données est étroitement intégrée à une seule application. Applications autonomes ou applications Web avec une seule base de données intégrée. Tant que la base de données est accessible exclusivement par une seule application, vous pouvez envisager des contraintes redondantes, à condition que l'application fonctionne correctement. Ces systèmes sont souvent développés par des programmeurs qui se concentrent sur le code d’application et n’ont peut-être pas une compréhension approfondie du modèle relationnel. Si l'application utilise un ORM, les contraintes peuvent être déclarées au niveau ORM sous une forme plus familière aux programmeurs d'applications. Dans le bas de gamme, nous avons des applications PHP qui utilisent MySQL. Pendant longtemps, MySQL n’a pas du tout supporté les contraintes de base. Il fallait donc s’appuyer sur la couche application pour assurer la cohérence.
Lorsque des développeurs de ces différents horizons se rencontrent, vous obtenez un choc de culture.
Dans ce mélange, nous obtenons la nouvelle vague de bases de données distribuées de "stockage en nuage". Il est très difficile de garder une base de données distribuée cohérente sans perdre les avantages en termes de performances. Par conséquent, ces bases de données évitent souvent les contrôles de cohérence au niveau de la base de données et permettent aux programmeurs de la gérer au niveau de l'application. Les différentes applications ont des exigences de cohérence différentes, et bien que le moteur de recherche de Google privilégie la disponibilité sur la cohérence de ses serveurs, je suis prêt à parier que son système de paie s'exécute sur une base de données relationnelle avec de nombreuses contraintes.
la source
De nos jours, de plus en plus de systèmes fonctionnent dans des environnements distribués, sur le cloud et adoptent la technique de "dimensionnement" au lieu de "redimensionnement". C'est encore plus important si vous utilisez des applications en ligne avec Internet, telles que des applications de commerce électronique.
Cela dit, toutes les applications supposées évoluer sont contraintes par le théorème CAP , où vous devez choisir 2 des 3: cohérence, disponibilité et tolérance de partition (tolérance aux pannes réseau).
En étudiant le théorème de la PAC, vous constaterez qu'il n'y a pas beaucoup de choix, mais de choisir de perdre la disponibilité ou la cohérence, car vous ne pouvez JAMAIS vraiment faire confiance au réseau 100% du temps.
En général, plusieurs applications peuvent se permettre d’être incohérentes pendant un laps de temps raisonnable, mais ne peuvent pas se permettre d’être indisponibles pour les utilisateurs. Par exemple, une chronologie légèrement non ordonnée sur Facebook ou Twitter est préférable à un accès illimité à une chronologie.
Ainsi, plusieurs applications choisissent de laisser tomber les contraintes de bases de données relationnelles, car les bases de données relationnelles sont très performantes en termes de cohérence, mais au détriment de la disponibilité.
Note personnelle: je suis aussi un peu démodé et je travaille avec de très vieux systèmes financiers où la cohérence des données est la plupart du temps une exigence primordiale, et je suis un grand fan des contraintes de base de données. Les contraintes de base de données constituent la dernière ligne de défense contre des années et des années de mauvais développement et les équipes de développeurs qui vont et viennent.
"Est modus in rebus". Continuons à utiliser la cohérence DB "de bas niveau" où la cohérence est une exigence de première classe. Mais parfois, le laisser partir n'est pas un grand péché après tout.
-- MODIFIER: --
Comme il y a une petite modification dans la question, il y a une autre raison légitime pour supprimer des contraintes dans la base de données, IMO. Si vous concevez un produit à partir de zéro et que votre système prend en charge la technologie multi-bases de données, vous pouvez vous contenter du plus petit dénominateur commun parmi les bases de données prises en charge, et éventuellement abandonner l'utilisation de toute contrainte, laissant ainsi toute la logique de contrôle. ton application.
Bien que cela soit légitime, c'est aussi une zone grise pour moi, car je ne trouve aucun moteur de base de données aujourd'hui qui ne prend pas en charge des contraintes simples comme celle proposée dans la question initiale.
la source
Premièrement, précisons que je ne parle ici que de RDBM, pas de bases de données non-SQL.
J'ai vu quelques bases de données sans FK ni PK, encore moins vérifier les contraintes, mais pour être honnête, elles sont minoritaires. Peut-être parce que je travaille dans une grande entreprise.
Au fil des années, je peux affirmer que certaines raisons peuvent être:
1,2 or 3
comme valeur, ou que la colonne « âge » doit être>= 0
est « ayant la logique métier dans la base de données » . Même les clauses par défaut sont considérées par certains comme une logique métier n'appartenant pas à une base de données, comme vous pouvez le constater dans plusieurs questions et réponses récentes de ce site. Les développeurs qui en tiennent compte utiliseraient évidemment le moins de contraintes possible et feraient tout en code, même l’intégrité référentielle et / ou l’unicité. Je pense que c'est une position extrême.Cela dit, je voudrais dire que les SGBDR sont des logiciels très avancés qui ont été construits sur des épaules de géants et se sont révélés très efficaces pour de nombreuses exigences métier, libérant les programmeurs de tâches mondaines de mise en œuvre de l'intégrité référentielle. de fichiers binaires ou de fichiers texte. Comme je le dis toujours, "nous ne vivons plus dans un monde avec une seule application, une base de données" . À tout le moins, un client SQL émettra des fichiers DML en plus de "l'application". Donc, la base de données doit se défendre des erreurs humaines ou de programmation dans une mesure raisonnable
Dans ces types d’exigences bien connus où le SGBDR n’évolue pas bien, nous incluons bien sûr la technologie no-SQL . Mais il est inquiétant de constater la prolifération des bases de données relationnelles sans contrainte, où des milliers de lignes de code (générées ou typées) sont consacrées à l'application de ce que le SGBDR devrait vous appliquer de manière plus efficace.
la source
Il existe des contraintes externes qui déterminent les décisions technologiques. Il existe peu de situations dans lesquelles vous avez le besoin et / ou le luxe d'utiliser régulièrement des contraintes de champ de base de données.
De nombreuses équipes de développement ne veulent pas donner trop de contrôle à un développeur de base de données. Vous avez de la chance si vous en avez plus d'un, les vacances sont donc très amusantes. Peu exigent un contrôle absolu sur le domaine de la base de données et assument la responsabilité de chaque requête, règle métier, performance, disponibilité, sécurité et des données transmises à quel type de RAID. Voici les procédures stockées que vous êtes autorisé à exécuter. S'amuser. Ne pense même pas à toucher une table.
la source
C’est un problème avec lequel j’ai lutté tout au long de ma carrière (près de 40 ans) et aussi lors de la rédaction de mon SGBD. Une description de mon point final est ici: http://unibase.zenucom.com . Alors voici mes pensées.
la source
Les contraintes de base de données étaient peut-être une bonne idée, mais qu'en est-il d'une utilisation pratique? Prenez votre contrainte de pourcentage. Si vous appliquez cela, votre base de données rejettera avec plaisir les pourcentages invalides. Puis? Vous aurez besoin d'une logique métier pour gérer l'exception. Ce qui signifie en réalité que la logique métier qui écrit un mauvais pourcentage a déjà échoué ailleurs. En bref, la seule contrainte pratique qui reste est celle que vous voyez (comme PK / FK).
la source
Percentage
classe, ou il y a une erreur dans la validation elle-même), par opposition à un cas exceptionnel (comme une connexion réseau est en panne). Pour moi, la violation devrait conduire à HTTP 500 pour une application Web ou à un blocage pour une application de bureau, puis être consigné et corrigé.Plus souvent, de nos jours, les gens utilisent des logiciels (par exemple Entity Framework) pour générer automatiquement des tableaux et des colonnes. L'idée est qu'ils n'ont pas besoin de compétences en SQL, libérant ainsi la capacité du cerveau.
Il est souvent irréaliste de penser que les logiciels vont "résoudre les problèmes", et cela ne crée pas les contraintes qu'un humain pourrait créer.
Pour de meilleurs résultats, créez des tables à l'aide de SQL et ajoutez des contraintes manuellement, mais certaines personnes ne peuvent pas le faire.
la source