Postgres fonctionne mieux que certaines autres bases de données car il prend en charge les opérations d’écriture simultanées sans avoir besoin de verrous en lecture/écriture. Parce qu’il est entièrement conforme à ACID et fournit une isolation des transactions et des instantanés, de nombreuses applications utilisent Postgres de nos jours. Malheureusement, alors que PostgreSQL est idéal pour stocker et comparer des données UUID, il manque de capacités pour créer des valeurs UUID dans son noyau. Au lieu de cela, il s’appuie sur des modules tiers pour créer des UUID à l’aide de techniques spécifiées. Dans cet article, vous découvrirez le type de données UUID PostgreSQL et comment générer des valeurs UUID avec des exemples utilisant diverses fonctions et modules.
Qu’est-ce qu’un UUID ?
UUID signifie Universal Unique Identifier, défini par la RFC 4122 et d’autres normes connexes. Un UUID est une série de chiffres hexadécimaux minuscules séparés par des tirets. Les UUID sont une combinaison de séquences de 36 caractères de chiffres, de lettres et de tirets qui sont destinés à être uniques au monde.
En raison de cette caractéristique fantastique, les UUID sont fréquemment utilisés dans les systèmes distribués, car ils garantissent plus d’unicité que le type de données SERIAL, qui ne crée que des entrées uniques dans une seule base de données. Des ordinateurs séparés peuvent produire des UUID en même temps sans communiquer, et les UUID seront garantis uniques. Les systèmes indépendants utilisant des UUID peuvent être combinés en toute sécurité à tout moment sans craindre d’entrer en collision. Le type de données de la colonne uuid dans Postgres prend en charge les identificateurs globalement uniques (UUID). Vous devrez peut-être produire un UUID si votre table a une colonne UUID. Parce qu’aucune technique n’est parfaitement adaptée à chaque application, PostgreSQL a des fonctions de stockage et de comparaison pour les UUID, mais aucune fonction pour générer des UUID dans la base de données principale.
Pourquoi Postgres ne génère-t-il pas lui-même d’UUID ?
PostgreSQL vous permet de stocker et de comparer les valeurs UUID, mais il n’a aucune méthode intégrée pour les créer. C’est pourquoi cet article a été développé – pour vous montrer plusieurs façons de générer des UUIDS dans Postgres.
Comment générer des UUIDS dans Postgres
Méthode 1 : Utilisation du module uuid-ossp
Comme mentionné ci-dessus, PostgreSQL vous permet de stocker et de comparer les valeurs UUID, mais il n’a aucune méthode intégrée pour les créer. Au lieu de cela, il s’appuie sur des modules tiers qui créent des UUID à l’aide de techniques spécifiées. Le module uuid-ossp, par exemple, dispose de diverses méthodes utiles qui implémentent des techniques de génération d’UUID courantes. Pour installer le module uuid-ossp, vous utilisez l’instruction CREATE EXTENSION comme suit :
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Les IF NOT EXISTS
La clause vous permet d’éviter de réinstaller le module. Pour générer les valeurs UUID en fonction de la combinaison de l’adresse MAC de l’ordinateur, de l’horodatage actuel et d’une valeur aléatoire, vous utilisez la fonction uuid_generate_v1() : SELECT uuid_generate_v1();
Dans cet exemple, la fonction a généré la valeur UUID suivante :
uuid_generate_v1
--------------------------------------
0e37df36-f698-11e6-8dd4-cb9ced3df976
(1 row)
Si vous souhaitez générer une valeur UUID uniquement basée sur des nombres aléatoires, vous pouvez utiliser la fonction uuid_generate_v4(). Par exemple:
SELECT uuid_generate_v4();
uuid_generate_v4
--------------------------------------
a81bc81b-dead-4e5d-abff-90865d1e13b1
(1 row)
Pour plus d’informations sur les fonctions de génération d’UUID, consultez la documentation du module uuid-ossp.
Méthode 2 : Utilisation du module gen_random_uuid()
Des modules supplémentaires fournis sont inclus dans la distribution PostgreSQL, bien qu’ils ne soient pas installés par défaut. Les modules peuvent être installés par n’importe quel compte utilisateur avec le privilège CREATE. Dans le module pgcrypto, il existe une méthode de génération d’uuid appelée gen_random_uuid() qui crée un uuid utilisant l’algorithme de la version 4 qui est totalement composé d’entiers hexadécimaux aléatoires.
Les commandes SQL suivantes sont utilisées pour rechercher toutes les extensions disponibles. Ils afficheront également une liste de ceux qui sont actuellement installés.
SELECT * FROM pg_avilable_extensions ORDER BY name;
-- list available extensions
SELECT * FROM pg_extension;
-- list installed extensions
Pour installer l’extension pgcrypto, utilisez la commande suivante.
CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- creates extension
Une fois l’extension pgcrypto installée, ce qui suit renvoie un UUID aléatoire :
SELECT gen_random_uuid(); -- generate a random uuid of version 4
842d3fae-7788-4ecb-b441-7c7e8130b8bf
La différence entre gen_random_uuid() et uuid_generate_v4()
gen_random_uuid() et uuid_generate_v4() génèrent des UUID. La principale différence entre eux est que gen_random_uuid() est fourni par le module pgcrypto tandis que uuid_generate_v4() est fourni par l’extension uuid-ossp. Chacun de ces modules a des limites qui doivent être prises en compte dans le contexte de votre application.
La documentation Postgres sur uuid-ossp suggère d’utiliser gen_random_uuid(). Si vous n’avez besoin que d’UUID générés aléatoirement (version 4). De plus, l’extension uuid-ossp fournit d’autres types d’UUID (tels que les adresses mac).
Un autre facteur à considérer est les différentes méthodes utilisées par ces outils pour générer leurs valeurs aléatoires : uuid_generate_v4() utilise arc4random pour déterminer la partie aléatoire, tandis que gen_random_uuid() utilise à la place Fortuna.
Dois-je utiliser l’UUID comme clé primaire ?
Cela dépend d’un certain nombre de choses.
- L’UUID étant unique, vous pouvez l’utiliser comme clé principale dans votre base de données. Gardez à l’esprit, cependant, que UUID prend un peu plus d’espace que SEQUENCE. Ils sont également lents à générer. Cependant, ils sont incontestablement uniques, garantissant que vous recevrez des données exactes.
- Les numéros UUID sont uniques dans les tables, les bases de données et même les serveurs, ce qui vous permet de combiner les entrées de plusieurs bases de données ou de répartir les bases de données sur de nombreux serveurs. Étant donné que les valeurs UUID ne révèlent pas d’informations sur vos données, elles sont plus sûres à utiliser dans les URL. Cet avantage pourrait rendre les coûts d’utilisation de l’UUID intéressants.
Conclusion
Dans PostgreSQL, il existe plusieurs alternatives pour les champs ID, chacune ayant un cas d’utilisation approprié pour l’utiliser ou non. Nous avons examiné l’utilisation de gen_random_uuid() et uuid-generate_v4() dans cet article. Choisissez l’option qui convient le mieux à votre application et n’oubliez pas de vous amuser !