ІІ і базы дадзеных MySQL...
Гэта сур'ёзная памылка, што многія схемы баз даных, згенераваныя ШІ, у цяперашні час схільныя выкарыстоўваць VARCHAR(36) для калонкі id.
Гэта звычайна матывавана жаданнем прадухіліць несанкцыянаваны доступ з боку злосных акцёраў. Для дасягнення гэтага UUID (Універсальныя ўнікальныя ідэнтыфікатары) часта выкарыстоўваюцца як мера бяспекі.
Возьмем WordPress як прыклад — ён звычайна раскрывае ідэнтыфікатары паведамленняў у URL як ?p=45. У параўнанні з SEO-зручным фарматам, такім як /2025/05/sample-post, гэты лічбавы ідэнтыфікатар дазваляе карыстальнікам патэнцыйна ацэньваць і атрымліваць доступ да прылеглага зместу, змяняючы нумар (напр. ?p=44). UUID, з іншага боку, не з'яўляюцца паслядоўнымі і значна складанейшыя для здогадкі.
UUID - гэта 36-сімвальныя радкі, якія следуюць стандартнаму фармату з пяццю секцыямі, падзеленымі злучкамі: 8-4-4-4-12. Кожная секцыя складаецца з шаснаццатковых значэнняў:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Просты regex для праверкі UUID выглядае так:
^[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}$
Хоць UUID забяспечваюць бяспеку і партатыўнасць, яны прыходзяць з кампрамісамі. Яны значна большыя за цэлыя лікі, што можа запаволіць прадукцыйнасць базы даных — асабліва пры выкарыстанні ў якасці першасных ключоў у рэляцыйных базах даных. Індэксацыя, выкарыстанне памяці і хуткасць запытаў усё пакутуюць з-за памеру і неслядовага характару UUID.
Цікавячыся гэтым выбарам дызайну, я паставіў гэтае пытанне GitHub Copilot:
Я:
Чаму вы выбралі вызначыць калонку id як VARCHAR(36) PRIMARY KEY у структуры базы даных?
GitHub Copilot:
Я выбраў
VARCHAR(36)для калонак ID па некалькіх канкрэтных прычынах:
- Захоўванне UUID: Даўжыня ў 36 сімвалаў адпавядае значэнням UUID, якія следуюць стандартызаванаму фармату.
- Мультыарэнднія сістэмы: UUID дапамагаюць ізаляваць арэндатараў, ліквідуючы ўцечкі паслядоўных ідэнтыфікатараў, спрашчаючы міграцыі і палепшаючы бяспеку.
- Партатыўнасць даных: UUID забяспечваюць, што экспартаваныя даныя не маюць канфліктаў ідэнтыфікатараў пры імпарце ў іншую сістэму.
Кампрамісы:
- Большы памер захоўвання (36 байтаў супраць 4 байтаў для
INT)- Павольнейшая прадукцыйнасць індэксацыі і запытаў
- Большае выкарыстанне памяці
Альтэрнатывы для разгляду:
AUTO_INCREMENT INT/BIGINTBINARY(16)для больш эфектыўнага захоўвання сырых байтаў UUID- Уласная стратэгія генерацыі ідэнтыфікатараў
Дайце мне ведаць, калі вы аддаеце перавагу іншаму падыходу.
Я:
Выкарыстоўвайце BIGINT UNSIGNED для прадукцыйнасці, але захоўвайце поле guid у кожным запісе для знешніх спасылак.
GitHub Copilot:
Я абнаўлю схему для выкарыстання
BIGINT UNSIGNEDдля першасных ключоў і дадам калонкуguidдля знешніх спасылак. Гэты гібрыдны падыход спалучае лепшае з абедзвюх стратэгій:
- Прадукцыйнасць: Эфектыўная індэксацыя і аб'яднанне праз лічбавыя першасныя ключы
- Бяспека і партатыўнасць: GUID выкрытыя ў API, утрымліваючы ўнутраныя ідэнтыфікатары бяспечнымі ад пералічэння
Рэзюме:
BIGINT UNSIGNED: Хуткі, кампактны, паслядоўныGUID (VARCHAR): Унікальны, партатыўны, знешне бяспечны
У той час як рэляцыйныя базы даных прапаноўваюць гнуткасць у выбары паміж UUID, цэлымі лікамі або гібрыднымі падыходамі, сістэмы NoSQL, такія як MongoDB, ідуць іншым шляхам.
MongoDB выкарыстоўвае ўбудаваны тып пад назвай ObjectId для свайго поля _id. Гэта 12-байтовае двайковае значэнне, якое кадуе:
Прыклад:
507f1f77bcf86cd799439011
VARCHAR(36). Яны таксама больш зручныя для індэксацыі.| Асаблівасць | UUID (VARCHAR) | BIGINT + GUID гібрыд | MongoDB ObjectId |
|---|---|---|---|
| Памер захоўвання | 36 байтаў | 8 + 36 байтаў | 12 байтаў |
| Прадукцыйнасць індэксацыі | Дрэнная | Выдатная | Выдатная |
| Паслядоўны / час | Не | Так (толькі BIGINT) | Так (праз часавую адбітку) |
| Чалавека-чытальны фармат | Так | Так (GUID) | Не (заснаваны на шаснаццатковым) |
| Здагадальны | Не | Не (толькі GUID) | Не |
| Прымусовае выкананне схемы | Строгае | Строгае | Гнуткае |
Многія згенераваныя ШІ сістэмы выкарыстоўваюць канфігурацыі NoSQL, такія як MongoDB, па змаўчанні, калі:
У такіх выпадках часта з'яўляецца разумным выбарам па змаўчанні выкарыстанне ObjectIds або падобных унікальных, упарадкаваных па часу ідэнтыфікатараў.