UUID en bases de datos

UUID (Entificadores de ID únicos universales) son valores de 128 bits que se utilizan en las bases de datos, entre otras cosas, para identificar de forma única las entradas de la tabla. Se representan como una cadena hexadecimal dividida en cinco grupos separados por guiones (Ejemplo: 09fe49b3-4d2b-471c-ac04-36c9e706b85f). Hay numeroso Discusiones sobre las ventajas y desventajas de los UUID en las bases de datos: son indispensables en los sistemas distribuidos.


Por lo tanto, en microservicios y aplicaciones multiusuario, vale la pena considerar la introducción de UUID. El cambio del tipo de datos BigInteger a UUID (una variante ordenable de UUID versión 4 de la especificación RFC 4122 ) en el marco PHP Laravel se realiza rápidamente: primero, creamos un nuevo rasgo:

2aa7136d977617159be1834eaf40e871

Luego agregamos todos nuestros modelos:

2aa7136d977617159be1834eaf40e871

En Laravel 9⁺ esto es aún más fácil: aquí ya tenemos el rasgo HasUuids listo para usar. Alternativamente, el marco también ofrece soporte para el tipo de datos ULID relacionado, pero aún bastante desconocido, que podría ser interesante debido a una mejor legibilidad y capacidad de clasificación.

La parte difícil es la migración de los datos existentes. Aproximadamente se podría proceder de la siguiente manera:

  1. Agregue nuevas columnas UUID con valores vacíos a todas las tablas
    (cada uno basado en todas las columnas de clave principal y externa)
  2. Escriba valores UUID en las nuevas columnas
    (con claves primarias ascendentes más claves foráneas actualizadas)
  3. Eliminar columnas originales
  4. Cambiar el nombre de nuevas columnas

Hay varios desafíos aquí: el proceso de migración lleva mucho tiempo y se agregan nuevas columnas al final de la tabla (solución posible: columnas de recurso ). Una forma mucho más directa es transformar las columnas directamente.

Si pones eso Postgresql one, puede (después de una copia de seguridad anterior, por supuesto) ejecutar la siguiente consulta, por ejemplo (antes de eso, puede eliminar todas las tablas que excluya en Z. 19/31 replace, así como reglas especiales propias en Z. 37/39 add) y copia todas las consultas generadas a partir de él:

2aa7136d977617159be1834eaf40e871

Si ahora ejecuta las consultas generadas juntas, habrá migrado la base de datos en poco tiempo. Si bien los UUID así generados no se ajustan a la especificación v4, están lexigráficamente en el mismo orden que las entradas anteriores, no colisionan con nuevos UUID (en el tercer grupo en v4 siempre hay un 4, siempre uno en la variante migrada 0), lo que también significa que los UUID nuevos siempre son más grandes que los UUID migrados.

Después de eso, se recomienda eliminar todos los cachés de Laravel (php artisan cache:clear && php artisan route:clear && php artisan config:clear && php artisan view:clear && composer dump-autoload && rm -rf bootstrap/cache/*/*) y sesiones de ejecución (rm -f storage/framework/sessions/*) para vaciar. Por supuesto, todo esto también se puede implementar dentro de una migración de Laravel.:

2aa7136d977617159be1834eaf40e871

Después de la conversión, se usa en futuras migraciones en su lugar bigIncrements o. bigInteger luego uuid:

2aa7136d977617159be1834eaf40e871

Atrás