Quelle est votre opinion sur l'utilisation des Uuid comme ligne de base de données des identifiants, 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 RESTE 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 alors 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, ...
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas le dire sur le site web de votre question. Mais uuid sont parfaits pour des applications n-tier. PK génération peut être décentralisée: chaque client génère sa propre pk sans risque de collision.
Et la différence de vitesse est généralement de petite taille.
Assurez-vous que votre base de données prend en charge un stockage efficace de type de données (16 octets, 128 bits).
Au moins, vous pouvez encoder les uuid de la chaîne base64 et l'utilisation de char(22).
J'ai utilisé intensivement avec Firebird et ne le recommande.
Pour ce que ça vaut, j'ai vu une longue procédure stockée (9 secondes) baisse de seulement quelques centaines de millisecondes de temps tout simplement par le passage de GUID clés primaires pour les entiers. Cela ne veut pas dire affichage un GUID est une mauvaise idée, mais, comme d'autres l'ont souligné, de se joindre à eux, et de les indexer, par définition, ne vont pas n'importe où près aussi rapide qu'avec des nombres entiers.
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() la fonction afin de remédier à cette
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
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 pour la requête
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.
edit: Stackoverflow n'est pas tout à fait utiliser le système que je décris, voir Guy de commentaire ci-dessous.
Plutôt que l'Url comme ceci:
Pourquoi pas:
Qui est convivial pour les humains et n'a pas de fuite de peu de renseignements?
Vous pouvez utiliser un entier qui est lié au numéro de la ligne, mais n'est pas séquentielle. Par exemple, vous pourriez prendre la 32 bits de la séquence ID et les réorganiser avec un régime (par exemple, le bit 1 devient le bit 6 bit 2 devient le bit 15, etc..).
Ce sera une bidirectionnel de chiffrement, et vous serez sûr que les deux Identifiants différents aurez toujours différents cryptages.
Il serait évidemment facile à décoder, si l'on prend le temps de générer suffisamment d'IDs et d'obtenir le schéma, mais, si je comprends bien votre problème, vous voulez juste ne pas donner d'informations trop facilement.
Nous utilisons Guid comme clés primaires pour l'ensemble de nos tables car il sert aussi de RowGUID pour MS SQL Serveur de Réplication. Il est très facile lorsque le client ouvre tout à coup un bureau dans une autre partie du monde...
Je ne pense pas qu'un GUID vous donne de nombreux avantages. Les utilisateurs de la haine de long, incompréhensible Url.
Créer un court d'ID que vous pouvez mapper à l'URL, ou de faire respecter un nom d'utilisateur unique convention (http://example.com/user/brianly). Le gars à 37Signals serait probablement se moquer de vous pour s'inquiéter de quelque chose comme cela quand il s'agit d'une application web.
D'ailleurs vous pouvez forcer votre base de données pour commencer à créer integer Id à partir d'une valeur de base.
Il dépend aussi de ce que vous vous souciez de votre application. Pour la n-tier apps Guid/Uuid sont plus simples à mettre en œuvre et sont plus faciles à port entre les différentes bases de données. Pour produire Entier clés de certains support de base de données un objet séquence en mode natif, et certains exigent de construction sur mesure d'une séquence de la table.
Entier clés probablement (je n'ai pas de chiffres), ce qui donne un avantage pour les requêtes et les performances de l'indexation ainsi que l'utilisation de l'espace. Direct DB interrogation est aussi beaucoup plus facile en utilisant les touches numériques de la, moins de copier/coller car ils sont plus faciles à retenir.
Je travaille avec un étudiant en gestion de système qui utilise l'UUID est sous la forme d'un entier. Ils ont une table qui détiennent le prochain numéro d'identification unique.
Bien que c'est probablement une bonne idée d'un point de vue architectural, il permet de travailler sur une base quotidienne difficile. Il est parfois nécessaire de faire des insertions et avoir un UUID rend cela très difficile, nécessitant généralement la rédaction d'un curseur au lieu d'une simple instruction SELECT INTO.
J'ai essayé les deux, dans la vraie web apps.
Mon avis est qu'il est préférable d'utiliser des nombres entiers et ont court, compréhensible url.
En tant que développeur, il se sent un peu horrible de voir séquentielle entiers et sachant que certaines informations au sujet de total le nombre d'enregistrement est une fuite, mais honnêtement la plupart des gens ne se soucient pas, et que l'information n'a jamais été vraiment à l'essentiel de mes affaires.
Avoir longtemps laid UUID url me semble beaucoup plus d'un tour hors des utilisateurs normaux.
Je pense que c'est l'un de ces problèmes qui causent la quasi-religieux, des débats, et de son quasi-inutile d'en parler. Je dirais simplement utiliser ce que vous préférez. Dans 99% des systèmes, il n'aura que soit le type de clé que vous utilisez, de sorte que les avantages (dit dans les autres posts) de l'utilisation d'un tri sur l'autre ne sera jamais un problème.
Je pense que l'utilisation d'un GUID serait le meilleur choix à faire dans votre situation. Il prend plus de place mais c'est plus sûr.
Youtube utilise 11 caractères avec l'encodage base64 qui offre 11^64 posibilités, et ils sont en général assez facile à écrire. Je me demande si cela offre de meilleures performances qu'un UUID. UUID converti en base 64 serait le double de la taille, je crois.
Plus d'informations peuvent être trouvées ici: https://www.youtube.com/watch?v=gocwRvLhDf8
Aussi longtemps que vous utilisez une base de données avec système de stockage efficace, le disque dur est bon marché ces jours de toute façon...
Je sais GUID peut être une b*tch de travailler avec, à certains moments, et de venir avec certains de requête surcharge cependant, d'un point de vue sécurité, ils sont un sauveur.
La pensée de la sécurité par l'obscurité qu'ils sont bien ajustés lors de la formation obscur d'URI et de construction normalisé de la DB avec Table, d'Enregistrement et de Colonne de la sécurité défini, vous ne pouvez pas vous tromper avec un GUID, essayez de faire ça avec entier en fonction de l'id.