Les avantages et les inconvénients de GUID / UUID de la base de données de clés

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai travaillé sur un certain nombre de systèmes de base de données dans le passé, et le déplacement des entrées de bases de données ont été faites beaucoup plus facile si toutes les clés de bases de données avait été GUID / UUID des valeurs.J'ai pensé à y aller dans cette voie, à quelques reprises, mais il y a toujours un peu d'incertitude, en particulier autour de la performance et de l'onu-lecture-sur-la-téléphone-mesure Url.

Quelqu'un a travaillé avec les Guid dans une base de données?Quels avantages aurais-je obtenir en allant de cette façon, et ce sont probablement les pièges?

Était-ce utile?

La solution

Avantages:

  • Pouvez les générer en mode hors connexion.
  • Rend la réplication trivial (par opposition à l'int, ce qui le rend VRAIMENT dur)
  • L'ORM est généralement comme eux
  • Unique à travers les applications.Nous pouvons donc utiliser le PK est de notre CMS (guid) dans notre application (également guid) et nous savons que nous n'allons JAMAIS à obtenir un "clash".

Inconvénients:

  • Plus grande utilisation de l'espace, mais l'espace n'est pas cher(er)
  • Ne pouvez pas commander par ID pour obtenir l'insert de commande.
  • Peut moche dans une URL, mais vraiment, WTF faites-vous de mettre un RÉEL DB-clés dans l'URL!?
  • Plus difficile de le faire en manuel de débogage, mais pas difficile.

Personnellement, je les utiliser pour la plupart des PK est dans tout système d'une taille décente, mais je me suis "formés" sur un système qui a été reproduit partout, nous avons donc DÛ avoir.YMMV.

Je pense que les données en double chose c'est de la foutaise, vous pouvez obtenir des données en double cependant vous le faites.Les clés de substitution sont généralement mal vu où j'ai travaillé.Nous utilisons WordPress comme système si:

  • IDENTIFIANT unique de la ligne (GUID/whatever).Jamais visibles à l'utilisateur.
  • public ID est généré à la FOIS à partir d'un certain domaine (par ex.le titre - en faire le titre de l'article)

Mise à JOUR: Donc, ce qu'on obtient +1 ed beaucoup, et j'ai pensé que je devrais vous dire un énorme inconvénient de GUID PK est:Les Index En Cluster.

Si vous avez beaucoup de dossiers, et d'un index cluster sur un GUID, votre la performance de l'insert va SUCER, que vous obtenir des inserts dans des endroits aléatoires dans la liste des éléments (c'est le point), pas à la fin (ce qui est rapide)

Donc, si vous avez besoin d'insérer des performances, peut-être utiliser un auto-inc INT, et de générer un GUID si vous voulez le partager avec quelqu'un d'autre (c'est à dire, le montrer à un utilisateur dans l'URL)

Autres conseils

@Matt Sheppard:

Disons que vous avez une table de clients.Vous ne voulez sûrement pas un client d'exister dans la table plus d'une fois, ou il y a beaucoup de confusion va se passer tout au long de vos ventes et de la logistique ministères (en particulier si plusieurs lignes sur le client contiennent des informations différentes).

Si vous avez un numéro de client unique, qui identifie le client et vous assurez-vous que l'identifiant est connu par le client (factures), de sorte que le client et le service à la clientèle de gens ont une référence commune dans le cas où ils ont besoin de communiquer.Pour garantir l'absence d'dupliqué les enregistrements de client, vous ajoutez un caractère unique-contrainte à la table, soit par le biais d'une clé primaire sur l'identificateur du client ou par l'intermédiaire d'un PAS NULL + contrainte UNIQUE sur le numéro de client de la colonne.

Ensuite, pour une raison quelconque (que je ne peux pas penser de), vous êtes invité à ajouter un GUID de la colonne à la table des clients et faire que la clé primaire.Si l'identificateur du client colonne est maintenant à gauche sans unicité de garantie, vous demandez pour de futures difficultés tout au long de l'organisation car les Guid sera toujours unique.

Certains "architecte" peut vous dire que "oh, mais nous nous occupons de la réel client contrainte d'unicité dans notre app niveau!".La droite.Fashion concernant l'usage général des langages de programmation et (surtout) de niveau intermédiaire cadres change tout le temps, et de façon générale à vivre votre base de données.Et il ya une très bonne chance que vous allez à un certain point besoin d'accéder à la base de données sans passer par la présente demande.== Difficulté.(Mais heureusement, vous et "l'architecte" ont disparu depuis longtemps, de sorte que vous ne sera pas là pour nettoyer le gâchis.) En d'autres termes:Ne maintenir évident contraintes dans la base de données (et dans d'autres niveaux, ainsi, si vous avez le temps).

