AI ja MySQL-tietokannat

AI ja MySQL-tietokannat...

16 May 2025

5

min lukuaika

Tekoälyinnovaatio

Adrian Sweeney

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.

AI-keskustelu ID-strategiasta

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ä:

  1. UUID-tallennus: 36 merkin pituus mahdollistaa UUID-arvot, jotka noudattavat standardoitua muotoa.
  2. Monivuokraalijärjestelmät: UUID:t auttavat eristämään vuokralaiset eliminoimalla peräkkäisten ID-vuodot, yksinkertaistamalla migraatiot ja parantamalla turvallisuutta.
  3. 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:

  1. AUTO_INCREMENT INT/BIGINT
  2. BINARY(16) tehokkaamman raakadatan UUID-tavujen tallennuksen
  3. 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 UNSIGNED pääavaimena lisäten guid sarakkeen 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äinen
  • GUID (VARCHAR): Ainutlaatuinen, siirrettävä, ulkoisesti turvallinen

NoSQL-tietokannat ja MongoDB ObjectId:t

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:

  • 4 tavua – Aikaleima (sekunteja epokista)
  • 5 tavua – Satunnainen arvo (usein kone + prosessi ID perusteella)
  • 3 tavua – Kasvava laskuri

Esimerkki:

507f1f77bcf86cd799439011

Miksi MongoDB valitsee ObjectId:n

  1. Globaalisti ainutlaatuinen ilman koordinaatiota
    UUID:iden tavoin ObjectId:t eivät vaadi keskusviranomaista ainutlaatuisuuden takaamiseen, tehden niistä ihanteellisia hajautetuille ympäristöille.
  2. Aika-järjestetty
    Sisäänrakennettu aikaleima tarkoittaa, että dokumentit ovat oletuksena kronologisesti järjestettyjä, mikä voi auttaa suorituskyvyssä aikasarja-sovelluksissa.
  3. Kompakti ja tehokas
    Binäärimuodossa tallennettu ObjectId:t vievät vain 12 tavua — paljon vähemmän kuin UUID VARCHAR(36). Ne ovat myös indeksointiystävällisempiä.

ID-strategioiden vertailu

OminaisuusUUID (VARCHAR)BIGINT + GUID HybridiMongoDB ObjectId
Tallennuskoko36 tavua8 + 36 tavua12 tavua
IndeksointisuorituskykyHuonoErinomainenErinomainen
Peräkkäinen / ajallinen järjestysEiKyllä (vain BIGINT)Kyllä (aikaleiman kautta)
Luettava muotoKylläKyllä (GUID)Ei (hex-pohjainen)
ArvattavissaEiEi (vain GUID)Ei
Skeeman valvontaTiukkaTiukkaJoustava

AI:n mieltymykset NoSQL-konteksteissa

Monet AI:n luomat järjestelmät oletuksena käyttävät MongoDB:n kaltaisia NoSQL-konfiguraatioita kun:

  • Odotettavissa on korkea kirjoitussuoritus tai shardingia
  • Skeemojen täytyy olla joustavia tai puolistrukturoituja
  • Datan siirrettävyys ja hajautettu skaalaus ovat prioriteetteja

Tällaisissa tapauksissa ObjectId:iden tai vastaavien ainutlaatuisten, aja-järjestettävien tunnisteiden käyttö on usein järkevä oletusvalinta.

PrimeCRM

Takaisin Tietokeskukseen