71 votes

Clés primaires composées et champ ID d'objet unique

J'ai hérité d'une base de données construite avec l'idée que les clés composites sont beaucoup plus idéal que d'utiliser un ID d'objet unique et que lors de la construction d'une base de données, un unique IDENTIFIANT unique doit jamais être utilisé en tant que clé primaire. Parce que j'ai été la construction d'un Rails avant la fin de cette base de données, j'ai rencontré de difficultés pour se conformer aux Rails conventions (si c'est possible, en utilisant des vues personnalisées et de quelques autres pierres précieuses pour gérer les clés composées).

Le raisonnement derrière ce schéma spécifique de la conception de la personne qui a écrit qu'il avait à faire avec la façon dont la base de données gère les champs ID dans un non de manière efficace et quand c'est la construction des indices, arbre de sortes sont imparfaits. Cette explication n'avait pas toute la profondeur et la je suis encore en train d'envelopper ma tête autour de la notion (je suis familiarisé avec l'utilisation des clés composites, mais pas 100% du temps).

Quelqu'un peut-il offrir des opinions ou ajouter plus de profondeur à ce sujet?

88voto

JeremyDWill Points 2181

La plupart des moteurs utilisés (MS SQL Server, Oracle, DB2, MySQL, etc.) ne serait pas l'expérience de problèmes notables à l'aide d'une clé de substitution du système. Certains peuvent même l'expérience d'un boost de performance de l'utilisation d'un substitut, mais les problèmes de performances sont très spécifiques à la plateforme.

En termes généraux, la clé naturelle (et, par extension, clé composite), versets clé de substitution débat a une longue histoire avec pas susceptible de "droit de réponse" en vue.

Les arguments en faveur des clés naturelles (singulier ou composite), généralement inclure certains des éléments suivants:

1) Ils sont déjà disponibles dans le modèle de données. La plupart des entités à modéliser déjà inclure un ou plusieurs des attributs ou des combinaisons d'attributs qui répondent aux besoins d'une clé pour les fins de la création de relations. L'ajout d'un attribut supplémentaire pour chaque table comprend une redondance inutile.

2) Ils éliminent le besoin de certains jointures. Par exemple, si vous avez des clients avec les codes, et les factures avec les numéros de facture (qui sont "naturelles" clés), et vous souhaitez récupérer tous les numéros de facture pour un client spécifique, le code, vous pouvez simplement utiliser "SELECT InvoiceNumber FROM Invoice WHERE CustomerCode = 'XYZ123'". Dans le classique de la clé de substitution approche, le SQL ressemblerait à quelque chose comme ceci: "SELECT Invoice.InvoiceNumber FROM Invoice INNER JOIN Customer ON Invoice.CustomerID = Customer.CustomerID WHERE Customer.CustomerCode = 'XYZ123'".

3) Ils contribuent à une plus universellement applicable approche de modélisation de données. Avec des clés naturelles, le même modèle peut être utilisé en grande partie inchangée entre les différents moteurs SQL. Beaucoup de clé de substitution approches utilisation spécifique du moteur SQL techniques pour la génération de clés, ce qui exige plus de spécialisation du modèle de données à mettre en œuvre sur différentes plates-formes.

Des Arguments pour les clés de substitution ont tendance à tourner autour de questions qui sont le moteur SQL spécifiques:

1) Ils permettent de faciliter les modifications apportées aux attributs lorsque les exigences d'affaires/changement des règles. C'est parce qu'ils permettent les données d'attributs pour être isolé dans une seule table. C'est principalement un problème pour SQL moteurs qui ne sont pas à mettre efficacement en œuvre le standard SQL constructions, tels que les Domaines. Lorsqu'un attribut est défini par un DOMAINE de déclaration, de modifications à l'attribut peut être effectuée schéma à l'échelle à l'aide d'un ALTER DOMAINE de l'instruction. Différents SQL moteurs ont différentes caractéristiques de performance pour la modification d'un domaine, et certains SQL moteurs de ne pas mettre en œuvre les DOMAINES à tous, de sorte que les données modeleurs compenser ces situations par l'ajout de clés de substitution pour améliorer la capacité à effectuer des changements d'attributs.

