AI i MySQL baze podataka...
Uočljiva greška je da mnoge AI generirane sheme baze podataka trenutno preferiraju korištenje VARCHAR(36) za kolonu id.
Ovo je obično motivisano željom da se spriječi neovlašten pristup od zlonamjernih aktera. Da bi se to postiglo, UUID-jevi (Universally Unique Identifiers) se često koriste kao sigurnosna mjera.
Uzmimo WordPress kao primjer — tipično izlaže ID-jeve objava u URL-u kao ?p=45. U usporedbi s SEO-prijateljskim formatom poput /2025/05/sample-post, ovaj numerički ID omogućava korisnicima da potencijalno pogode i pristupe susjednom sadržaju mijenjanjem broja (npr. ?p=44). UUID-jevi s druge strane nisu sekvencijalni i mnogo su teži za pogađanje.
UUID-jevi su stringovi od 36 znakova koji slijede standardni format s pet sekcija razdvojenih crticama: 8-4-4-4-12. Svaka sekcija se sastoji od heksadecimalnih vrijednosti:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Jednostavan regex za validaciju UUID-jeva izgleda ovako:
^[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}$
Dok UUID-jevi pružaju sigurnost i prenosivost, dolaze s kompromisima. Značajno su veći od cijelih brojeva, što može usporavati performanse baze podataka — posebno kada se koriste kao primarni ključevi u relacijskim bazama podataka. Indeksiranje, korištenje memorije i brzina upita — sve pati zbog veličine i nesekvencijalne prirode UUID-jeva.
Zainteresiran ovim izbором dizajna, postavio sam GitHub Copilotu sljedeće pitanje:
Ja:
Zašto ste odabrali definirati kolonu id kao VARCHAR(36) PRIMARY KEY u strukturi baze podataka?
GitHub Copilot:
Odabrao sam
VARCHAR(36)za ID kolone iz nekoliko specifičnih razloga:
- UUID skladištenje: Duljina od 36 znakova prihvaća UUID vrijednosti koje slijede standardizirani format.
- Multi-tenant sustavi: UUID-jevi pomažu izolirati stanare eliminiranjem sekvencijalnih ID curenja, pojednostavljujući migracije i poboljšavajući sigurnost.
- Prenosivost podataka: UUID-jevi osiguravaju da izvezeni podaci neće doživjeti ID kolizije prilikom uvoza u drugi sustav.
Kompromisi:
- Veća veličina skladištenja (36 bajtova vs. 4 bajta za
INT)- Sporije indeksiranje i performanse upita
- Veće korištenje memorije
Alternative za razmotriti:
AUTO_INCREMENT INT/BIGINTBINARY(16)za efikasniju pohranu sirovih UUID bajtova- Prilagođena strategija generiranja ID-a
Javite mi ako preferirate drugačiji pristup.
Ja:
Koristite BIGINT UNSIGNED za performanse, ali zadržite polje guid u svakom zapisu za vanjske reference.
GitHub Copilot:
Ažurirat ću shemu da koristi
BIGINT UNSIGNEDkao primarni ključ dodavanjem koloneguidza vanjske reference. Ovaj hibridni pristup kombinira najbolje od obje strategije:
- Performanse: Efikasno indeksiranje i spajanja kroz numeričke primarne ključeve
- Sigurnost i prenosivost: GUID-jevi izloženi u API-jima, održavaju interne ID-jeve sigurnima od nabrajanja
Sažetak:
BIGINT UNSIGNED: Brz, kompaktan, sekvencijalanGUID (VARCHAR): Jedinstven, prenosiv, eksterno siguran
Dok relacijske baze podataka pružaju fleksibilnost u odabiru između UUID-jeva, cijelih brojeva ili hibrida, NoSQL sustavi poput MongoDB-a uzimaju drugačiji put.
MongoDB koristi ugrađeni tip nazvan ObjectId za svoje _id polje. Ovo je 12-bajtna binarna vrijednost koja kodira:
Primjer:
507f1f77bcf86cd799439011
VARCHAR(36). Također su prijateljski za indeksiranje.| Značajka | UUID (VARCHAR) | BIGINT + GUID Hibrid | MongoDB ObjectId |
|---|---|---|---|
| Veličina skladištenja | 36 bajtova | 8 + 36 bajtova | 12 bajtova |
| Performanse indeksiranja | Loše | Izvrsne | Izvrsne |
| Sekvencijalni / vremenski redoslijed | Ne | Da (samo BIGINT) | Da (kroz vremensku oznaku) |
| Čitljiv format | Da | Da (GUID) | Ne (hex-bazirani) |
| Pogodljiv | Ne | Ne (samo GUID) | Ne |
| Provedba sheme | Striktna | Striktna | Fleksibilna |
Mnogi AI generirani sustavi defaultno koriste MongoDB-slične NoSQL konfiguracije kada:
U takvim slučajevima, korištenje ObjectId-jeva ili sličnih jedinstvenih, vremenski uređenih identifikatora često je razuman default izbor.