Yapf.net

UUID, wel of niet?

Universally Unique ID's, is dat beter dan een integer?

UUID's, Universally Unique IDentifiers, zijn in feite gewoon willekeurige getallen van 128bits, 16 bytes lang, dat is een getal tussen 0 en 2^128 = 38 Sextiljoen, een 38 met 36 nullen. In principe worden UUIDs gewoon willkeurig gekozen en als je kunt kiezen uit 38 x 10^36 getallen dan is de kans dat je twee keer dezelfde kiest niet heel groot, ook niet als je met miljarden machines tegelijk duizenden getallen per seconde gaat maken.

Voordeel:

Je kunt zelfstandig een uniek getal maken dat zo goed als gegarandeerd niet door andere systemen gebruikt zal worden.

Nadeel 1: afmeting

Ze zijn groot. Heel erg groot. Een integer is 4 bytes en kan tot 2x10^9, een bigint is 8 bytes en kan tot 9x10^18, een UUID is 16 bytes en kan tot 38x10^36. Als je een UUID gebruikt dan is je primary key dus vier keer zo groot als bij een int en dus zijn je indexes, afhankelijk van de soort, ook een stuk groter. Wat zou dat? Een tabel met 500Mln rijen heeft voor een integer-primary-key al 2GB nodig, met een bigint is dat 4GB en met een UUID is dat 8GB. Als de server geen emmers en emmers geheugen heeft dan is de kans groot dat die hele index wordt overgeslagen omdat een seqscan wel eens efficienter kan zijn dan geheugen vrijmaken voor een grote index.

Nadeel 2: onleesbaar

Een UUID is voor mensen volstrekt onleesbaar. Mensen hebben al moeite met een integer: 27568283, laat staan een UUID die ook nog eens als HEX wordt weergegeven om het uberhaupt een beetje binnen de perken te houden: 550e8400-e29b-41d4-a716-446655440000. Probeer voor de grap eens een lijstje van tien van dat soort getallen door een telefoon aan je collega door te geven.

Alternatief

Als je meerdere machines hebt dan is het poepeenvoudig om een uniek getal voor die machine te maken: geef de server een uniek id en neem dat op in de primary key. In de gemiddelde omgeving heb je geen 255 servers dus als je 1 byte toevoegt aan de PK met daarin het servernummer dan heb je hetzelfde als een UUID maar dan in 5 bytes (int+byte) in plaats van 16 bytes. Ja dat is wat meer adminitratie en het is terecht dat je dat opmerkt, maar het is niet relevant want het gaat er niet om dat jij tijdens het serverbeheer 1 byte moet beheren, het gaat erom dat de server 24/7/365 een stuk sneller is, dat je data betrouwbaar is, dat je in geval van nood handmatig in de data kunt knutselen.