UUID'er i databaser

UUID'er (Universelt unikke id -enifikatorer) er 128-bit værdier, der blandt andet bruges i databaser til entydigt at identificere tabelposter. De er repræsenteret som en hexadecimal streng opdelt i fem grupper adskilt af bindestreger (eksempel: 09fe49b3-4d2b-471c-ac04-36c9e706b85f). Der er talrige Diskussioner om fordele og ulemper ved UUID'er i databaser - de er uundværlige i distribuerede systemer.


I mikrotjenester og multi-tenancy-applikationer er det derfor værd at overveje at indføre UUID'er. Skift fra datatype BigInteger til UUID (en sorterbar variant af UUID version 4 fra RFC 4122 -specifikationen) i PHP-rammeværket Laravel sker hurtigt: Først opretter vi en ny egenskab:

2aa7136d977617159be1834eaf40e871

Så tilføjer vi alle vores modeller:

2aa7136d977617159be1834eaf40e871

I Laravel 9⁺ er dette endnu nemmere: her har vi allerede HasUuids- egenskaben klar til brug. Alternativt tilbyder rammeværket også understøttelse af den relaterede, men stadig ret ukendte datatype ULID , som kunne være interessant på grund af bedre læsbarhed og sorterbarhed.

Den svære del er migreringen af ​​eksisterende data. Man kunne groft sagt gå frem som følger:

  1. Tilføj nye UUID-kolonner med tomme værdier til alle tabeller
    (hver baseret på alle primære og fremmede nøglekolonner)
  2. Skriv UUID-værdier til de nye kolonner
    (med stigende primærnøgler og opdaterede fremmednøgler)
  3. Slet originale kolonner
  4. Omdøb nye kolonner

Der er flere udfordringer her: Migreringsprocessen tager lang tid, og nye kolonner tilføjes i slutningen af ​​tabellen (mulig løsning: udvejskolonner ). En meget mere direkte måde er at transformere kolonnerne direkte.

Hvis du sætter PostgreSQL For at gøre dette kan du (efter en sikkerhedskopi, naturligvis) udføre følgende forespørgsel, for eksempel (på forhånd kan du liste alle de tabeller, du vil udelade i Z). 19/31 erstatte samt dine egne særlige regler i Z. 37/39 add) og kopierer alle forespørgsler genereret fra den:

2aa7136d977617159be1834eaf40e871

Hvis du nu udfører de genererede forespørgsler samlet, vil du have migreret databasen inden for kort tid. De UUID'er, der er oprettet på denne måde, overholder ikke v4-specifikationen, men de er leksikografisk i samme rækkefølge som de tidligere poster, kolliderer ikke med nye UUID'er (der er altid en i 3. gruppe i v4 4, altid en i den migrerede variant 0), hvilket også betyder, at nye UUID'er altid er større end de migrerede UUID'er.

Derefter anbefales det at finde alle Laravel-caches (php artisan cache:clear && php artisan route:clear && php artisan config:clear && php artisan view:clear && composer dump-autoload && rm -rf bootstrap/cache/*/*) og løbesessioner (rm -f storage/framework/sessions/*) at tømme. Det hele kan selvfølgelig også implementeres inden for en Laravel-migrering:

2aa7136d977617159be1834eaf40e871

Efter konverteringen bruger man i stedet for fremtidige migreringer bigIncrements eller. bigInteger derefter uuid:

2aa7136d977617159be1834eaf40e871

Tilbage