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 replace, а также свои собственные специальные правила в Z. 37/39 add) и копирует все сгенерированные из него запросы:
2aa7136d977617159be1834eaf40e871
Если теперь вы выполните сгенерированные запросы коллективно, вы быстро перенесете базу данных. Созданные таким образом UUID не соответствуют спецификации v4, но лексикографически находятся в том же порядке, что и предыдущие записи, не конфликтуют с новыми UUID (в v4 всегда есть один в 3-й группе). 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