UUID's in databases

UUID's (Universeel unieke ID -entifiers) zijn 128-bits waarden die onder meer in databases worden gebruikt om tabelitems uniek te identificeren. Ze worden weergegeven als een hexadecimale reeks, verdeeld in vijf groepen, gescheiden door koppeltekens (voorbeeld: 09fe49b3-4d2b-471c-ac04-36c9e706b85f). Er bestaat talrijk Discussies over de voor- en nadelen van UUID's in databases - ze zijn onmisbaar in gedistribueerde systemen.


In microservices en multi-tenancy toepassingen is het daarom het overwegen waard om UUID's in te voeren. Overschakelen van datatype BigInteger naar UUID (een sorteerbare variant van UUID versie 4 uit de RFC 4122- specificatie) in het PHP-framework Laravel is snel gedaan: eerst maken we een nieuwe eigenschap:

2aa7136d977617159be1834eaf40e871

Dan voegen we al onze modellen toe:

2aa7136d977617159be1834eaf40e871

In Laravel 9⁺ is dit nog eenvoudiger: hier hebben we de eigenschap HasUuids al klaar voor gebruik. Als alternatief biedt het framework ook ondersteuning voor het gerelateerde, maar nog vrij onbekende datatype ULID , wat interessant zou kunnen zijn vanwege een betere leesbaarheid en sorteerbaarheid.

Het lastige is de migratie van bestaande data. Grofweg zou men als volgt te werk kunnen gaan::

  1. Voeg nieuwe UUID-kolommen met lege waarden toe aan alle tabellen
    (elk gebaseerd op alle kolommen met primaire en externe sleutels)
  2. Schrijf de UUID-waarden naar de nieuwe kolommen.
    (met oplopende primaire sleutels en bijgewerkte externe sleutels)
  3. Oorspronkelijke kolommen verwijderen
  4. Nieuwe kolommen hernoemen

Er zijn hier verschillende uitdagingen: Het migratieproces duurt lang en nieuwe kolommen worden toegevoegd aan het einde van de tabel (mogelijke oplossing: resortkolommen ). Een veel directere manier is om de kolommen direct te transformeren.

Als je plaatst PostgreSQL Om dit te doen, kunt u (uiteraard na een back-up vooraf) bijvoorbeeld de volgende query uitvoeren (u kunt van tevoren alle tabellen die u in Z wilt uitsluiten, opsommen). 19/31 vervangen, evenals uw eigen speciale regels in Z. 37/39 add) en kopieert alle query's die eruit zijn gegenereerd:

2aa7136d977617159be1834eaf40e871

Als u de gegenereerde queries nu gezamenlijk uitvoert, heeft u de database binnen korte tijd gemigreerd. De op deze manier gemaakte UUID's voldoen niet aan de v4-specificatie, maar zijn lexicografisch in dezelfde volgorde als de vorige vermeldingen en komen niet in botsing met nieuwe UUID's (er is er altijd één in de derde groep in v4 4, altijd één in de gemigreerde variant 0), wat ook betekent dat nieuwe UUID's altijd groter zijn dan de gemigreerde UUID's.

Daarna is het aan te raden alle Laravel-caches te vinden (php artisan cache:clear && php artisan route:clear && php artisan config:clear && php artisan view:clear && composer dump-autoload && rm -rf bootstrap/cache/*/*) en hardloopsessies (rm -f storage/framework/sessions/*) leegmaken. Natuurlijk kan het geheel ook worden geïmplementeerd binnen een Laravel-migratie:

2aa7136d977617159be1834eaf40e871

Na de conversie gebruikt men in plaats daarvan in toekomstige migraties bigIncrements of. bigInteger dan uuid:

2aa7136d977617159be1834eaf40e871

Terug