Quelle est votre opinion sur l’utilisation des UUID en tant qu’identificateurs de ligne de firebase database, en particulier dans les applications Web?

J’ai toujours préféré utiliser des entiers longs comme clés primaires dans les bases de données, pour des raisons de simplicité et de rapidité. Mais lorsque vous utilisez un schéma d’URL REST ou Rails-like pour des instances d’object, je me retrouverais avec des URL comme ceci:

http://example.com/user/783 

Et l’hypothèse est qu’il existe également des utilisateurs avec des ID de 782, 781, …, 2 et 1. En supposant que l’application Web en question soit suffisamment sécurisée pour empêcher les personnes d’entrer d’autres numéros de consulter d’autres utilisateurs sans autorisation, une Une simple clé de substitution assignée séquentiellement “fuit” également le nombre total d’instances (plus anciennes que celle-ci), en l’occurrence les utilisateurs, qui peuvent être des informations privilégiées. (Par exemple, je suis l’utilisateur # 726 dans stackoverflow.)

Un UUID / GUID serait-il une meilleure solution? Ensuite, je pourrais configurer des URL comme ceci:

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

Pas exactement succinct, mais il y a moins d’informations implicites sur les utilisateurs exposés. Bien sûr, cela sent la “sécurité par l’obscurité”, qui ne remplace pas une sécurité adéquate, mais elle semble au moins un peu plus sûre.

Cet avantage vaut-il le coût et la complexité de l’implémentation d’UUID pour les instances d’objects Web? Je pense que je voudrais toujours utiliser des colonnes entières comme bases de données pour accélérer les jointures.

Il y a aussi la question de la représentation en firebase database des UUID. Je sais que MySQL les stocke sous forme de chaînes de 36 caractères. Postgres semble avoir une représentation interne plus efficace (128 bits?) Mais je ne l’ai pas essayé moi-même. Quelqu’un a-t-il une expérience avec ceci?


Mise à jour: pour ceux qui ont demandé à utiliser simplement le nom d’utilisateur dans l’URL (par exemple, http://example.com/user/yukondude ), cela fonctionne bien pour les instances d’objects dont les noms sont uniques, mais qu’en est-il des zillions du Web? des objects d’application qui peuvent uniquement être identifiés par un numéro? Commandes, transactions, factures, noms d’images en double, questions sur l’emstackment, …

Je ne peux pas dire sur le côté Web de votre question. Mais les uuids sont parfaits pour les applications à n-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 firebase database prend en charge un type de données de stockage efficace (16 octets, 128 bits). Au minimum, vous pouvez encoder la chaîne uuid dans base64 et utiliser char (22).

Je les ai largement utilisés avec Firebird et je les recommande.

Pour ce que cela vaut, j’ai vu une longue procédure stockée (plus de 9 secondes) se dérouler en quelques centaines de millisecondes en passant simplement des 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 fait remarquer, les rejoindre et les indexer, par définition, ne sera pas aussi rapide qu’avec des entiers.

Je peux vous répondre que dans SQL Server, si vous utilisez un type de données GUID (identifiant unique) et utilisez la fonction NEWID () pour créer des valeurs, vous obtiendrez une fragmentation horrible à cause des fractionnements de page. La raison en est que lorsque vous utilisez NEWID (), la valeur générée n’est pas séquentielle. SQL 2005 a ajouté la fonction NEWSEQUANTIAL () pour remédier à cela

Une façon de toujours utiliser GUID et int consiste à avoir un guid et un int dans une table pour que le guid mette en correspondance avec l’int. le guid est utilisé en externe mais l’int interne en 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 guids de l’application Web. Cette table sera assez étroite et devrait être assez rapide pour interroger

Pourquoi coupler votre clé primaire avec votre URI?

Pourquoi ne pas que votre clé URI soit lisible par l’homme (ou indiscutable, selon vos besoins), et que votre index d’index primaire soit basé, de cette façon, vous obtenez le meilleur des deux mondes. Beaucoup de logiciels de blog le font, où l’identifiant exposé de l’entrée est identifié par un “slug”, et l’identifiant numérique est masqué à l’intérieur du système.

L’avantage supplémentaire est que vous avez maintenant une très bonne structure d’URL, ce qui est bon pour le référencement. Evidemment pour une transaction ce n’est pas une bonne chose, mais pour quelque chose comme stackoverflow, c’est important (voir l’URL en haut …). Obtenir un caractère unique n’est pas si difficile. Si vous êtes vraiment concerné, stockez un hash du slug dans une table quelque part et faites une recherche avant l’insertion.

edit: Stackoverflow n’utilise pas tout à fait le système que je décris, voir le commentaire de Guy ci-dessous.

Plutôt que des URL comme ceci:

 http://example.com/user/783 

Pourquoi ne pas avoir:

 http://example.com/user/yukondude 

Qui est plus convivial pour les humains et ne divulgue pas cette petite information?

Vous pouvez utiliser un nombre entier lié au numéro de ligne mais non séquentiel. Par exemple, vous pouvez prendre les 32 bits de l’ID séquentiel et les réorganiser avec un schéma fixe (par exemple, le bit 1 devient le bit 6, le bit 2 devient le bit 15, etc.).
Ce sera un cryptage bidirectionnel, et vous serez sûr que deux identifiants différents auront toujours des cryptages différents.
Il serait évidemment facile de décoder, si l’on prend le temps de générer suffisamment d’identifiants et d’obtenir le schéma, mais si je comprends bien votre problème, vous ne voulez simplement pas donner d’informations trop facilement.

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

Je ne pense pas qu’un GUID vous apporte de nombreux avantages. Les utilisateurs détestent les URL longues et incompréhensibles.

Créez un identifiant plus court que vous pouvez mapper sur l’URL ou appliquez une convention de nom d’utilisateur unique ( http://example.com/user/brianly ). Les gars de 37Signals se moqueraient probablement de vous pour vous soucier de quelque chose comme une application Web.

Incidemment, vous pouvez forcer votre firebase database à créer des ID entiers à partir d’une valeur de base.

Cela dépend également de ce que vous aimez pour votre application. Pour les applications n-tiers, les GUID / UUID sont plus simples à implémenter et sont plus faciles à transférer entre différentes bases de données. Pour produire des clés Integer, certaines bases de données prennent en charge un object de séquence en mode natif et certaines nécessitent une construction personnalisée d’une table de séquence.

Les clés entières sont probablement (je n’ai pas de chiffres) un avantage pour les performances d’interrogation et d’indexation ainsi que pour l’utilisation de l’espace. L’interrogation directe de la firebase database est également beaucoup plus facile à l’aide de touches numériques, moins de copier / coller car elles sont plus faciles à mémoriser.

Je travaille avec un système de gestion d’étudiants qui utilise des UUID sous la forme d’un entier. Ils ont une table qui contient l’identifiant unique suivant.

Bien que ce soit probablement une bonne idée du sharepoint vue architectural, cela rend difficile le travail quotidien. Parfois, il est nécessaire de procéder à des insertions en masse et cela est très difficile d’avoir un UUID, nécessitant généralement l’écriture d’un curseur au lieu d’une simple instruction SELECT INTO.

J’ai essayé les deux dans des applications Web réelles.

Mon avis est qu’il est préférable d’utiliser des entiers et d’avoir des URL courtes et compréhensibles.

En tant que développeur, il est un peu affreux de voir des entiers séquentiels et de savoir que certaines informations sur le nombre total d’enregistrements fuient, mais honnêtement, la plupart des gens s’en fichent et cette information n’a jamais vraiment été critique pour mon entreprise.

Avoir des urines UUID longues et longues me semble être beaucoup plus difficile pour les utilisateurs normaux.

Je pense que c’est l’un de ces problèmes qui suscitent des débats quasi religieux et qu’il est presque inutile d’en parler. Je dirais simplement utiliser ce que vous préférez. Dans 99% des systèmes, quel que soit le type de clé que vous utilisez, les avantages (indiqués dans les autres articles) de l’utilisation d’un sorting sur l’autre ne seront jamais un problème.

Je pense que l’utilisation d’un GUID serait le meilleur choix dans votre situation. Cela prend plus de place mais c’est plus sécurisé.

Youtube utilise 11 caractères avec un encodage base64 qui offre 11 possibilités 64, et ils sont généralement assez faciles à écrire. Je me demande si cela offrirait de meilleures performances qu’un UUID complet. 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

Tant que vous utilisez un système de firebase database avec un stockage efficace, le disque dur est actuellement bon marché de toute façon …

Je sais que les GUID peuvent être utiles pour travailler avec certaines applications et sont accompagnés de requêtes, mais du sharepoint vue de la sécurité, ils sont un sauveur.

En pensant à la sécurité par l’obscurité, ils s’intègrent bien lors de la formation d’URI obscures et de la construction de bases de données normalisées avec une sécurité définie par des tables, des enregistrements et des colonnes.