Quels sont les avantages et les inconvénients de l'utilisation des clés primaires de plusieurs colonnes?

StackOverflow https://stackoverflow.com/questions/2204381

Question

Je voudrais voir un exemple de:

  • Lorsque cela est approprié
  • Lorsque cela ne convient pas

Y at-il un moment où le choix de la base de données ferait une différence pour les exemples ci-dessus?

Était-ce utile?

La solution

Cela semble vraiment être une question sur les touches de substitution les touches, qui sont toujours soit un numéro auto-incrémenter ou GUID et donc une seule colonne, par rapport à naturel , qui nécessitent souvent plusieurs éléments d'information afin d'être vraiment unique. Si vous êtes en mesure d'avoir une clé naturelle qui est une seule colonne, le point est évidemment discutable de toute façon.

Certaines personnes vont insister sur l'aide d'un ou l'autre. Passer suffisamment de temps avec les bases de données de travail de production et vous apprendrez qu'il n'y a pas de meilleure pratique indépendante du contexte.

Certaines de ces réponses utilisent la terminologie SQL Server, mais les concepts sont généralement applicables à tous les produits de SGBD:


Raisons d'utiliser des clés de substitution à une seule colonne:

  • index en cluster Un index ordonné en clusters effectue toujours mieux quand la base de données peut simplement y ajouter du contenu - sinon, le DB doit faire fractionnements . Notez que cela ne vaut que si la clé est séquentielle , à savoir soit une séquence auto-incrément ou un GUID séquentiel. GUIDs arbitraires seront probablement bien pire pour la performance.

  • Relations. Si votre clé est de 3, 4, 5 longues colonnes, y compris les types de caractères et d'autres données non compactes, vous finissez par perdre énormes montants de l'espace et ensuite réduire les performances si vous devez créer des relations clés étrangères à cette clé dans 20 autres tableaux.

  • Unicité. Parfois, vous ne le faites pas Vous une vraie clé naturelle. Peut-être que votre table est une sorte de journal, et il est possible pour vous d'obtenir deux du même événement en même temps. Ou peut-être votre vraie clé est quelque chose comme un chemin matérialisé qui ne peut être déterminé après la ligne est déjà insérée. De toute façon, vous voulez toujours votre index ordonné en clusters et / ou clé primaire d'être unique, donc si vous avez pas d'autres informations vraiment unique, vous n'avez pas d'autre choix que d'employer une clé de substitution.

  • Compatibilité. La plupart des gens ne jamais avoir à faire face à cela, mais si la clé naturelle contient quelque chose comme un hierarchyid, il est possible que certains systèmes ne peuvent même le lire. Dans ce cas, encore une fois vous doit créer une simple clé de substitution généré automatiquement pour une utilisation par ces applications. Même si vous ne disposez pas de données « bizarres » dans la clé naturelle, certaines bibliothèques DB ont beaucoup de mal à traiter avec les clés primaires multi-colonnes, bien que ce problème va rapidement loin.

Raisons d'utiliser des clés naturelles multi-colonnes

  • Stockage. Beaucoup de gens qui travaillent avec des bases de données ne fonctionnera jamais avec ceux assez grand pour avoir à se soucier de ce facteur. Mais quand une table a des milliards ou billions de lignes, vous allez vouloir garder le montant minimum des données dans ce tableau que vous pouvez.

  • réplication. Oui, vous pouvez utiliser un GUID ou un GUID séquentiel. Mais GUIDs ont leurs propres compromis, et si vous ne pouvez pas ou ne voulez pas utiliser un GUID pour une raison quelconque, une clé naturelle multi-colonne est un bien meilleur choix pour les scénarios de réplication, car il est intrinsèquement à l'échelle mondiale uniques - qui est, vous ne pas besoin d'un algorithme spécial pour le rendre unique, il est unique par définition . Cela rend très facile à raisonner sur des architectures distribuées.

  • Insérer / Mise à jour des performances . Surrogate keys ne sont pas libres. Si vous avez un ensemble de colonnes qui sont uniques et fréquemment sollicités, et vous devez donc créer un index de couverture sur ces colonnes; l'indice finit par être presque aussi grande que la table, ce qui gaspille l'espace et exige qu'un second indice mis à jour chaque fois que vous apportez des modifications. S'il est toujours possible pour vous d'avoir seulement un index (l'index cluster) sur une table, vous devriez le faire!


