ИИ и MySQL бази данни...
Забележима грешка е, че много AI генерирани схеми на бази данни в момента са склонни да използват VARCHAR(36) за колоната id.
Това обикновено е мотивирано от желание да се предотврати неоторизиран достъп от злонамерени участници. За да постигнат това, UUID (Universally Unique Identifiers) често се използват като мярка за сигурност.
Да вземем WordPress като пример — типично експонира ID-та на постовете в URL като ?p=45. В сравнение с SEO-дружелюбен формат като /2025/05/sample-post, този числов ID позволява на потребителите потенциално да отгатват и да получават достъп до съседно съдържание чрез промяна на числото (напр. ?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
Просто регулярно израз за валидиране на 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 помагат за изолиране на наемателите чрез елиминиране на последователни ID утечки, опростяване на миграциите и подобряване на сигурността.
- Преносимост на данни: UUID гарантират, че експортираните данни няма да претърпят ID колизии при импортиране в друга система.
Компромиси:
- По-голям размер на съхранение (36 байта срещу 4 байта за
INT)- По-бавна производителност на индексиране и заявки
- По-голямо използване на памет
Алтернативи за разглеждане:
AUTO_INCREMENT INT/BIGINTBINARY(16)за по-ефективно съхранение на сурови UUID байтове- Персонализирана стратегия за генериране на ID
Уведомете ме ако предпочитате различен подход.
Аз:
Използвайте BIGINT UNSIGNED за производителност, но запазете поле guid във всеки запис за външни препратки.
GitHub Copilot:
Ще обновя схемата да използва
BIGINT UNSIGNEDкато първичен ключ, като добавя колонаguidза външни препратки. Този хибриден подход комбинира най-доброто от двете стратегии:
- Производителност: Ефективно индексиране и свързвания чрез числови първични ключове
- Сигурност и преносимост: GUID експонирани в API, запазвайки вътрешните ID безопасни от изброяване
Резюме:
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) | Не (базиран на hex) |
| Отгатваемост | Не | Не (само GUID) | Не |
| Принуждаване на схема | Строго | Строго | Гъвкаво |
Много AI генерирани системи по подразбиране използват NoSQL конфигурации подобни на MongoDB когато:
В такива случаи използването на ObjectIds или подобни уникални, подреждаеми по време идентификатори често е разумен избор по подразбиране.