83 votes

Quelle est votre opinion sur l'utilisation des UUID comme identificateurs de lignes de base de données, en particulier dans les applications Web?

J'ai toujours préféré utiliser des entiers longs que les clés primaires dans les bases de données, de la simplicité et de la (supposée) de la vitesse. Mais lors de l'utilisation d'un REPOS ou de Rails-comme le schéma d'URL pour les instances de l'objet, je ne puis la fin avec l'Url comme ceci:

http://example.com/user/783

Et puis, l'hypothèse est qu'il existe aussi des utilisateurs avec des Id de 782, 781, ..., 2 et 1. En supposant que la web app en question est suffisamment sécurisé pour empêcher les gens d'entrer d'autres numéros pour afficher d'autres utilisateurs sans autorisation, une simple séquentiellement attribué clé de substitution aussi les "fuites" le nombre total de cas (plus de celui-ci), dans ce cas, les utilisateurs, ce qui pourrait être à l'information privilégiée. (Par exemple, je suis utilisateur #726 en stackoverflow.)

Serait un UUID/GUID être une meilleure solution? Ensuite, j'ai pu configurer les Url comme ceci:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

Pas exactement succinct, mais il y a moins implicite des informations sur les utilisateurs sur l'écran. Bien sûr, c'est un bel exemple de la "sécurité par l'obscurité", ce qui n'est pas un substitut pour une bonne sécurité, mais il semble au moins un peu plus sécurisé.

Cet avantage est-il en vaut le coût et la complexité de la mise en œuvre des Uuid pour le web-adressable instances de l'objet? Je pense que j'avais encore envie d'utiliser les colonnes de type entier en tant que base de données PKs juste pour accélérer les jointures.

Il y a aussi la question de la représentation de la base de données des Uuid. Je sais MySQL stocke sous forme de 36 chaînes de caractères. Postgres semble plus efficace de la représentation interne (128 bits?) mais je n'ai pas essayé moi-même. Quelqu'un a une expérience avec cela?


Mise à jour: pour ceux qui ont posé la question simplement en utilisant le nom d'utilisateur dans l'URL (par exemple, http://example.com/user/yukondude), qui fonctionne très bien pour des instances d'objets dont les noms sont uniques, mais quid des zillions de web app objets qui peuvent vraiment être identifié par un numéro? Les commandes, les transactions, les factures, copie de l'image noms, stackoverflow questions, ...

34voto

Douglas Tosi Points 1364

Je ne peux pas dire sur le côté Web de votre question. Mais les uuids sont parfaits pour les applications à plusieurs niveaux. La génération de PK peut être décentralisée: chaque client génère son propre pk sans risque de collision. Et la différence de vitesse est généralement faible.

Assurez-vous que votre base de données prend en charge un type de données de stockage efficace (16 octets, 128 bits). À tout le moins, vous pouvez encoder la chaîne uuid en base64 et utiliser char (22).

Je les ai beaucoup utilisées avec Firebird et je les recommande.

27voto

Adam Tuttle Points 7982

Pour ce que ça vaut, j'ai vu une procédure stockée longue (plus de 9 secondes) chuter à quelques centaines de millisecondes simplement en passant de clés primaires GUID à des entiers. Cela ne veut pas dire que l’ affichage d’ un GUID est une mauvaise idée, mais comme d’autres l'ont déjà fait remarquer, les joindre et les indexer, par définition, ne seront pas aussi rapides que des entiers.

23voto

SQLMenace Points 68670

Je peux vous répondre que dans SQL server si vous utilisez un type uniqueidentifier (GUID) type de données et l'utilisation de la fonction NEWID() pour créer des valeurs, vous obtiendrez horrible en raison de la fragmentation de la page se divise. La raison en est que lors de l'utilisation de NEWID() la valeur générée n'est pas séquentielle. SQL 2005 ajouté le NEWSEQUANTIAL() fonction pour remédier à cela

Une façon de toujours utiliser le GUID et int est d'avoir un guid et un int dans un tableau afin de le guid des cartes à l'int. le guid est utilisé à l'extérieur, mais de l'int en interne dans la DB

par exemple

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1 et 2 seront utilisés dans les jointures et les guid dans l'application web. Ce tableau sera assez étroit et devrait être assez rapide à la requête

10voto

Jonathan Arkell Points 4265

Pourquoi votre couple de clé primaire avec votre URI?

Pourquoi ne pas avoir votre URI clé être lisible par un humain (ou impossible à deviner, en fonction de vos besoins), et votre index primaire entier en fonction, de cette façon, vous obtenez le meilleur des deux mondes. Beaucoup de logiciel de blog le fait, où la surface exposée de l'id de l'entrée est identifiée par un 'slug', et l'identifiant numérique est caché à l'intérieur du système.

L'avantage ici est que vous avez maintenant une très belle structure de l'URL, ce qui est bon pour le RÉFÉRENCEMENT. Évidemment, pour une opération ce n'est pas une bonne chose, mais pour quelque chose comme stackoverflow, il est important (voir l'URL en haut...). Obtenir l'unicité n'est pas si difficile. Si vous êtes vraiment intéressé, de stocker une table de hachage de la limace à l'intérieur d'un tableau quelque part, et d'effectuer une recherche avant d'insertion.

4voto

Marius Points 1296

Nous utilisons des GUID en tant que clés primaires pour toutes nos tables, car elles font également office de RowGUID pour la réplication MS SQL Server. C'est très facile lorsque le client ouvre soudainement un bureau dans une autre partie du monde ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X