Question

Je me rends compte cette question peut sembler un peu sur le côté « vert », mais après le nombre de bases de données « entreprise » ou « commerciale », je l'ai rencontré, j'ai commencé à poser cette question. Quels sont les avantages de contraintes à fournir une base de données? Je demande plus sur les clés étrangères plutôt que des contraintes uniques. Est-ce qu'ils offrent des gains de performance, ou tout simplement l'intégrité des données?

J'ai été assez surpris par le nombre de bases de données relationnelles sans clés étrangères ou même sans clés primaires spécifiées (seulement des contraintes sur les champs étant non nul ou une contrainte unique sur le terrain).

Pensées

Était-ce utile?

La solution

l'intégrité des données "juste"? Vous dites que, comme il est une chose mineure. Dans toutes les applications, il est essentiel. Alors oui, il prévoit que, et il est un énorme avantage.

Autres conseils

L'intégrité des données est ce qu'ils offrent. Si tout ce qu'ils ont un coût de performance (un très mineur au moins).

Ils fournissent à la fois l'intégrité de la performance et les données, et celle-ci est primordiale pour tout système sérieux. Je grince des dents chaque fois que je vois une base de données sans clés étrangères et où toute l'intégrité se fait par les déclencheurs (le cas échéant). Et je voyais un peu de ceux là.

Ce qui suit, en supposant obtenir la contrainte droite en premier lieu: -

  • Vos données seront valables par rapport à la contrainte
  • La base de données connaît vos données seront valables par rapport à la contrainte et peut utiliser lors de l'interrogation ou la mise à jour la base de données (par exemple la suppression d'une inutile pour rejoindre une requête sur une vue)
  • La contrainte est documentée pour les futurs utilisateurs de la base de données
  • Une violation de la contrainte sera prise le plus tôt possible; pas dans un processus sans rapport avec la suite qui ne

En théorie relationnelle, une base de données qui permet à des données incohérentes est pas vraiment une base de données relationnelle. Les clés étrangères sont nécessaires pour l'intégrité et la cohérence des données pour maintenir la base de données « relationnelle »; à savoir le modèle logique de la base de données est toujours correct.

En pratique, il est généralement plus facile de définir une clé étrangère et de laisser la poignée du moteur DB assurant que la relation est valide. Les autres options sont:

  • rien - la corruption de données garantie à un moment donné
  • DB déclenche - qui sera généralement plus lent et moins performant
  • code d'application - qui finira par causer des problèmes lorsque soit vous oubliez d'appeler le droit les accès de code ou une autre application la base de données.

Les données sont un atout. Beaucoup de manuels indiquent que.

Mais il est en fait mal. Il faut plutôt dire « données correctes est un atout, des données incorrectes est une responsabilité ».

Et les contraintes de base de données vous donnent la meilleure garantie possible que les données sont correctes.

Dans certains DBMS (par exemple Oracle) Les contraintes peuvent réellement améliorer les performances de certaines requêtes, puisque l'optimisateur peut utiliser les contraintes pour acquérir des connaissances sur la structure des données. Pour quelques exemples, voir cet article Oracle Magazine .

Je dirais que toutes les contraintes nécessaires doivent être dans la base de données. les clés étrangères empêchent les données inutilisables. Ils ne sont pas agréable d'avoir - ils sont une exigence sauf si vous voulez une base de données inutiles. Les clés étrangères peuvent blesser les performances des suppressions et des mises à jour, mais c'est OK. Est-il préférable de prendre un peu plus de temps pour faire une suppression (ou de dire l'application de ne pas supprimer cette personne parce qu'il a des ordres dans le système) ou de supprimer l'utilisateur, mais pas ses données? Le manque de clés étrangères peut entraîner des problèmes inattendus et souvent graves dans l'interrogation des données. Par exemple, les rapports sur les coûts peuvent dépendre de toutes les tables ayant des données liées et peuvent donc ne pas afficher les données importantes, car une ou plusieurs tables ont rien à joindre.

Les contraintes uniques sont aussi une exigence de tout databse décent. Si un champ ou un groupe de champs doit être unique, à ne pas définir ce à la base de données est leve problèmes de données tocreate qui sont extrêmement difficiles à corriger.

Vous ne mentionnez pas d'autres contraintes, mais vous devriez. Toute règle d'affaires qui doit toujours être appliquée à toutes les données dans le tableau doit toujours être appliqué dans la base de données via un type de données (par exemple un type de DataTime qui willnot accepte '02 \ 31 \ 2009' comme date valide), une contrainte (par exemple qui ne permet pas le champ d'avoir une valeur supérieure à 100) ou par l'intermédiaire d'un déclencheur est la logique est donc complexe, il ne peut pas être manipulé par une contrainte ordinaire. (Les triggers sont difficiles à écrire si vous ne savez pas ce que vous faites, donc si vous avez la logique de ce complexe, vous avez, espérons-aDatabase professionnelle de votre équipe.) L'ordre est important. Datatypes sont le premier choix, suivi par des contraintes, suivi par les déclencheurs comme un dernier choix.

Code de l'application Simpler

Une bonne chose qu'ils fournissent est que votre code d'application doit faire beaucoup moins de vérification des erreurs et de validation. Contraste ces deux bits de code et multiplier par des milliers d'opérations et vous pouvez voir qu'il ya une grande victoire.

get department number for employee  # it's good coz of constraints
do something with department number

vs.

get department number for employee
if department number is empty
    ...
else if department number not in list of good department numbers
    ....
else
    do something with department number

Bien sûr, les gens qui ne tiennent pas compte des contraintes probablement ne pas mettre beaucoup d'efforts dans la validation de code de toute façon ...: - /

Oh, et si les contraintes de données changent, il est un problème de configuration de base de données et non un problème de changement de code.

Les contraintes d'intégrité sont particulièrement importantes lorsque vous intégrez plusieurs applications en utilisant une base de données partagée.

Vous pouvez être en mesure de gérer correctement l'intégrité des données dans le code d'une application unique (et même si vous n'êtes pas, au moins les données cassée ne concerne que cette application), mais avec plusieurs applications, il devient poilu (et au moins redondant ).

« Oh, et si les contraintes de données changent, il est un problème de configuration de base de données et non un problème de changement de code. »

A moins qu'il est une contrainte qui disparaît de la conception. Dans ce cas, il y a certainement un impact de code, car un code aurait été écrit qui dépend de cette contrainte retirée d'être là.

Cela doit toujours être pris en considération lorsque « le relâchement » ou « supprimer » toute contrainte déclarée.

Autre que cela, vous êtes bien sûr tout à fait raison.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top