C'est ce qui vient à l'esprit dès le départ. Je mettrai à jour si je me souviens tout à coup quelque chose d'autre.

Autres conseils

Je pense qu'il est presque toujours mieux (du point de vue de développeur d'applications, au moins) à la clé primaire une clé générée automatiquement, et créer une contrainte UNIQUE et un index sur les colonnes multiples.

  • Avec une seule clé primaire générée automatiquement, vous serez en mesure d'ajouter facilement des références à ce tableau d'autres tables.
  • clés primaires générés automatiquement fonctionnent plus simplement avec les bibliothèques ORM.
  • En outre, si vos contraintes d'unicité changent à l'avenir, vous ne devez pas modifier les clés primaires existantes.

J'ai rencontré plusieurs situations induisant des maux de tête, car un DBA a pensé qu'une clé primaire à plusieurs colonnes serait toujours suffisante, et les besoins futurs changements prouvé ce incorrecte.

Vous presque toujours voulez une clé primaire, donc je suppose que le choix est entre le choix d'un deux colonnes existantes pour être la clé primaire, ou de faire une nouvelle auto-incrémentée PK et de mettre une contrainte unique ordinaire sur les deux colonnes à la place.

Si vous voulez une clé primaire 2 colonnes:

  • Si vous avez une table intermédiaire qui fait référence à deux autres tables et il est uniquement composé de deux clés étrangères, à savoir une relation plusieurs à plusieurs, alors il n'y a pas de point d'ajouter une colonne supplémentaire juste pour être une clé primaire. Utilisez les deux colonnes que vous avez déjà comme la clé primaire.

Si vous voulez une clé primaire auto-incrément:

  • Si vous faites référence à une table d'une autre table, vous voulez que la clé primaire de la table cible à petit, parce que les données sera répété comme la clé étrangère dans la table faisant référence. Vous voulez aussi être rapide pour comparer.
  • Chaque index que vous ajoutez à une table comprend une copie de la clé de clustering (qui est généralement la même que la clé primaire). Si votre clé de cluster est plus grand qu'il doit être, chaque index sur cette table sera plus grande qu'elle doit être aussi bien.

Quelques exemples ...

approprié:

  • systèmes OLTP, dans la plupart des situations où la mise en œuvre la plupart des plusieurs à plusieurs.

inapproprié:

  • Pour les tables de dimension dans les systèmes OLAP -. Vous voulez faire de votre clé de dimension aussi petite que possible afin que votre table de faits est aussi petit (et rapide) que possible

  • Pour les moments où vous n'êtes pas sûr si la combinaison est unique. Certes ceci est un exemple assez minable, mais une table « Personne » serait un mauvais choix pour un PK plusieurs colonnes.

Un exemple de quand il est approprié est quand vous avez une table de liaison avec les champs clés étrangers reliant différentes tables.

En général, il est probablement une bonne idée d'utiliser existant, identifier les champs comme votre clé primaire lorsque cela est possible. Si vous ne disposez pas d'un champ id naturel, et vous devez combiner beaucoup de champs pour obtenir un PK unique, il est probablement préférable d'utiliser un numéro d'auto. Les clés primaires avec plus de 2 champs peuvent obtenir en désordre.

Nous avons trouvé de fortes augmentations de performance dans notre application lorsque nous avons utilisé plusieurs colonnes indexs et les clés. Il nous a permis de créer des index sur nos requêtes les plus courantes et la table principale n'a même pas été accessible depuis toute clause select pourrait être dans l'index. Cependant, cela dépend de votre application et ensemble de données.

clés naturelles Parfois composites ont un sens intuitif. Par exemple. Supposons que vous avez une table pour une entreprise (PK est ComapnyId) avec quelques détails de la société dans les colonnes. Vous avez également une obligation de stocker le nom du PDG de la société thoughout son histoire. L'invariant naturel est qu'une entreprise peut avoir qu'un seul chef de la direction à la fois. Il est alors intuitif pour créer une table de CompanyCeo avec un composite de PK COMPANYID (un FK à COMPANYID dans le tableau Company) + FromDate. D'autres colonnes dans ce tableau peuvent être ToDate et CeoName. De cette façon, vous pouvez garantir que l'un et un seul chef de la direction peut commencer à une date donnée.

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