2) Ils permettent plus facilement mises en œuvre de simultanéité que des clés naturelles. Dans la clé naturelle cas, si deux utilisateurs travaillent simultanément avec la même information, comme un client de ligne, et l'un des utilisateurs modifie le naturel de la valeur de la clé, puis une mise à jour par le deuxième utilisateur échoue parce que le code qu'ils sont à jour n'existe plus dans la base de données. Dans la clé de substitution cas, la mise à jour du processus avec succès immuable parce que les valeurs d'ID sont utilisés pour identifier les lignes dans la base de données, pas mutable codes du client. Cependant, il n'est pas toujours souhaitable pour permettre à la deuxième mise à jour – si le code client changé, il est possible que le second utilisateur ne doit pas être autorisé à procéder à leur changement, car la véritable "identité" de la ligne a changé – le second utilisateur peut être mise à jour de la mauvaise ligne. Ni les clés de substitution, ni les clefs naturelles, par eux-mêmes, régler ce problème. Complet de la simultanéité des solutions doivent être traités en dehors de la mise en œuvre de la clé.

3) Ils fonctionnent mieux que les clefs naturelles. Le rendement est le plus directement touchés par le moteur SQL. Le même schéma de base de données mis en œuvre sur le même matériel à l'aide de différents SQL moteurs ont souvent radicalement différentes caractéristiques de performance, en raison de la SQL moteurs de stockage de données et de mécanismes de repérage. Certains moteurs SQL rapproche de plate-systèmes de fichiers, où les données sont stockées de manière redondante lorsque le même attribut, tel qu'un Code Client, apparaît à plusieurs endroits dans le schéma de base de données. Cette redondance de stockage par le moteur SQL peut causer des problèmes de performance lorsque des modifications doivent être apportées aux données ou de schéma. D'autres SQL moteurs de fournir une meilleure séparation entre le modèle de données et le stockage/système de récupération de données, permettant rapidement les changements de données et le schéma.

4) les clés de Substitution à mieux fonctionner avec certaines bibliothèques d'accès aux données et de l'interface graphique de cadres. En raison de la nature homogène de plus de clé de substitution de modèles (exemple: tous les relationnel clés sont des nombres entiers), les bibliothèques d'accès aux données, Formulaires, et GUI cadres peuvent travailler avec les données sans avoir besoin de connaissances particulières de données. Les clefs naturelles, en raison de leur nature hétérogène (les différents types de données, la taille, etc.), ne fonctionne pas aussi bien avec automatisés ou semi-automatisés outils et de bibliothèques. Spécialisé scénarios, comme embedded SQL, bases de données, la conception de la base de données avec une trousse d'outils à l'esprit, peuvent être acceptables. Dans d'autres scénarios, les bases de données sont de l'information d'entreprise des ressources, accessible simultanément par plusieurs plates-formes, applications, rapport de systèmes et de dispositifs, et donc ne fonctionnent pas aussi bien quand conçu avec un focus sur une bibliothèque ou un cadre. En outre, les bases de données conçu pour fonctionner avec les boîtes à outils de devenir un passif lors de la prochaine grande trousse est introduit.

J'ai tendance à tomber sur le côté naturel de touches (évidemment), mais je ne suis pas fanatique à ce sujet. En raison de l'environnement où je travaille, où tous les base de données que je aider à la conception peuvent être utilisés par une variété d'applications, j'utilise des clés naturelles pour la majorité de la modélisation de données, et rarement introduire des mères porteuses. Cependant, je ne sors pas de ma façon d'essayer de re-mettre en œuvre des bases de données existantes qui utilisent des substituts. La mère porteuse-clés systèmes fonctionnent très bien – pas besoin de changer quelque chose qui fonctionne déjà bien.

