Duplicata possible:
Comment aimez-vous vos clés primaires?
Je connais les avantages de l'utilisation d'un GUID, ainsi que les avantages de l'utilisation et de l'INT comme PK dans une base de données. Considérant qu'un GUID est essentiellement un INT 128 bits et un INT normal est 32 bits, l'INT est un économiseur d'espace (bien que ce point soit généralement théorique dans la plupart des systèmes modernes).
En fin de compte, dans quelles circonstances vous verriez-vous utiliser un INT comme PK plutôt qu'un GUID?
Kimberley Tripp (SQLSkills.com) a n article sur l'utilisation des GUID comme clés primaires. Elle déconseille cela en raison des frais généraux inutiles.
En plus d'être un mauvais choix lorsque vous devez synchroniser plusieurs instances de base de données, les INT présentent un inconvénient que je n'ai pas vu: les insertions se produisent toujours à une extrémité de l'arborescence d'index. Cela augmente la contention des verrous lorsque vous avez une table avec beaucoup de mouvement (car les mêmes pages d'index doivent être modifiées par des insertions simultanées, tandis que les GUID seront insérés partout dans l'index). Il peut également être nécessaire de rééquilibrer l'indice plus souvent si un arbre B * ou une structure de données similaire est utilisé.
Bien sûr, les int sont plus faciles à regarder lors des requêtes manuelles et de la construction des rapports, et la consommation d'espace peut s'additionner grâce aux utilisations FK.
Je serais intéressé de voir toutes les mesures de la qualité, par exemple SQL Server gère en fait les tables avec insertions importantes avec IDENTITY PK.
Pour répondre à votre question: Au final, dans quelles circonstances vous verriez-vous utiliser un INT comme PK plutôt qu'un GUID?
J'utiliserais un GUID si mon système avait une version en ligne/hors ligne qui, à l'intérieur de la version hors ligne, vous pouvez enregistrer des données et que les données sont retransférées au serveur un jour pendant une synchronisation. De cette façon , vous êtes sûr de ne pas avoir deux fois la même clé dans votre base de données.
l'INT est un économiseur d'espace (bien que ce point soit généralement théorique dans la plupart des systèmes modernes).
Mais non. Cela peut sembler à première vue, mais notez que la clé primaire de chaque table sera répétée plusieurs fois dans la base de données dans les index et comme clé étrangère dans d'autres tables. Et il sera impliqué dans presque toutes les requêtes contenant sa table - et de manière très intensive lorsqu'il s'agit d'une clé étrangère utilisée pour une jointure.
En outre, rappelez-vous que les processeurs modernes sont très, très rapides, mais RAM n'ont pas suivi. Le comportement du cache devient donc de plus en plus important. Et la meilleure façon d'obtenir un bon comportement du cache est d'avoir des données plus petites Ainsi, la différence apparemment non pertinente entre 4 et 16 octets pourrait bien entraîner une différence de vitesse notable. Pas nécessairement toujours - mais c'est quelque chose à considérer.
Nous avons des guides dans nos logiciels d'entreprise très complexes partout. Fonctionne en douceur.
Je pense que les Guids sont sémantiquement plus adaptés pour servir d'identifiants. Il est également inutile de s'inquiéter inutilement des performances tant que vous n'êtes pas confronté à ce problème. Attention à l'optimisation prématurée.
Il existe également un avantage avec la migration de base de données de toute sorte. Avec Guids, vous n'aurez aucune collision. Si vous tentez de fusionner plusieurs bases de données où des entrées sont utilisées pour l'identité, vous devrez remplacer leurs valeurs. Si ces anciennes valeurs ont été utilisées dans les URL, elles seront désormais différentes après le référencement SEO.
Lorsque vous comparez des valeurs telles que la relation entre clé primaire et clé étrangère, l'INT sera plus rapide. Si les tables sont indexées correctement et que les tables sont petites, vous ne verrez peut-être pas beaucoup de ralentissement, mais vous devrez l'essayer pour en être sûr. Les INT sont également plus faciles à lire et à communiquer avec d'autres personnes. C'est beaucoup plus simple de dire: "Pouvez-vous regarder l'enregistrement 1234?" au lieu de "Pouvez-vous consulter l'enregistrement 031E9502-E283-4F87-9049-CE0E5C76B658?"
Certains systèmes d'exploitation ne génèrent plus de GUID basés sur des fonctionnalités matérielles uniques (CPUID, MAC) car cela rendait le traçage des utilisateurs facile (problèmes de confidentialité). Cela signifie que l'unicité GUID n'est souvent plus aussi universelle que le pensent de nombreuses personnes.
Si vous utilisez une fonction d'auto-id de votre base de données, la base de données pourrait en théorie s'assurer absolument qu'il n'y a pas de duplication.
Si les données vivent dans une seule base de données (comme la plupart des données pour les applications que nous écrivons en général), j'utilise un IDENTITY
. Il est facile, destiné à être utilisé de cette façon, ne fragmente pas l'index cluster et est plus que suffisant. Vous manquerez d'espace à 2 milliards d'enregistrements (~ 4 milliards si vous utilisez des valeurs négatives), mais vous seriez de toute façon grillé si vous aviez autant d'enregistrements dans une table, puis vous avez un problème d'entreposage de données.
Si les données résident dans plusieurs bases de données indépendantes ou interfaces avec un service tiers, j'utiliserai le GUID
qui a probablement déjà été généré. Un bon exemple serait une table UserProfiles dans la base de données qui mappe les utilisateurs d'Active Directory à leurs profils d'utilisateur dans l'application via leur objectGUID
qu'Active Directory leur a assigné.
Si vous prévoyez de fusionner la base de données à un moment donné, c'est-à-dire pour une configuration de type de réplication multisite, Guid's vous épargnera beaucoup de douleur. Mais à part ça, je trouve Int plus facile.
Je pense toujours que les PK devraient être numériques là où c'est possible. N'oubliez pas que les GUID en tant que PK signifieront probablement qu'ils sont également utilisés dans d'autres tables comme clés foriegn, donc la pagination et l'index, etc. seront plus importants.
Je pense que la base de données est également importante. Du point de vue MySQL - généralement, plus le type de données est petit, plus les performances sont rapides.
Cela semble vrai pour int vs GUID aussi - http://kccoder.com/mysql/uuid-vs-int-insert-performance/
J'utiliserais GUID comme PK uniquement si cette clé est liée à une valeur similaire. Par exemple, l'ID utilisateur (les utilisateurs de WinNT sont décrits avec des GUID), ou l'ID du groupe d'utilisateurs. Un autre exemple. Si vous développer un système distribué pour la gestion des documents et différentes parties du système à différents endroits du monde peuvent créer des documents. Dans ce cas, j'utiliserais le GUID, car il garantit que 2 documents créés dans différentes parties du système distribué n'auraient pas le même identifiant .
Un INT est certainement beaucoup plus facile à lire lors du débogage et beaucoup plus petit.
Cependant, j'utiliserais un GUID ou similaire comme clé de licence pour un produit. Vous savez que ça va être unique, et vous savez que ça ne va pas être séquentiel.