UUID y ULID en .NET 9: Nuevas estrategias para generar GUID de forma moderna
Como trabajar los identificadores de nuestros modelos de datos y la generacion de valores GUID con UUID y el nuevo paradigma a usar ULID nativamente en NET 9
En este post hablaremos de un tema super importante para nosotros los developers backend: la definicion de los unique identifier en nuestras bases de datos, es decir del tipo de dato de nuestras claves primarias y las estrategias de generacion de estos valores en nuestro modelo de datos.
Por que usar UUID en .NET?
👉Usualmente para sistemas distribuidos lo mas recomendable es utilizar los famosos UUID, que en el mundo de C# son definidos como tipos Guid, y tiene algunas ventajas en su uso como:
1⃣ Global Uniquenes Required: Esto significa que el valor generado es unico e irrepetible, gracias a los algortimos integrados dentro de C#, donde las chances de tener un valor repetido realmente son minimas.
2⃣ Native Database Support: Los UUIDS actualmente son soportados nativamente por los dos motores de bases de datos mas usados para desarrollo de .NET como SQL Server y Postgesql, es decir el tipo Guid de C# puede ser representado como un tipo de uniqueidentifier en SQL Server, y como un tipo UUID en Postgres respectivamente.
👉Pero el uso de los UUID tambien nos trae algunos inconvenientes como estos:
1⃣ Los UUID tienden a ser costosos en terminos de insercion de data, esto sucede por que en cada insercion se debe actualizar el index que representa el primary key de la tabla correspondiente.
2⃣ No es posible hacer un ordenamiento por el tipo de dato UUID, por que no mantiene una secuencia en la creacion de estos valores, recuerda los UUID son generados aleatoriamente, esto tambien trae otros efectos negativos como tratar de agregar indexes esta columna.
Por que usar ULID en .NET?
Primeramente por que sus valores generados son de 128 bits, y si tuvieramos que analizar este valor ULID generado, tiene dos partes:
🔥Los primeros 48 bits representan el timestamp en un formato de milisegundos teniendo como date base el Unix Epoch. En otras palabras la primera parte del ULID representa la fecha actual por un valor leible numerico de 48 bits.
🔥Los otros 80 bits del ULID generado son aleatorios
Estas caracteristicas traen como ventajas los siguientes puntos:
1⃣ Al estar basado en la fecha actual nos permite hacer ordenamientos sobre este tipo de dato,
2⃣ Al ser de 128 bits es totalmente compatible con los tipos UUID.
3⃣ Este valor basado en la fecha actual puede ser facilmente leible por nosotros los humanos.
Y claro todo se ve excelente, pero tenemos algunas desventajas:
1⃣ Si lo comparamos con el UUID aun no tiene el nivel de aceptacion o implementacion en el mercado.
2⃣ Para poder ser utilizado en tus proyectos usualmente necesitas instalar un paquete que se encarge de la gestion y generacion de estos valores.
💥Sobre este ultimo punto, ya podemos irlo descartando por que desde la version del SDK .NET 9, ya es posible crear nativamente los ULID!
Aqui puedes ver un ejemplo:
Si estas interesado en aprender mas de tecnologias .NET y desarrollo de software registrate en la membresia de la Ruta del Programador: