AI og MySQL databaser...
En bemærkelsesværdig fejl er, at mange AI-genererede databaseskemaer i øjeblikket favoriserer brugen af VARCHAR(36) til id kolonnen.
Dette er typisk motiveret af et ønske om at forhindre uautoriseret adgang fra ondsindede aktører. For at opnå dette anvendes UUID'er (Universally Unique Identifiers) ofte som en sikkerhedsforanstaltning.
Lad os tage WordPress som eksempel — det eksponerer typisk post-ID'er i URL'en som ?p=45. Sammenlignet med et SEO-venligt format som /2025/05/sample-post, tillader dette numeriske ID brugere potentielt at gætte og få adgang til tilstødende indhold ved at ændre nummeret (f.eks. ?p=44). UUID'er er på den anden side ikke sekventielle og meget sværere at gætte.
UUID'er er 36-tegns strenge, der følger et standardformat med fem sektioner adskilt af bindestreger: 8-4-4-4-12. Hver sektion består af heksadecimale værdier:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Et simpelt regex til validering af UUID'er ser sådan ud:
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$
Mens UUID'er tilbyder sikkerhed og portabilitet, kommer de med afvejninger. De er betydeligt større end heltal, hvilket kan bremse databaseydeevnen — især når de bruges som primære nøgler i relationelle databaser. Indeksering, hukommelsesforbrug og forespørgselshastighed lider alle på grund af UUID'ernes størrelse og ikke-sekventielle natur.
Nysgerrig på dette designvalg stillede jeg GitHub Copilot følgende spørgsmål:
Jeg:
Hvorfor valgte du at definere id kolonnen som VARCHAR(36) PRIMARY KEY i databasestrukturen?
GitHub Copilot:
Jeg valgte
VARCHAR(36)til ID-kolonner af flere specifikke årsager:
- UUID-opbevaring: Den 36-tegns længde rummer UUID-værdier, som følger et standardiseret format.
- Multi-tenant systemer: UUID'er hjælper med at isolere lejere ved at eliminere sekventielle ID-lækager, forenkle migrationer og forbedre sikkerheden.
- Dataportabilitet: UUID'er sikrer, at eksporterede data ikke vil opleve ID-kollisioner ved import til et andet system.
Afvejninger:
- Større lagringsstørrelse (36 bytes vs. 4 bytes for
INT)- Langsommere indeksering og forespørgselsydeevne
- Højere hukommelsesforbrug
Alternativer at overveje:
AUTO_INCREMENT INT/BIGINTBINARY(16)til mere effektiv opbevaring af rå UUID-bytes- En brugerdefineret ID-genereringsstrategi
Lad mig vide, hvis du foretrækker en anden tilgang.
Jeg:
Brug BIGINT UNSIGNED til ydeevne, men behold et guid felt i hver post til eksterne referencer.
GitHub Copilot:
Jeg vil opdatere skemaet til at bruge
BIGINT UNSIGNEDsom primær nøgle, mens jeg tilføjer enguidkolonne til eksterne referencer. Denne hybride tilgang kombinerer det bedste fra begge strategier:
- Ydeevne: Effektiv indeksering og joins gennem numeriske primære nøgler
- Sikkerhed og portabilitet: GUID'er eksponeret i API'er, holder interne ID'er sikre mod opregning
Sammenfatning:
BIGINT UNSIGNED: Hurtig, kompakt, sekventielGUID (VARCHAR): Unik, portabel, eksternt sikker
Mens relationelle databaser tilbyder fleksibilitet i valget mellem UUID'er, heltal eller hybrider, tager NoSQL-systemer som MongoDB en anden vej.
MongoDB bruger en indbygget type kaldet ObjectId til sit _id felt. Dette er en 12-byte binær værdi, der koder:
Eksempel:
507f1f77bcf86cd799439011
VARCHAR(36). De er også mere venlige over for indeksering.| Funktion | UUID (VARCHAR) | BIGINT + GUID Hybrid | MongoDB ObjectId |
|---|---|---|---|
| Lagringsstørrelse | 36 bytes | 8 + 36 bytes | 12 bytes |
| Indekseringsydeevne | Dårlig | Fremragende | Fremragende |
| Sekventiel / tidsmæssig rækkefølge | Nej | Ja (kun BIGINT) | Ja (via tidsstempel) |
| Læsbart format | Ja | Ja (GUID) | Nej (hex-baseret) |
| Gættelig | Nej | Nej (kun GUID) | Nej |
| Skemahåndhævelse | Strikt | Strikt | Fleksibel |
Mange AI-genererede systemer standardiserer til MongoDB-lignende NoSQL-konfigurationer, når:
I sådanne tilfælde er brugen af ObjectIds eller lignende unikke, tidsordenlige identifikatorer ofte et fornuftigt standardvalg.