UUID (Ідентифікатори універсальних унікальних ідентифікаторів) це 128-бітні значення, які використовуються в базах даних, серед іншого, для унікальної ідентифікації записів таблиці. Вони представлені у вигляді шістнадцяткового рядка, розділеного на п’ять груп, розділених дефісами (приклад: 09fe49b3-4d2b-471c-ac04-36c9e706b85f
). існує численні Дискусії про переваги та недоліки UUID в базах даних - вони незамінні в розподілених системах.
Тому в мікросервісах і мультитенантних програмах варто розглянути можливість впровадження UUID. Перехід від типу даних BigInteger до UUID (сортований варіант UUID версії 4 зі специфікації RFC 4122 ) у середовищі PHP Laravel виконується швидко: спочатку ми створюємо новий трейт:
2aa7136d977617159be1834eaf40e871
Потім ми додаємо всі наші моделі:
2aa7136d977617159be1834eaf40e871
У Laravel 9⁺ це ще простіше: тут ми вже маємо готову до використання ознаку HasUuids . Крім того, структура також пропонує підтримку пов’язаного, але все ще досить невідомого типу даних ULID , який може бути цікавим через кращу читабельність і можливість сортування.
Складною частиною є міграція наявних даних. Приблизно можна було б поступити наступним чином:
- Додайте нові стовпці UUID з порожніми значеннями до всіх таблиць
(кожен на основі всіх стовпців первинного та зовнішнього ключів) - Запишіть значення UUID у нові стовпці
(із зростаючими первинними ключами та оновленими зовнішніми ключами) - Видалити оригінальні стовпці
- Перейменуйте нові стовпці
Тут є кілька проблем: процес міграції займає багато часу, і нові стовпці додаються в кінці таблиці (можливе рішення: курортні стовпці ). Набагато більш прямий спосіб - безпосередньо трансформувати стовпці.
Якщо ви поставите це 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