Il ya quelques excellentes ressources en discutant les avantages de chaque approche:

http://www.google.com/search?q=natural++clé de substitution+clé

http://www.agiledata.org/essays/keys.html

http://www.informationweek.com/news/software/bi/201806814

33voto

Darrel Miller Points 56797

Je développe des applications de base de données depuis 15 ans et je n'ai pas encore rencontré de cas où une clé non-substitut était un meilleur choix qu'une clé de substitution.

Je ne dis pas qu'un tel cas n'existe pas, je dis simplement que, lorsque vous prenez en compte les problèmes pratiques liés au développement réel d'une application qui accède à la base de données, les avantages d'une clé de substitution commencent à submerger la pureté théorique des non-utilisateurs. -surrogate clés.

22voto

Steven A. Lowe Points 40596

la clé primaire doit être constante et vide de sens; la non-substitution de clés généralement échec à l'un ou les deux exigences, finalement

  • si la clé n'est pas constante, vous disposez d'un futur problème de mise à jour qui peut être assez compliqué

  • si la clé n'est pas dénuée de sens, alors il est plus susceptible de changer, c'est à dire ne pas être constante; voir ci-dessus

prenons un simple exemple: un tableau d'Inventaire des objets. Il peut être tentant de faire le point numéro (numéro de produit, code à barres, code de la pièce, ou quoi que ce soit) la clé primaire, mais un an plus tard, tous les numéros d'articles de changement et vous êtes de gauche avec une très salissant mise à jour de l'ensemble du problème de base de données...

EDIT: il y a une autre question qui est plus pratique que philosophique. Dans de nombreux cas, vous allez trouver une ligne particulière d'une certaine manière, puis, plus tard, mettre à jour ou de le retrouver (ou les deux). Avec des clés composites il n'y a plus de données pour assurer le suivi et plus de contraintes dans la clause where pour le re-trouver ou de mettre à jour (ou de supprimer). Il est également possible que l'un des principaux segments peuvent avoir changé entre temps!. Avec une clé de substitution, il n'y a toujours qu'une seule valeur à conserver (la mère porteuse ID) et, par définition, il ne peut pas changer, ce qui simplifie de manière significative la situation.

11voto

Powerlord Points 43989

Il sonne comme la personne qui a créé la base de données est sur le naturel des touches de côté de la grande naturelles clés vs les clés de substitution à débat.

Je n'ai jamais entendu parler de problèmes avec btrees sur les champs ID, mais je n'ai pas étudié en profondeur les...

Je tombe sur la clé de substitution côté: Vous avez moins de répétition lors de l'utilisation d'une clé de substitution, parce que vous êtes seulement de répéter une seule valeur dans les autres tableaux. Depuis que les humains rarement des tables de jointure à la main, nous ne se soucient pas si c'est un nombre ou non. Aussi, puisqu'il n'y a qu'une taille fixe de la colonne à rechercher dans l'index, il est sûr de supposer des mères porteuses ont une plus rapide temps de recherche par clé primaire.

5voto

Jonathan Leffler Points 299946

L'utilisation de 'unique (objet) ID' champs simplifie les jointures, mais vous devriez viser à l'autre (éventuellement composite) touche toujours unique, ne PAS se détendre la non-null de contraintes et de NE maintenir la contrainte d'unicité.

Si le SGBD ne peut pas gérer entiers uniques effectivement, il a de gros problèmes. Cependant, à l'aide d'un " unique (objet)' ID et la clé d'autres n'utilisent plus d'espace (pour les indices) que juste de l'autre clé, et a deux index de mise à jour sur chaque opération d'insertion. Donc ce n'est pas un cadeau -- mais aussi longtemps que vous maintenez la clé d'origine, trop, alors vous serez OK. Si vous éliminez l'autre clé, vous êtes en rupture de la conception de votre système; l'enfer va barder finalement (et vous pourrait ou ne pourrait pas repérer que l'enfer s'est déchaîné).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X