AI és MySQL adatbázisok...
Egy figyelemre méltó hiba, hogy sok AI által generált adatbázis séma jelenleg a VARCHAR(36) használatát részesíti előnyben az id oszlophoz.
Ez általában egy rosszindulatú szereplők általi jogosulatlan hozzáférés megakadályozásának vágyától motivált. Ennek elérése érdekében az UUID-ket (Universally Unique Identifiers) gyakran biztonsági intézkedésként alkalmazzák.
Vegyük például a WordPress-t — általában úgy teszi közzé a bejegyzés ID-kat az URL-ben, mint ?p=45. Egy SEO-barát formátummal összehasonlítva, mint /2025/05/sample-post, ez a numerikus ID lehetővé teszi a felhasználók számára, hogy potenciálisan kitalálják és hozzáférjenek a szomszédos tartalomhoz a szám módosításával (pl. ?p=44). Az UUID-k viszont nem szekvenciálisak és sokkal nehezebben kitalálhatóak.
Az UUID-k 36 karakteres sztringek, amelyek szabványos formátumot követnek öt kötőjellel elválasztott részlegben: 8-4-4-4-12. Minden rész hexadecimális értékekből áll:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Egy egyszerű regex az UUID-k validálására így néz ki:
^[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}$
Míg az UUID-k biztonságot és hordozhatóságot kínálnak, kompromisszumokkal járnak. Jelentősen nagyobbak az egész számoknál, ami lelassíthatja az adatbázis teljesítményét — különösen amikor elsődleges kulcsként használják relációs adatbázisokban. Az indexelés, memóriahasználat és lekérdezési sebesség mind szenved az UUID-k mérete és nem-szekvenciális természete miatt.
Kíváncsi voltam erre a tervezési választásra, ezért feltetettem a következő kérdést a GitHub Copilot-nak:
Én:
Miért döntöttél úgy, hogy az id oszlopot VARCHAR(36) PRIMARY KEY-ként definiálod az adatbázis struktúrában?
GitHub Copilot:
A
VARCHAR(36)-ot választottam az ID oszlopokhoz több konkrét okból:
- UUID tárolás: A 36 karakteres hossz befogadja az UUID értékeket, amelyek szabványosított formátumot követnek.
- Több-bérlős rendszerek: Az UUID-k segítenek elkülöníteni a bérlőket a szekvenciális ID szivárgások kiküszöbölésével, egyszerűsítve a migrációkat és javítva a biztonságot.
- Adat hordozhatóság: Az UUID-k biztosítják, hogy az exportált adatok ne szenvedjenek ID ütközéseket más rendszerbe való importáláskor.
Kompromisszumok:
- Nagyobb tárolási méret (36 byte vs. 4 byte az
INT-hez képest)- Lassabb indexelési és lekérdezési teljesítmény
- Magasabb memóriahasználat
Mérlegelhető alternatívák:
AUTO_INCREMENT INT/BIGINTBINARY(16)a nyers UUID byte-ok hatékonyabb tárolásához- Egyéni ID generálási stratégia
Szólj, ha más megközelítést preferálnál.
Én:
Használj BIGINT UNSIGNED-ot a teljesítményért, de tarts meg egy guid mezőt minden rekordban külső hivatkozásokhoz.
GitHub Copilot:
Frissítem a sémát, hogy
BIGINT UNSIGNED-ot használjon elsődleges kulcsként, miközben hozzáadok egyguidoszlopot külső hivatkozásokhoz. Ez a hibrid megközelítés kombinálja mindkét stratégia legjavát:
- Teljesítmény: Hatékony indexelés és join-ok numerikus elsődleges kulcsokon keresztül
- Biztonság és hordozhatóság: GUID-ok közzétéve az API-kban, a belső ID-k biztonságban maradnak a felsorolástól
Összefoglaló:
BIGINT UNSIGNED: Gyors, kompakt, szekvenciálisGUID (VARCHAR): Egyedi, hordozható, kívülről biztonságos
Míg a relációs adatbázisok rugalmasságot kínálnak az UUID-k, egész számok vagy hibridek közötti választásban, a NoSQL rendszerek, mint a MongoDB más utat választanak.
A MongoDB egy beépített típust használ, amelyet ObjectId-nek hívnak az _id mezőjéhez. Ez egy 12 bájtos bináris érték, amely kódol:
Példa:
507f1f77bcf86cd799439011
VARCHAR(36). Indexelés-barátabbak is.| Tulajdonság | UUID (VARCHAR) | BIGINT + GUID Hibrid | MongoDB ObjectId |
|---|---|---|---|
| Tárolási méret | 36 bájt | 8 + 36 bájt | 12 bájt |
| Indexelési teljesítmény | Gyenge | Kiváló | Kiváló |
| Szekvenciális / időbeli sorrend | Nem | Igen (csak BIGINT) | Igen (időbélyegen keresztül) |
| Olvasható formátum | Igen | Igen (GUID) | Nem (hex alapú) |
| Kitalálható | Nem | Nem (csak GUID) | Nem |
| Séma kényszerítés | Szigorú | Szigorú | Rugalmas |
Sok AI által generált rendszer alapértelmezetten MongoDB-szerű NoSQL konfigurációkat használ, amikor:
Ilyen esetekben az ObjectIds vagy hasonló egyedi, időben rendezhető azonosítók használata gyakran ésszerű alapértelmezett választás.