AI a MySQL databáze...
Pozoruhodnou chybou je, že mnoho AI generovaných databázových schémat v současnosti upřednostňuje použití VARCHAR(36) pro sloupec id.
To je obvykle motivováno snahou zabránit neoprávněnému přístupu ze strany škodlivých aktérů. K dosažení tohoto cíle jsou často použity UUID (Universally Unique Identifiers) jako bezpečnostní opatření.
Vezměme si WordPress jako příklad — typicky vystavuje ID příspěvků v URL jako ?p=45. Ve srovnání s SEO-přátelským formátem jako /2025/05/sample-post umožňuje toto číselné ID uživatelům potenciálně hádat a přistupovat k sousednímu obsahu změnou čísla (např. ?p=44). UUID na druhou stranu nejsou sekvenční a jsou mnohem těžší k uhádnutí.
UUID jsou 36znakové řetězce, které následují standardní formát s pěti sekcemi oddělenými pomlčkami: 8-4-4-4-12. Každá sekce se skládá z hexadecimálních hodnot:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Jednoduchý regex pro validaci UUID vypadá takto:
^[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}$
Zatímco UUID nabízejí bezpečnost a přenosnost, přicházejí s kompromisy. Jsou výrazně větší než celá čísla, což může zpomalit výkon databáze — zejména při použití jako primární klíče v relačních databázích. Indexování, využití paměti a rychlost dotazů — všechno trpí kvůli velikosti a nesekvenční povaze UUID.
Zvědavý na tuto designovou volbu jsem položil GitHub Copilot následující otázku:
Já:
Proč jste se rozhodli definovat sloupec id jako VARCHAR(36) PRIMARY KEY ve struktuře databáze?
GitHub Copilot:
Vybral jsem
VARCHAR(36)pro sloupce ID z několika specifických důvodů:
- UUID úložiště: 36znakovou délkou pojme UUID hodnoty, které následují standardizovaný formát.
- Multi-tenant systémy: UUID pomáhají izolovat nájemníky odstraněním úniků sekvenčních ID, zjednodušením migrací a zlepšením bezpečnosti.
- Přenosnost dat: UUID zajišťují, že exportovaná data neutrpí ID kolize při importu do jiného systému.
Kompromisy:
- Větší velikost úložiště (36 bajtů vs. 4 bajty pro
INT)- Pomalejší indexování a výkon dotazů
- Vyšší využití paměti
Alternativy k uvážení:
AUTO_INCREMENT INT/BIGINTBINARY(16)pro efektivnější ukládání surových UUID bajtů- Vlastní strategie generování ID
Dejte mi vědět, pokud upřednostňujete jiný přístup.
Já:
Použijte BIGINT UNSIGNED pro výkon, ale zachovejte pole guid v každém záznamu pro externí reference.
GitHub Copilot:
Aktualizuji schéma pro použití
BIGINT UNSIGNEDjako primární klíč přidáním sloupceguidpro externí reference. Tento hybridní přístup kombinuje nejlepší z obou strategií:
- Výkon: Efektivní indexování a spojování prostřednictvím numerických primárních klíčů
- Bezpečnost a přenosnost: GUID vystavené v API, udržující interní ID bezpečné před výčtem
Shrnutí:
BIGINT UNSIGNED: Rychlý, kompaktní, sekvenčníGUID (VARCHAR): Jedinečný, přenosný, externě bezpečný
Zatímco relační databáze nabízejí flexibilitu ve výběru mezi UUID, celými čísly nebo hybridy, NoSQL systémy jako MongoDB jdou jinou cestou.
MongoDB používá vestavěný typ nazvaný ObjectId pro své pole _id. Toto je 12bajtová binární hodnota, která kóduje:
Příklad:
507f1f77bcf86cd799439011
VARCHAR(36). Jsou také přátelštější k indexování.| Vlastnost | UUID (VARCHAR) | BIGINT + GUID Hybrid | MongoDB ObjectId |
|---|---|---|---|
| Velikost úložiště | 36 bajtů | 8 + 36 bajtů | 12 bajtů |
| Výkon indexování | Špatný | Vynikající | Vynikající |
| Sekvenční / časové pořadí | Ne | Ano (pouze BIGINT) | Ano (přes časové razítko) |
| Čitelný formát | Ano | Ano (GUID) | Ne (hex založený) |
| Uhádnutelnost | Ne | Ne (pouze GUID) | Ne |
| Vynucení schématu | Přísné | Přísné | Flexibilní |
Mnoho AI generovaných systémů ve výchozím nastavení používá NoSQL konfigurace podobné MongoDB když:
V takových případech je použití ObjectIds nebo podobných jedinečných, časově uspořádatelných identifikátorů často rozumnou výchozí volbou.