ШІ та бази даних 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) | Ні (заснований на hex) |
| Здогадуваний | Ні | Ні (тільки GUID) | Ні |
| Примусове виконання схеми | Строге | Строге | Гнучке |
Багато згенерованих ШІ систем використовують NoSQL конфігурації, такі як MongoDB, за замовчуванням, коли:
У таких випадках часто є розумним вибором за замовчуванням використання ObjectIds або подібних унікальних, впорядкованих за часом ідентифікаторів.