UUID в базах даних

UUID (Ідентифікатори універсальних унікальних ідентифікаторів) ​​це 128-бітні значення, які використовуються в базах даних, серед іншого, для унікальної ідентифікації записів таблиці. Вони представлені у вигляді шістнадцяткового рядка, розділеного на п’ять груп, розділених дефісами (приклад: 09fe49b3-4d2b-471c-ac04-36c9e706b85f). існує численні Дискусії про переваги та недоліки UUID в базах даних - вони незамінні в розподілених системах.


Тому в мікросервісах і мультитенантних програмах варто розглянути можливість впровадження UUID. Перехід від типу даних BigInteger до UUID (сортований варіант UUID версії 4 зі специфікації RFC 4122 ) у середовищі PHP Laravel виконується швидко: спочатку ми створюємо новий трейт:

2aa7136d977617159be1834eaf40e871

Потім ми додаємо всі наші моделі:

2aa7136d977617159be1834eaf40e871

У Laravel 9⁺ це ще простіше: тут ми вже маємо готову до використання ознаку HasUuids . Крім того, структура також пропонує підтримку пов’язаного, але все ще досить невідомого типу даних ULID , який може бути цікавим через кращу читабельність і можливість сортування.

Складною частиною є міграція наявних даних. Приблизно можна було б поступити наступним чином:

  1. Додайте нові стовпці UUID з порожніми значеннями до всіх таблиць
    (кожен на основі всіх стовпців первинного та зовнішнього ключів)
  2. Запишіть значення UUID у нові стовпці
    (із зростаючими первинними ключами та оновленими зовнішніми ключами)
  3. Видалити оригінальні стовпці
  4. Перейменуйте нові стовпці

Тут є кілька проблем: процес міграції займає багато часу, і нові стовпці додаються в кінці таблиці (можливе рішення: курортні стовпці ). Набагато більш прямий спосіб - безпосередньо трансформувати стовпці.

Якщо ви поставите це PostgreSQL перший, ви можете (звичайно, після попереднього резервного копіювання) запустити наступний запит, наприклад (перед цим ви можете видалити всі таблиці, які ви виключаєте в Z. 19/31 замінити, а також мати спеціальні правила в Z. 37/39 add) і копіює всі згенеровані з нього запити:

2aa7136d977617159be1834eaf40e871

Якщо ви зараз запустите згенеровані запити разом, ви перемістите базу даних за короткий час. Хоча UUID, створені таким чином, не відповідають специфікації v4, вони лексиграфічно розташовані в тому ж порядку, що й попередні записи, не суперечать новим UUID (у 3-й групі у v4 завжди є 4, завжди один у перенесеному варіанті 0), що також означає, що нові UUID завжди більші за переміщені UUID.

Після цього рекомендується видалити всі кеші Laravel (php artisan cache:clear && php artisan route:clear && php artisan config:clear && php artisan view:clear && composer dump-autoload && rm -rf bootstrap/cache/*/*) і запущені сеанси (rm -f storage/framework/sessions/*) спорожнити. Звичайно, все це також можна реалізувати в рамках міграції Laravel:

2aa7136d977617159be1834eaf40e871

Після перетворення замість цього використовується в майбутніх міграціях bigIncrements або. bigInteger потім uuid:

2aa7136d977617159be1834eaf40e871

Назад