Universally unique identifier zkráceně UUID je 128bitové číslo často zapisované pomocí 36 znaků - 32 hexadecimálních znaků a 4 pomlček. Hlavní výhodou je, že generátory produkují jednotlivá čísla tak náhodně, že je vyloučen vznik konfliktů. A to je přesně ta vlastnost, která je potřeba pro primární klíče v databázi. Existuje několik verzí UUID. Všechny mají stejný výstupní formát, ale liší se ve způsobu generování:
- Verze 1 – Generována na základě timestampu s přesností na stovky nanosekund
- Verze 4 – Generována čistě náhodně, bez závislosti na timestampu
- Verze 3 a 5 – Generována na základě namespace. Při použití stejného namespace je generované UUID stále stejné
Formát UUID verze 1
Je lepší UUID nebo Auto increment?
Auto Increment je posloupná sekvence čísel počínaje 1. Pro každý vložený záznam DBMS vygeneruje následující číslo a přiřadí jej danému záznamu. Je tedy unikátní pouze v rámci tabulky. Díky transakcím a souběhu může dojít k situaci, že některý prvek je přeskočen a není použit.
UUID je na rozdíl od Auto Increment unikátní napříč systémem i "vesmírem". Samozřejmě mohou existovat 2 shodná UUID. V praktickém použití je to ale nepravděpodobné a počítá se s tím, že tato situace při práci s daty nenastane.
UUID je nezávislý na prostředí. Dva servery můžou používat 2 databáze, které je pak velmi jednoduché spojit do jedné. Může to být vhodné také u offline aplikace. Ta může vygenerovat celou hierarchii modelů včetně primárních klíčů a poté je odeslat na server k uložení. A je zde jistota, že jiná aplikace nevytvořila záznamy se stejným ID.
Nevýhody UUID
- Velikost – UUID zabere 16 bytů namísto 4 (integer) nebo 8 (big integer). Navíc pokud se ukládá například v MySQL jako
CHAR(36)
, pak zabere celý 36 bytů. A protože Primární klíč je vždy indexován, kromě samotné tabulky roste i index. - Částečná podpora v MySQL – V MySQL neexistuje datový typ
UUID
. Je nutné zvolitCHAR(36)
, neboBINARY(16)
, kdy je navíc nutné používat funkceUUID_TO_BIN()
aBIN_TO_UUID()
, které jsou dostupné pouze v MySQL 8.0+ a vůbec nejsou v MariaDB. Je také nutné vždy použít funkciUUID()
, která vrací UUIDv1, nebo vše generovat na serveru. Nelze při INSERTu sloupec vynechat a nechat automaticky server vygenerovat ID jako je tomu u Auto Increment. - Horší debugování – Protože index je vždy seřazen a UUID není sekvenční, nové záznamy nelze dohledat vždy na konci tabulky. Je také mnohem horší si doplňovat/pamatovat celých 36 znaků namísto jednoho čísla.
Nevýhody Auto Increment
- ID není známo předem – Při vkládání více tranzitivních záznamů napříč tabulkami, je vždy nutné vložit záznam do DB a získat jeho nové ID. To je teprve možné použít při vkládání dalších záznamů v závislých tabulkách. Není možné si předem vygenerovat ID a používat. Což hodně ztěžuje distribuované nebo offline systémy, jak je popsáno výše.
- Transparentnost – Auto Increment je postupná sekvence. Pokud vytvořím objednávku, která dostane ID 123089 a po 6 měsících u bude ID 123120, vím, že eshopu se asi moc nedaří. Za 6 měsíců bylo vytvořeno jen 31 objednávek. Jindy jsem schopen zjistit, kolik firma prodejem služeb získává peněz. Protože vím, kolik bylo vytvořeno přihlášek a kolik služba stojí.
Použití v databázích a frameworku
-- MySQL či MariaDB
CREATE TABLE `uuid_test` ( `id` char(36) NOT NULL, `value` varchar(255) NOT NULL );
INSERT INTO `uuid_test` (`id`, `value`) VALUES (uuid(), 'RandomValue'); -- Generuje UUID v1
-- Postgres
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Potřeba povolit uuid-ossp rozšíření
CREATE TABLE "uuid_test" ( "id" uuid NOT NULL DEFAULT uuid_generate_v4(), "value" character varying(255) NOT NULL );
INSERT INTO "uuid_test" ("value") VALUES ('RandomValue'); -- Automaticky doplní UUID v4
Laravel a UUID
Laravel dokáže vytvářet v migracích sloupce s datovým typem UUID
. Ty jsou v MySQL ukládány jako CHAR(36)
. Dokáže tyto sloupce používat i jako primární klíče, je ale nutné použít knihovnu Laravel UUID a implementovat ji do svých modelů.
Zkušenosti s rozhodování mezi Auto Increment a UUID můžete sdílet v komentářích.
Cover obrázek přejat z Freepik
K tomuto článku již není možné přidávat další komentáře
Komentáře
Díky za zajímavý článek!