Experiencia e implementación de GUID

Se preguntarán a que viene todo esto del GUID.. Bueno, les contaré mi historia… jaj

Cuando empecé a trabajar en el proyecto en que estoy (denominado Genesis), como es común empezamos a trabajar con Base de Datos Relacionales, usando como PK (primary key) enteros, únicos (obviamente) y autoincrementales.

Después de unos meses de desarrollo se incorporó a nuestro proyecto un Senior Architect que trajo consigo una idea (loca en ese momento), cambiar la Base de Datos, haciendo que las tablas tengan como PK “UNIQUEIDENTIFIER”s, debiendo migrar a una nueva instancia de SQL.

Una de las razones (100% válida) era la gran cantidad de datos con las que trabajaría (imagínensen todo el sistema de una red de electrodomésticos) siendo que dan se dan de alta unos 5000 registros por día. Debido a esto el uso de enteros como PKs es altamente limitante, seguramente en cuestión de un tiempo nos enfrentaríamos al problema de limitación de índices. (esta es una de las razones, la mas signifitiva, aunque también es solucionable con un buen diseño de tablas y relaciones).

Luego del consenso de “migrar” la BD surgió la gran pregunta del millón ¿realmente no se repiten los GUIDs? tras la exposición de las justificaciones probabilísticas y matématicas y blabla… y que se genera con la MAC y con la fecha… (¿que pasa si no se tiene placa de red?) blabla…

Llegué a la conclusión: nadie puede afirmar con el 100% de seguridad que no se pueden repetir los GUIDs, pero existe una gran probabilidad de que no lo hagan!.

Cabe destacar que usar GUIDs no es lo mejor para cualquier clase de BD, tiene sus desventajas como ser que ocupa 128 bits, contra Ints de 32 o 64 bits, por lo que puede llegar a relentizar el sistema (no creo que sea la gran cosa tampoco).

Un poco mas a la práctica una desventaja que le encuentro es la casi imposibilidad de recordar los dígitos de por ejemplo una sucursal del sistema (hablando en serio, yo recuerdo 4 dígitos de los registros mas significativos). Otra desventaja que puede llegar a percibir el usuario es cuando asignamos un ID (value) a un combo (p.ej.) y este combo resulta que no lo tiene ya sea porque está inactivo o porque no existe, se muestra en pantalla semejante número que puede llegar a espantar al usuario jaja. Este problema en parte la pudimos llegar a resolver.

Otro punto a tener en cuenta es que, al trabajar con DataSet tipados, no podemos hacerle a estos una asignación directa a null ni leer un null (esto tira una linda excepción), por lo que debemos usar unos métodos que nos brinda el .NET2.0:

DocPrueba documento = new DocPrueba();
DocPrueba.paramRow fila = documento.param.NewparamRow();
fila.SetIDSucursalNull();

y para leer un null:

if (fila.IsIDSucursalNull()) {
   //...
}
Anuncios
Publicado en C#, Development. Etiquetas: . 3 Comments »

¿Cómo se usa GUID en programación?

  • En SQL-Server se denomina a GUID como “UNIQUEIDENTIFIER” y el mismo se puede generar llamando a la funición NEWID():
    INSERT INTO t_TransferenciaEstadoHistorico
    (
        ID_TransferenciaEstadoHistorico,
        ID_Transferencia,
        ID_TransferenciaEstado,
        FechaDesde_TransferenciaEstadoHistorico
    )
    VALUES
    (
        NEWID(),
        @pID_Transferencia,
        @pID_TransferenciaEstado,
        @pFecha_Transferencia
    )
    
  • En .NET (mis ejemplos van a ser en C#)  existe la estructura GUID como System.Guidcuyos miembros se pueden ver en el link: http://msdn2.microsoft.com/es-es/library/system.guid_members(VS.80).aspxUn punto importante a destacar es su constructor Guid (String) que instancia un nuevo GUID a partir del String recibido como parámetro.¿Cómo hacer para generar un Guid? Fácil, solo debemos usar el método NewGuid():Guid id = Guid.NewGuid();

    Una particularidad a señalar es que, al ser una estructura Guid, no permite hacer referencias a nulo. O sea Guid id = null es erróneo! para lo cual una solución (no es la que uso, ni me gusta) es usar Guid.Empty, que es un Guid que contiene todos sus terminos en 0.

    La otra solución, mas elegante es usar los tipos “Nullable” en el Fwk 2.0:

    Guid? id;

    ver http://msdn2.microsoft.com/es-es/library/b3h38hb0(VS.80).aspx

Publicado en C#, Development. Etiquetas: . 2 Comments »

¿Qué es GUID?

Bueno, en esta 2da entrada voy a hablar un poco de lo que significa GUID y cual es su importancia.

GUID: Global Unique IDentifier.  Es una implementación de Microsoft de un estándar llamado Universal Unique Identifier o UUID. Es un código de 128 bits “único en todo el espacio y universo conocido por el hombre” (según se dice y está comprobado probabilísticamente).

Si bien no se puede garantizar que cada GUID generado sea único, el número total de claves únicas (2128) es tan grande, que la posibilidad de que se genere un mismo número dos veces puede considerarse prácticamente nula.

Los GUIDs son escritos empleando una palabra de cuatro bytes, tres palabras de dos bytes y una palabra de seis bytes, como por ejemplo:
{3F2504E0-4F89-11D3-9A0C-0305E82C3301}

La estructura del tipo de dato es:

typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];

} GUID;

El algoritmo empleado para generar nuevos GUIDs ha sido ampliamente criticado. Al principio, la dirección MAC de la tarjeta de red del usuario se usaba como base para varios dígitos GUID, lo que significaba que conociendo el algoritmo se podía averiguar la MAC del creador. Este agujero en la privacidad se utilizó para localizar al creador del gusano Melissa. Después de que esto se descubriera, Microsoft cambió el algoritmo, por lo que ya no contiene la dirección MAC.  También parece ser que utiliza la Fecha y la Hora del instante de creación.

Publicado en C#, Development. Etiquetas: . Leave a Comment »