Translate

martes, 16 de julio de 2019

Definir nuestros propios datos en Cassandra

Muchas veces debemos guardar datos compuestos, como direcciones, identificación, telefono, etc. Una forma es guardarlo todo en una columna de texto, pero luego vamos a tener que parcear, los resultados. Sería mejor si pudiéramos definir una estructura en la que almacenar por ejemplo las direcciones para mantener la integridad de los diferentes componentes.

Afortunadamente, Cassandra nos da una manera de definir nuestros propios tipos. Luego podemos crear columnas de estos tipos definidos por el usuario. Vamos a crear nuestro propio tipo de dirección, insertando algunos saltos de línea en nuestro comando para facilitar la lectura:

qlsh:my_keyspace> CREATE TYPE address (
... street text,
... city text,
... state text,
... zip_code int);

Podríamos haber escrito CREATE TYPE my_keyspace.address. Si ejecuta el comando DESCRIBE KEYSPACE my_keyspace, verá que el tipo de dirección es parte de la definición del espacio de claves.

Ahora que hemos definido nuestro tipo de dirección, intentaremos usarlo en nuestra tabla de usuarios, pero inmediatamente nos encontramos con un problema:

cqlsh:my_keyspace> ALTER TABLE user ADD addresses map<text, address>;

InvalidRequest: code=2200 [Invalid query] message="Non-frozen
collections are not allowed inside collections: map<text,
address>"

¿Que esta pasando aqui? Resulta que un tipo de datos definido por el usuario se considera una colección, ya que su implementación es similar a un conjunto, lista o mapa.

Las versiones de Cassandra anteriores a 2.2 no son totalmente compatibles con el anidamiento de colecciones. Específicamente, la capacidad de acceder a los atributos individuales de una colección anidada aún no se admite, ya que la colección anidada se serializa como un solo objeto por la implementación.

La congelación es un concepto que la comunidad Cassandra ha introducido como un mecanismo de compatibilidad hacia adelante. Por ahora, puede anidar una colección dentro de otra colección marcándola como congelada.

En el futuro, cuando las colecciones anidadas sean totalmente compatibles, habrá un mecanismo para "descongelar" las colecciones anidadas, permitiendo el acceso a los atributos individuales.
También puede usar una colección como clave principal si está congelada.

Ahora que hemos tomado un breve desvío para hablar sobre la congelación y las tablas anidadas, volvamos a modificar nuestra tabla, esta vez marcando la dirección como congelada:

cqlsh:my_keyspace> ALTER TABLE user ADD addresses map<text, frozen<address>>;

Ahora agreguemos una dirección de casa para Mary:

cqlsh:my_keyspace> UPDATE user SET addresses = addresses + {'home': { street: '7712 E. Broadway', city: 'Tucson', state: 'AZ', zip_code: 85715} } WHERE first_name = 'Mary';