Yapf.net

UUID, wel of niet?

ZIjn UUID's nu wel of niet nuttig?

UUID's, Universally Unique IDentifiers, zijn in feitte gewoon willekeurige getallen van 12bits, 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 miljardenmachines 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 int is vier bytes en kan tot 2x10^9, een bigint is 8 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 int al 2GB nodig, met een bigint 4GB en met een UUID is dat 8GB. Indexes op de UUID worden minstens net zo groot en als de server geen emmers en emmers geheugen heeft dan is de kansgroot dat die hele index wordt overgeslagen omdat een seqscan wel eensefficienter kan zijn dan geheugen vrijmaken voor een indexdie 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 eensals 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 hetzeflde als een UUID maar dan in 5 bytes (int+byte) in plaats van 16 bytes.