En d'autres termes:Il peut y avoir de bonnes raisons pour ajouter GUID des colonnes dans les tableaux, mais s'il vous plaît, ne tombez pas dans la tentation de faire que la baisse de vos ambitions, pour plus de cohérence au sein de l' réel (==non-GUID) de l'information.

Les principaux avantages sont que vous pouvez créer un id unique, sans connexion à la base de données.Et id sont uniques au monde, de sorte que vous pouvez facilement combiner des données provenant de différentes bases de données.Ceux-ci semblent comme des petits avantages, mais ont m'a sauvé beaucoup de travail dans le passé.

Les principaux inconvénients sont un peu plus d'espace de stockage nécessaire (pas un problème sur les systèmes modernes) et les id ne sont pas vraiment lisible par l'homme.Cela peut être un problème lors du débogage.

Il y a quelques problèmes de performance comme la fragmentation de l'index.Mais ceux-ci sont facilement résoluble (peigne guid par jimmy nillson: http://www.informit.com/articles/article.aspx?p=25862 )

Modifier fusionné mes deux réponses à cette question

@Matt Sheppard, je pense qu'il veut dire que vous pouvez dupliquer des lignes avec différentes Guid comme clés primaires.C'est un problème avec n'importe quel type de clé de substitution, et pas seulement de Guid.Et comme il le dit, il est facilement résolu par l'ajout significatif unique contraintes de non-colonnes de clé.L'alternative est d'utiliser une clé naturelle et ceux qui ont de réels problèmes..

Guid peut vous causer beaucoup de problème à l'avenir, si elles sont utilisées comme des "uniqifiers", laissant dupliqué données dans vos tables.Si vous souhaitez utiliser le Guid, veuillez considérer encore le maintien d'UNIQUE-des contraintes sur l'autre colonne(s).

Pourquoi plus personne ne mentionne la performance?Lorsque vous avez plusieurs jointures, tous basés sur ces vilaines Guid les performances vont à travers le plancher, là :(

Un autre petit problème à prendre en compte avec l'aide de GUID comme clés primaires si vous utilisez également cette colonne comme un index cluster (une pratique relativement courante).Vous allez prendre un coup sur insérer en raison de la nature d'un guid pas commencer séquentielle de toute façon, donc leur sera le fractionnement des pages, etc lorsque vous insérez.Juste quelque chose à considérer si le système est en train d'avoir une forte IO...

primaire-clés-id-versus-guid

Le Coût de Guid comme Clés Primaires (SQL Server 2000)

Les mythes, les GUID vsAutoincrement (MySQL 5)

C'est vraiment ce que vous voulez.

UID Pros

  • Unique au sein de chaque table, chaque base de données, chaque serveur
  • Permet la fusion de documents à partir de différentes bases de données
  • Permet de faciliter la diffusion des bases de données sur plusieurs serveurs
  • Vous pouvez générer des Identifiants de n'importe où, au lieu d'avoir à aller à la base de données
  • La plupart des scénarios de réplication nécessite GUID colonnes de toute façon

GUID Cons

  • C'est un énorme 4 fois plus grande que la traditionnelle 4 octets valeur de l'indice;cela peut avoir de graves performance et le stockage des implications si vous ne faites pas attention
  • La lourdeur de debug (où userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • L'généré Guid doit être partiellement séquentielle pour de meilleurs performances (par exemple, newsequentialid() sur SQL 2005) et à permettre l'utilisation de l'index en cluster

Il y a une chose qui n'est pas vraiment abordée, à savoir à l'aide de aléatoire (UUIDv4) Id de clé primaires va nuire à la performance de l' index de clé primaire.Il va se passer si votre tableau est ordonné autour de la clé.

Sgbdr généralement assurer de l'unicité des clés primaires, et d'assurer les recherches par clé, dans une structure appelée Arbre, qui est un arbre de recherche avec un grand facteur de branchement (un arbre de recherche binaire est un facteur de branchement de 2).Maintenant, un séquentiel d'identification entier serait la cause de la insère à se produire un côté de l'arbre, laissant la plupart des nœuds feuilles intactes.L'ajout aléatoire Uuid sera la cause de la insertions de diviser les nœuds feuilles tous les cours de l'indice.

De même, si les données stockées est essentiellement temporelle, c'est souvent le cas que les données les plus récentes qui doit être accessible et rejoint à l'encontre de la plupart.Avec un Uuid les modèles ne bénéficient pas de ce, et va frapper plus les lignes d'index, donc besoin de plus de l'index des pages en mémoire.Avec séquentielle Id si la plus récente des données est le plus nécessaire, le chaud, les pages d'index nécessiterait moins de RAM.

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