AI en MySQL-databases...
Een opmerkelijke fout is dat veel AI-gegenereerde databaseschema's momenteel de neiging hebben om VARCHAR(36) te gebruiken voor de id kolom.
Dit wordt meestal gemotiveerd door een wens om ongeautoriseerde toegang door kwaadwillende actoren te voorkomen. Om dit te bereiken worden UUID's (Universally Unique Identifiers) vaak ingezet als beveiligingsmaatregel.
Laten we WordPress als voorbeeld nemen — het stelt typisch post-ID's bloot in de URL als ?p=45. Vergeleken met een SEO-vriendelijk formaat zoals /2025/05/sample-post, stelt deze numerieke ID gebruikers in staat om potentieel aangrenzende content te raden en toegang te krijgen door het getal te wijzigen (bijv. ?p=44). UUID's daarentegen zijn niet sequentieel en veel moeilijker te raden.
UUID's zijn 36-karakter strings die een standaardformaat volgen met vijf secties gescheiden door koppeltekens: 8-4-4-4-12. Elke sectie bestaat uit hexadecimale waarden:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Een eenvoudige regex om UUID's te valideren ziet er zo uit:
^[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}$
Hoewel UUID's beveiliging en portabiliteit bieden, komen ze met afwegingen. Ze zijn aanzienlijk groter dan gehele getallen, wat databaseprestaties kan vertragen — vooral wanneer gebruikt als primaire sleutels in relationele databases. Indexering, geheugengebruik en query-snelheid lijden allemaal onder de grootte en niet-sequentiële aard van UUID's.
Nieuwsgierig naar deze ontwerpkeuze stelde ik GitHub Copilot de volgende vraag:
Ik:
Waarom koos je ervoor om de id kolom te definiëren als VARCHAR(36) PRIMARY KEY in de databasestructuur?
GitHub Copilot:
Ik koos voor
VARCHAR(36)voor ID-kolommen om enkele specifieke redenen:
- UUID-opslag: De 36-karakter lengte accommodeert UUID-waarden, die een gestandaardiseerd formaat volgen.
- Multi-tenant systemen: UUID's helpen tenants te isoleren door sequentiële ID-lekken te elimineren, migraties te vereenvoudigen en beveiliging te verbeteren.
- Data-portabiliteit: UUID's zorgen ervoor dat geëxporteerde data geen ID-botsingen krijgt tijdens import in een ander systeem.
Afwegingen:
- Grotere opslaggrootte (36 bytes vs. 4 bytes voor
INT)- Langzamere indexering en query-prestaties
- Hoger geheugengebruik
Alternatieven om te overwegen:
AUTO_INCREMENT INT/BIGINTBINARY(16)om ruwe UUID-bytes efficiënter op te slaan- Een aangepaste ID-generatiestrategie
Laat me weten of je een andere benadering prefereert.
Ik:
Gebruik BIGINT UNSIGNED voor prestaties, maar behoud een guid veld in elk record voor externe referenties.
GitHub Copilot:
Ik zal het schema updaten om
BIGINT UNSIGNEDals primaire sleutel te gebruiken terwijl ik eenguidkolom toevoeg voor externe referenties. Deze hybride benadering combineert het beste van beide strategieën:
- Prestaties: Efficiënte indexering en joins via numerieke primaire sleutels
- Beveiliging en Portabiliteit: GUID's blootgesteld in API's, interne ID's veilig tegen opsomming
Samenvatting:
BIGINT UNSIGNED: Snel, compact, sequentieelGUID (VARCHAR): Uniek, overdraagbaar, extern veilig
Terwijl relationele databases flexibiliteit bieden in de keuze tussen UUID's, gehele getallen of hybrides, nemen NoSQL-systemen zoals MongoDB een ander pad.
MongoDB gebruikt een ingebouwd type genaamd ObjectId voor zijn _id veld. Dit is een 12-byte binaire waarde die encodeert:
Voorbeeld:
507f1f77bcf86cd799439011
VARCHAR(36). Ze zijn ook vriendelijker voor indexering.| Kenmerk | UUID (VARCHAR) | BIGINT + GUID Hybride | MongoDB ObjectId |
|---|---|---|---|
| Opslaggrootte | 36 bytes | 8 + 36 bytes | 12 bytes |
| Indexeringsprestaties | Slecht | Uitstekend | Uitstekend |
| Sequentiële / tijdsvolgorde | Nee | Ja (alleen BIGINT) | Ja (via timestamp) |
| Leesbaar formaat | Ja | Ja (GUID) | Nee (hex-gebaseerd) |
| Raadbaar | Nee | Nee (alleen GUID) | Nee |
| Schema-afdwinging | Strikt | Strikt | Flexibel |
Veel AI-gegenereerde systemen standaardiseren naar MongoDB-achtige NoSQL-configuraties wanneer:
In deze gevallen is het gebruik van ObjectIds of vergelijkbare unieke, tijd-ordenbare identificatoren vaak een verstandige standaard.