web-dev-qa-db-fra.com

Quels sont les inconvénients de l'utilisation de l'UUID ou de GUID comme clé primaire?

Je voudrais construire un système distribué. J'ai besoin de stocker des données dans des bases de données et il serait utile d'utiliser un UUID ou un GUID comme clé primaire sur certaines tables. Je suppose que c'est un inconvénient avec cette conception car l'UUID/GUID est assez grand et ils sont presque aléatoires. L'alternative consiste à utiliser un INT ou LONG incrémenté automatiquement.

Quels sont les inconvénients de l'utilisation de UUID ou GUID comme clé primaire pour mes tables?

J'utiliserai probablement Derby/JavaDB (sur les clients) et PostgreSQL (sur le serveur) comme SGBD.

62
Jonas

Cela dépend de votre fonction de génération et de la taille des tables finales

Les GUID sont censés être des identificateurs uniques au monde. Comme discuté dans la documentation Postgres 8. il n'y a pas de méthodologies universellement appropriées pour générer ces identifiants, mais postgreSQL est livré avec quelques candidats plus utiles.

D'après l'étendue de votre problème et la nécessité d'écrire hors ligne, vous avez très bien défini l'utilisation de tout sauf d'un GUID, et il n'y a donc pas d'avantages compensatoires d'autres régimes.

D'un point de vue fonctionnel, la longueur de la clé n'est généralement pas un problème sur tout type de système moderne, selon le nombre de lectures et la taille de la table. Comme méthode alternative, les clients hors ligne peuvent regrouper de nouveaux enregistrements par lots sans une clé primaire et simplement les insérer lors de la reconnexion. Comme postgreSQL propose le type de données "Série", les clients n'auront jamais besoin de déterminer l'ID s'ils peuvent effectuer une simple écriture dans la base de données.

29

Un autre conseil: n'utilisez jamais de GUID dans le cadre d'un index clusterisé. Les GUID ne sont pas séquentiels, donc s'ils font partie d'un index clusterisé, chaque fois que vous insérez un nouvel enregistrement, la base de données devra réorganiser toutes ses pages mémoire pour trouver le bon endroit pour l'insertion, dans le cas de l'incrémentation automatique int (bigint), elle serait juste la dernière page.

Maintenant, si nous regardons certaines réalisations db: 1.) MySQL - les clés primaires sont regroupées, sans possibilité de changer de comportement - la recommandation est de ne pas utiliser du tout de GUID ici 2.) Postgres, MS-SQL - vous pouvez faire GUID en tant que clé primaire non clusterisée, et utilisez un autre champ comme index cluster, par exemple auto-incrémentation int.

22
Ross Ivantsiv

Ça dépend.

Sérieusement, avec tout ce que vous avez donné jusqu'à présent, c'est à peu près aussi loin que possible.

Pourquoi serait-il utile d'utiliser des UUID? Pourquoi n'utilisez-vous pas les INT? Pourquoi ne pouvez-vous pas simplement indexer les UUID plus tard? Comprenez-vous ce que signifie avoir une liste triée avec la clé d'un UUID et insérer un UUID aléatoire (non séquentiel) après quelques millions de lignes?

Sur quelle plateforme cela fonctionnera-t-il? Combien de disques? Combien d'utilisateurs? Combien d'enregistrements?

3
jcolebrand