Primární klíč - Auto Increment vs UUID

1 Laravel, Databáze

Každá databázová tabulka by měla mít primární klíč. Většina vývojářů bez pozastavení použije Auto Increment, či jinou alternativu. Existuje ale i jiná možnost - universally unique identifier, zkráceně UUID. Nic není černobílé a každý přístup má své výhody, ale i nevýhody.

Primární klíč - Auto Increment vs UUID

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í:

UUID v1Formá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

Nevýhody Auto Increment

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!