Yapf.net

UUID, wel of niet?

Zijn UUID's nu wel of niet nuttig?

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 Sextilioen. 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 vier 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 twee keer zo groot als bij een bigint en dus zijn je indexes ook twee keer zo groot. 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 index die net zo groot is als de hoeveelheid data die doorgespit moet worden.

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 prmary 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.