web-dev-qa-db-fra.com

Guid vs INT - Quel est le meilleur comme clé primaire?

J'ai lu des raisons d'utiliser ou non Guid et int.

int est plus petit, plus rapide, facile à retenir, conserve une séquence chronologique. Et quant à Guid, le seul avantage que j'ai trouvé est qu'il est unique. Dans quel cas un Guid serait mieux que et int et pourquoi?

D'après ce que j'ai vu, int n'a pas de défauts, sauf par la limite de nombre, qui dans de nombreux cas ne sont pas pertinents.

Pourquoi exactement Guid a-t-il été créé? En fait, je pense qu'il a un but autre que de servir de clé primaire d'une table simple. (Un exemple d'une vraie application utilisant Guid pour quelque chose?)

(Guid = UniqueIdentifier) ​​type sur SQL Server

107
BrunoLM

Cela a été demandé dans Stack Overflow ici et ici .

Post de Jeff explique beaucoup de choses sur le pour et le contre de l'utilisation du GUID.

GUID Pros

  • Unique sur chaque table, chaque base de données et chaque serveur
  • Permet une fusion facile des enregistrements de différentes bases de données
  • Permet une distribution facile des bases de données sur plusieurs serveurs
  • Vous pouvez générer des ID n'importe où, au lieu d'avoir à aller-retour à la base de données
  • La plupart des scénarios de réplication nécessitent quand même GUID colonnes

Inconvénients du GUID

  • C'est un énorme 4 fois plus grand que la valeur d'index à 4 octets traditionnelle; cela peut avoir de graves conséquences sur les performances et le stockage si vous ne faites pas attention
  • Lourd à déboguer (where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • Les GUID générés doivent être partiellement séquentiels pour de meilleures performances (par exemple, newsequentialid() sur SQL Server 2005+) et pour permettre l'utilisation d'index clusterisés

Si vous êtes certain des performances et que vous ne prévoyez pas de répliquer ou de fusionner des enregistrements, utilisez int et définissez-le incrémentation automatique ( graine d'identité dans SQL Server ).

94
CoderHawk

Si vous synchronisez vos données avec une source externe, un GUID persistant peut être bien meilleur. Un exemple rapide de l'endroit où nous utilisons un GUID est un outil qui est envoyé au client à analyser leur réseau et effectuer certaines classes de découverte automatique, stocker les enregistrements trouvés, puis tous les enregistrements client sont intégrés dans une base de données centrale de notre côté. Si nous utilisions un entier, nous aurions 7 398 "1", et il serait beaucoup plus difficile de savoir quel "1" était lequel.

19
TML

J'ai utilisé avec succès une approche hybride. Les tables contiennent à la fois une colonne de clé primaire à incrémentation automatique id ET une colonne guid. guid peut être utilisé selon les besoins pour identifier de manière unique et globale la ligne et id peut être utilisé pour les requêtes, le tri et l'identification humaine de la ligne.

18
rmirabelle

Certaines bonnes pratiques mentionnent toujours que vous devez utiliser un type de données qui accepte le moins de mémoire possible l'ensemble des valeurs que vous allez utiliser. Par exemple, si vous l'utilisez pour stocker le nombre d'employeurs dans une petite entreprise et que vous avez peu de chances d'atteindre un 100, personne ne suggérera d'utiliser une valeur bigint alors que int (même smallint) le ferait.

Bien sûr, l'inconvénient est comme "Dites non à l'évolutivité!"


De plus, je sais que ce n'est pas totalement lié, mais il y a un autre facteur à ce sujet. Lorsque ce n'est pas excessif, j'essaie généralement de recommander d'utiliser une clé primaire non générée automatiquement, si cela a du sens. Par exemple, si vous enregistrez les informations du pilote, ne vous embêtez pas à créer une nouvelle colonne générée automatiquement pour "ID", utilisez simplement le numéro de licence.

Je sais que cela semble vraiment évident, mais je vois que cela est assez souvent oublié.

Pour le contexte: cette partie de la réponse a été abordée à partir d'une approche théorique des données, où vous voulez que votre PK soit l'identificateur de données unique pour un enregistrement. La plupart du temps, nous les créons lorsqu'ils existent déjà, d'où la réponse précédente.

Cependant, il est très rare que vous puissiez avoir un contrôle étroit sur ces points de données, et en tant que tel, vous devrez peut-être effectuer des corrections ou des ajustements. Vous ne pouvez pas faire cela avec les clés primaires (enfin, vous pouvez, mais cela peut être pénible).

Merci @VahiD pour les clarifications.

1
Alpha

L'utilisation d'identifiants d'incrémentation automatique peut entraîner une fuite d'informations sur votre activité commerciale. Si vous gérez une boutique et utilisez order_id pour identifier publiquement un achat, alors n'importe qui peut connaître votre nombre mensuel de ventes par simple arithmétique.

1
golopot

@rmirrabelle réponse ci-dessus - https://dba.stackexchange.com/a/96990/118371 est ce que je fais. Cependant, pour les projets à grande échelle, il existe une conception ultime.

Utilisation: un tableau de correspondance des clés

TableA

- ID int (PK)
- Data varchar(100)

TableAMap

- ID int (PK)
- UniversalID GUID (Indexed - nonclustered)

Comme d'autres l'ont expliqué dans ce fil, les GUID sont rarement nécessaires pour la réplication/importation/exprt de la base de données. Ainsi, au lieu d'avoir l'indicateur GUID sur la table principale, où il prend 8 octets supplémentaires par ligne, et où un index GUID sera ( par défaut) stocké sur le même volume; une table distincte (aka normalisation) vient à la rescousse.

Avec une table séparée, vos DBA sont libres de le stocker sur un autre disque plus lent. De plus, si le GUID est UNIQUEMENT nécessaire pour certains travaux par lots, vous pouvez créer l'index GUID juste avant qu'il ne soit nécessaire, puis le supprimer après.

0
Todd

Une autre chose avec la façon dont les GUID sont générés. mrdenny a correctement souligné que même si newsequentialid () est utilisé, le redémarrage des instances fait commencer les nouvelles valeurs par les "trous" laissés dans le traitement précédent. Une autre chose qui affecte les GUID "séquentiels" est la carte réseau. Si je me souviens bien, l'UID du NIC est utilisé dans le cadre de l'algorithme GUID. Si un NIC est remplacé, il n'y a aucune garantie que l'UID sera une valeur plus élevée pour maintenir l'aspect séquentiel des choses. Je ne sais pas non plus comment plusieurs NIC pourraient affecter l'affectation des valeurs en utilisant l'algorithme.

Juste une pensée et j'espère que je me souviens bien. Passez une bonne journée!

0
bobo8734