AI og MySQL gagnagrunnar...
Það er mikilvæg villa sem mörg AI-mynduð gagnagrunnskerfi nota nú á dögum að nota VARCHAR(36) fyrir id dálkinn.
Þetta er venjulega hvatt af löngun til að hindra óheimilaðan aðgang frá illgjörðamönnum. Til að ná þessu er UUID (Universal Unique Identifiers) oft notað sem öryggisráðstöfun.
Tökum WordPress sem dæmi — það afhjúpar venjulega færsluauðkenni í URL-inu sem ?p=45. Í samanburði við SEO-vænna snið eins og /2025/05/sample-post, gerir þetta töluauðkenni notendum kleift að meta og aðgang að nærliggjandi efni með því að breyta númerinu (t.d. ?p=44). UUID eru hins vegar ekki í röð og eru mun erfiðari að giska á.
UUID eru 36 stafa strengir sem fylgja stöðluðu sniði með fimm hlutum aðskildum með striki: 8-4-4-4-12. Hver hluti samanstendur af sextán tölugildlum:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Einföld regex til að sannreyna UUID lítur svona út:
^[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}$
Þó að UUID veiti öryggi og flutningsgetu, þá koma þau með málamiðlun. Þau eru umtalsvert stærri en heiltölur, sem gæti hægt á frammistöðu gagnagrunns — sérstaklega þegar þau eru notuð sem aðallyklar í tengslaga gagnagrunnum. Skráning, minnisnotkun og fyrirspurnahraði þjáist öll vegna stærðar og óröðuðs eðlis UUID.
Forvitinn um þetta hönnunarval spurði ég eftirfarandi spurningu til GitHub Copilot:
Ég:
Hvers vegna valdir þú að skilgreina id dálkinn sem VARCHAR(36) PRIMARY KEY í gagnagrunnsuppbyggingunni?
GitHub Copilot:
Ég valdi
VARCHAR(36)fyrir ID dálka af nokkrum ástæðum:
- UUID-geymsla: 36 stafa lengdin rúmar UUID gildi, sem fylgja stöðluðu sniði.
- Fjölleigjandakerfi: UUID hjálpar til við að einangra leigjendur með því að eyða röðunarauðkenni leka, einfaldaða flutning og bætta öryggi.
- Gagnaflutningsgeta: UUID tryggir að útflutt gögn hafi engar ID árekstra þegar þau eru flutt inn í annað kerfi.
Málamiðlanir:
- Stærri geymslustærð (36 bæti á móti 4 bætum fyrir
INT)- Hægari skráningar- og fyrirspurnarframmistaða
- Meiri minnisnotkun
Valkostir til íhugunar:
AUTO_INCREMENT INT/BIGINTBINARY(16)til að geyma hrá UUID bæti á skilvirkari hátt- Sérsniðin auðkennismyndunaráætlun
Láttu mig vita ef þú vilt frekar aðra nálgun.
Ég:
Notaðu BIGINT UNSIGNED fyrir frammistöðu, en haltu guid reit í hverri skrá fyrir ytri tilvísanir.
GitHub Copilot:
Ég mun uppfæra skemað til að nota
BIGINT UNSIGNEDfyrir aðallykla og bæta viðguiddálki fyrir ytri tilvísanir. Þessi blendingsaðferð sameinar það besta úr báðum áætlunum:
- Frammistaða: Skilvirk skráning og samsetning í gegnum tölulega aðallykla
- Öryggi og flutningsgeta: GUID afhjúpað í API-um, halda innri auðkennum öruggum frá upptalningum
Samantekt:
BIGINT UNSIGNED: Hratt, þjappað, röðuðGUID (VARCHAR): Einstakt, flutjanlegt, öruggt ytra
Þó að tengslagar gagnagrunnar bjóði upp á sveigjanleika í vali milli UUID, heiltalna eða blendingsaðferða, þá taka NoSQL kerfi eins og MongoDB aðra leið.
MongoDB notar innbyggða tegund sem kallast ObjectId fyrir _id reitinn. Þetta er 12-bæta tvíundargildi sem kóðar:
Dæmi:
507f1f77bcf86cd799439011
VARCHAR(36). Þau eru líka vænni fyrir skráningu.| Eiginleiki | UUID (VARCHAR) | BIGINT + GUID blending | MongoDB ObjectId |
|---|---|---|---|
| Geymslustærð | 36 bæti | 8 + 36 bæti | 12 bæti |
| Skráningarframmistaða | Slæm | Frábær | Frábær |
| Röðuð / tímaröð | Nei | Já (aðeins BIGINT) | Já (í gegnum tímastimpil) |
| Mannlesanlegt snið | Já | Já (GUID) | Nei (hex-byggt) |
| Gissanlegt | Nei | Nei (aðeins GUID) | Nei |
| Skemafullnæging | Ströng | Ströng | Sveigjanleg |
Mörg AI-mynduð kerfi nota NoSQL uppsetningu eins og MongoDB að sjálfgefnu þegar:
Í slíkum tilfellum er það oft skynsamlegt sjálfgefið val að nota ObjectIds eða svipuð einstök, tímaröðuð auðkenni.