Números como claves en Windows Azure

Comentar
Compartir

Cuando utilizamos las Storage Tables en Windows Azure, independientemente de la tabla que definamos, hay dos campos obligatorios a los que debemos prestar especial atención: Row key y Partition key.

  • Row key: es el identificador único para cada fila dentro de cada tabla. Algo muy importante a tener en cuenta es que siempre va a ser una cadena de caracteres.
  • Partition key: es un identificador de categoría que permite agrupar filas. Es una cadena de caracteres que no es necesario definir previamente en ningún catálogo, pero que tiene una gran importancia para mejorar el rendimiento de las consultas sobre una tabla si se define correctamente (esto es: si los datos que se consultarán pueden ser particionados empleando esta clave, las consultas serán más eficientes).

Vamos entonces con el asunto que nos ocupa en este post:

Utilizar números como identificador de fila (Row key).

Una manera de generar números únicos para cada fila, es utilizar los ticks de reloj, ya que se trata de un valor incremental.

[code lang=”csharp”]
DateTime.UtcNow.Ticks
[/code]

Como ya hemos visto, Row key es una cadena de caracteres (string o varchar) por lo que la ordenación se realizará de A-Z. Esto quiere decir que si conseguimos generar identificadores numéricos incrementales, se mostrarán de menor a mayor, pero además se ordenarán incorrectamente como numéricos; en lugar de aparecer así:

1-2-3-4-5-6-7-8-9-10-11-12

Lo harán así:

1-10-11-12-2-3-4-5-6-7-8-9

Para resolver este problema, podemos aplicar un padding con 0’s a la izquierda, con lo que se ordenarán de este modo:

01-02-03-04-05-06-07-08-09-10-11-12-13

Lo único que debemos tener en cuenta es que el número de caracteres siempre debe ser el mismo, por lo que debemos calcular cuántos caracteres tendrá nuestro valor máximo para anteponer los 0’s necesarios.

En el caso de usar ticks de reloj, en C# .NET podemos obtener el número de caracteres necesarios viendo el número de dígitos que tiene el valor máximo: 19 dígitos.

[code lang=”csharp”]
DateTime.MaxValue.Ticks
[/code]

Por lo tanto, debemos anteponer 0’s hasta completar los 19 dígitos.

Y finalmente, elegir la ordenación:

Si queremos que cuando realicemos una consulta (por ejemplo los últimos 100 elementos de una tabla) nos devuelva las inserciones por orden de registro (es decir, las más antiguas) utilizaremos los ticks de reloj actual.

[code lang=”csharp”]
private static string GetChronologicalId()
{
return string.Format("{0:d19}", DateTime.UtcNow.Ticks);
}
[/code]

Sin embargo, si queremos hacer la ordenación inversa, es decir, que nos devuelva primero los útimos registros (las más recientes primero) tendremos que restar al valor máximo para los ticks de reloj, la fecha actual, de este modo.

[code lang=”csharp”]
private static string GetReverseChronologicalId()
{
return string.Format("{0:d19}", DateTime.MaxValue.Ticks – DateTime.UtcNow.Ticks);
}
[/code]

Esta idea la obtuve a partir del fantástico blog de smarax.

¡Espero que os haya resultado útil!

Acerca de findemor

Técnico de Innovación en solusoft.

Warning: count(): Parameter must be an array or an object that implements Countable in /homepages/30/d298707731/htdocs/porexpertos.es/wp-includes/class-wp-comment-query.php on line 405

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *