AI ja MySQL-tietokannat...
Huomionarvoinen virhe on, että monet AI:n luomat tietokantaskeemat suosivat tällä hetkellä VARCHAR(36) käyttöä id sarakkeessa.
Tämä johtuu tyypillisesti halusta estää luvaton pääsy pahantahtoisilta toimijoilta. Tämän saavuttamiseksi UUID:t (Universally Unique Identifiers) käytetään usein turvatoimenpiteenä.
Otetaan esimerkiksi WordPress — se tyypillisesti paljastaa julkaisun ID:t URL:ssa muodossa ?p=45. Verrattuna SEO-ystävälliseen muotoon kuten /2025/05/sample-post, tämä numeromainen ID mahdollistaa käyttäjien potentiaalisesti arvata ja päästä käsiksi viereiseen sisältöön muuttamalla numeroa (esim. ?p=44). UUID:t toisaalta eivät ole peräkkäisiä ja ovat paljon vaikeampia arvata.
UUID:t ovat 36 merkin mittaisia merkkijonoja, jotka noudattavat standardimuotoa viidellä viivalla erotetulla osiolla: 8-4-4-4-12. Jokainen osio koostuu heksadesimaaliarvoista:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Yksinkertainen regex UUID:iden validointiin näyttää tältä:
^[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}$
Vaikka UUID:t tarjoavat turvallisuutta ja siirrettävyyttä, ne tulevat kompromissien kanssa. Ne ovat merkittävästi suurempia kuin kokonaisluvut, mikä voi hidastaa tietokannan suorituskykyä — erityisesti kun niitä käytetään pääavaimina relaatiotietokannoissa. Indeksointi, muistinkäyttö ja kyselyjen nopeus kärsivät kaikki UUID:iden koon ja ei-peräkkäisen luonteen vuoksi.
Uteliaana tästä suunnitteluvalinnasta, esitin GitHub Copilotille seuraavan kysymyksen:
Minä:
Miksi päätit määritellä id sarakkeen VARCHAR(36) PRIMARY KEY tietokantarakenteessa?
GitHub Copilot:
Valitsin
VARCHAR(36)ID-sarakkeille useista erityisistä syistä:
- UUID-tallennus: 36 merkin pituus mahdollistaa UUID-arvot, jotka noudattavat standardoitua muotoa.
- Monivuokraalijärjestelmät: UUID:t auttavat eristämään vuokralaiset eliminoimalla peräkkäisten ID-vuodot, yksinkertaistamalla migraatiot ja parantamalla turvallisuutta.
- Datan siirrettävyys: UUID:t varmistavat, että viedyt datat eivät koe ID-törmäyksiä toiseen järjestelmään tuotaessa.
Kompromissit:
- Suurempi tallennuskoko (36 tavua vs. 4 tavua
INT:lle)- Hitaampi indeksointi ja kyselyjen suorituskyky
- Korkeampi muistinkäyttö
Harkittavat vaihtoehdot:
AUTO_INCREMENT INT/BIGINTBINARY(16)tehokkaamman raakadatan UUID-tavujen tallennuksen- Mukautettu ID-generointistrategia
Kerro jos suosit erilaista lähestymistapaa.
Minä:
Käytä BIGINT UNSIGNED suorituskyvylle, mutta pidä guid kenttä jokaisessa tietueessa ulkoisia viittauksia varten.
GitHub Copilot:
Päivitän skeeman käyttämään
BIGINT UNSIGNEDpääavaimena lisätenguidsarakkeen ulkoisia viittauksia varten. Tämä hybridilähestymistapa yhdistää molempien strategioiden parhaat puolet:
- Suorituskyky: Tehokas indeksointi ja liitokset numeeristen pääavainten kautta
- Turvallisuus ja siirrettävyys: GUID:t paljastettu API:issa, pitäen sisäiset ID:t turvassa luetteloinnilta
Yhteenveto:
BIGINT UNSIGNED: Nopea, kompakti, peräkkäinenGUID (VARCHAR): Ainutlaatuinen, siirrettävä, ulkoisesti turvallinen
Kun relaatiotietokannat tarjoavat joustavuutta valinnassa UUID:iden, kokonaislukujen tai hybridien välillä, NoSQL-järjestelmät kuten MongoDB ottavat erilaisen tien.
MongoDB käyttää sisäänrakennettua tyyppiä nimeltään ObjectId sen _id kentälle. Tämä on 12-tavuinen binääriarvo, joka koodaa:
Esimerkki:
507f1f77bcf86cd799439011
VARCHAR(36). Ne ovat myös indeksointiystävällisempiä.| Ominaisuus | UUID (VARCHAR) | BIGINT + GUID Hybridi | MongoDB ObjectId |
|---|---|---|---|
| Tallennuskoko | 36 tavua | 8 + 36 tavua | 12 tavua |
| Indeksointisuorituskyky | Huono | Erinomainen | Erinomainen |
| Peräkkäinen / ajallinen järjestys | Ei | Kyllä (vain BIGINT) | Kyllä (aikaleiman kautta) |
| Luettava muoto | Kyllä | Kyllä (GUID) | Ei (hex-pohjainen) |
| Arvattavissa | Ei | Ei (vain GUID) | Ei |
| Skeeman valvonta | Tiukka | Tiukka | Joustava |
Monet AI:n luomat järjestelmät oletuksena käyttävät MongoDB:n kaltaisia NoSQL-konfiguraatioita kun:
Tällaisissa tapauksissa ObjectId:iden tai vastaavien ainutlaatuisten, aja-järjestettävien tunnisteiden käyttö on usein järkevä oletusvalinta.