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 puisque l'UUID / GUID est assez grand et qu'ils sont presque aléatoires. L'alternative consiste à utiliser un INT ou LONG auto-incrémenté.
Quels sont les inconvénients liés à l'utilisation de l'UUID ou du GUID en tant que clé primaire pour mes tables?
J'utiliserai probablement Derby / JavaDB (sur les clients) et PostgreSQL (sur le serveur) en tant que SGBD.
Réponses:
Cela dépend de votre fonction de génération et de la taille des tables finales
Les GUID sont conçus pour être des identificateurs globalement uniques . Comme indiqué dans la documentation de Postgres 8.3, il n'y a pas de méthodologies universellement appropriées pour générer ces identifiants, mais postgreSQL est fourni avec quelques candidats plus utiles.
Compte tenu de l’ampleur de votre problème et de la nécessité d’ écrire hors ligne , vous avez parfaitement bien défini l’utilisation de tout, sauf d’un GUID. Par conséquent, il n’ya aucun avantage compensatoire d’autres schémas.
D'un point de vue fonctionnel, la longueur de la clé n'est généralement pas un problème sur les systèmes modernes, en fonction du nombre de lectures et de la taille de la table. En tant que méthodologie alternative, les clients hors connexion pourraient regrouper de nouveaux enregistrements par lot sans clé primaire et les insérer simplement lors de la reconnexion. PostgreSQL offrant 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.
la source
{Node_ID, Item_ID}
où chaque nœud a unNode_ID
et unItem_ID
auto-incrémenté automatiquement par nœud.Encore un conseil: n'utilisez jamais de GUID dans le cadre d'un index clusterisé. Les GUID ne sont pas séquentiels. Par conséquent, s’ils font partie d’un index clusterisé, chaque fois que vous insérez un nouvel enregistrement, la base de données doit réorganiser toutes ses pages de mémoire afin de trouver le bon emplacement pour l’insertion. serait juste la dernière page.
Maintenant, regardons quelques réalisations de base de données: 1.) MySQL - les clés primaires sont en cluster, sans possibilité de changer le comportement - la recommandation est de ne pas utiliser de GUID du tout ici 2.) Postgres, MS-SQL - vous pouvez créer un GUID Clé primaire non clusterisée, et utilisez un autre champ comme index clusterisé, par exemple autoincrement int.
la source
database would need to rearrange all its memory pages to find the right place for insertion
=> Je ne pense pas que ce soit le cas avec Postgres, car la mise en cluster est facultative et les nouvelles lignes sont stockées non ordonnées.Ça dépend.
Sérieusement, avec tout ce que vous avez donné jusqu'à présent, c'est à peu près tout ce que vous pouvez aller.
Pourquoi serait-il utile d'utiliser des UUID? Pourquoi n'utilisez-vous pas les INT? Pourquoi ne pouvez-vous pas simplement indexer sur 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 de disques?
la source