Cassandra Query Language (CQL) se distingue por ser un lenguaje fuertemente tipado. Esto significa que, al definir esquemas de datos, cada variable o columna debe ser asignada a un tipo específico. A diferencia de otros sistemas donde el compilador podría inferir el tipo basándose en el valor, en CQL la especificación explícita es clave. Esta característica es fundamental para garantizar la integridad de los datos y optimizar el rendimiento dentro del clúster de Cassandra. Comprender la clasificación y el uso adecuado de los tipos de datos es esencial para cualquier desarrollador o administrador que trabaje con esta base de datos distribuida.

La flexibilidad y robustez de Cassandra se apoyan en una amplia gama de tipos de datos disponibles, diseñados para manejar diversas necesidades de almacenamiento. Estos tipos se clasifican en varias categorías principales, lo que facilita su comprensión y aplicación en el diseño de modelos de datos eficientes.
- Clasificación General de Tipos de Datos en Cassandra
- Preguntas Frecuentes sobre Tipos de Datos en Cassandra
- ¿Cómo clasifica Cassandra los tipos de datos?
- ¿Cuáles son los diferentes tipos de datos en Cassandra?
- ¿Qué tipos de datos son soportados en Cassandra?
- ¿Cómo se crean tipos de datos personalizados en Cassandra?
- ¿Qué tipo de modelo de datos usa Cassandra?
- ¿Qué tipos de datos de columna son soportados en una Column Family (Tabla)?
- ¿Qué es un tipo de dato Cassandra List Frozen?
- ¿Soporta ScyllaDB los tipos de datos de Cassandra?
Clasificación General de Tipos de Datos en Cassandra
Los tipos de datos soportados por Cassandra se clasifican principalmente en las siguientes categorías:
- Tipos Nativos
- Tipos de Colección
- Tipos Tuple
- Tipos Definidos por el Usuario (UDTs)
- Tipos Personalizados (Custom Types)
Exploremos cada una de estas categorías en detalle para entender su propósito y cómo se utilizan en CQL.
Tipos Nativos
Los tipos nativos son los bloques de construcción fundamentales en Cassandra. Representan valores escalares básicos y cubren una amplia variedad de formatos, desde números y cadenas de texto hasta booleanos y datos binarios. Su uso correcto es vital para definir las columnas en las tablas y garantizar que los datos se almacenen de manera eficiente y precisa.
Algunos de los tipos nativos más comunes incluyen:
ascii: Cadenas de caracteres ASCII.bigint: Entero largo con signo de 64 bits. Útil para contadores o IDs grandes.blob: Datos binarios arbitrarios. Permite almacenar imágenes, archivos o cualquier otro dato binario.boolean: Valores lógicostrueofalse.counter: Entero con signo de 64 bits diseñado específicamente para operaciones de incremento y decremento atómico. Es importante notar que las columnas de tipocountertienen restricciones especiales; una tabla solo puede contener columnas de tipocounter(además de las columnas clave), y no pueden usarse como parte de la clave primaria.date: Almacena una fecha sin componente de tiempo.decimal: Número decimal de precisión variable. Ideal para valores financieros que requieren alta precisión.double: Número de punto flotante de doble precisión (64 bits).duration: Representa una cantidad de tiempo con precisión de nanosección. Útil para medir intervalos.float: Número de punto flotante de precisión simple (32 bits).inet: Direcciones IPv4 o IPv6.int: Entero con signo de 32 bits.smallint: Entero con signo de 16 bits.text: Cadenas de caracteres codificadas en UTF-8. Generalmente preferible aasciipara soportar una gama más amplia de caracteres.time: Almacena un tiempo sin componente de fecha, con precisión de nanosegundo.timestamp: Almacena una fecha y hora con precisión de milisegundos.timeuuid: Un UUID basado en tiempo (versión 1). Es útil para generar identificadores únicos que también pueden ordenarse cronológicamente, a menudo utilizado para ordenar filas dentro de una partición sin colisiones.tinyint: Entero con signo de 8 bits.uuid: Un identificador universalmente único (cualquier versión, aunque la versión 4 es común).varchar: Similar atext, cadenas de caracteres codificadas en UTF-8. Sinónimos prácticos en CQL.varint: Entero de precisión arbitraria. Permite almacenar números enteros de cualquier tamaño.
La elección del tipo nativo correcto es crucial para la eficiencia del almacenamiento y las consultas. Por ejemplo, usar int en lugar de bigint cuando el rango de valores lo permite ahorra espacio.
Tipos de Colección
Cassandra permite agrupar múltiples valores dentro de una única columna utilizando tipos de colecciones. Estos tipos son ideales para manejar datos que inherentemente representan conjuntos de elementos o pares clave-valor asociados a una entidad principal.
Los tipos de colección soportados son:
map<tipo_clave, tipo_valor>: Un conjunto ordenado de pares clave-valor, donde las claves son únicas y están ordenadas. Similar a un diccionario en otros lenguajes.set<tipo_elemento>: Una colección ordenada de valores únicos. Garantiza que no haya duplicados.list<tipo_elemento>: Una colección ordenada de valores que pueden no ser únicos. Los elementos se ordenan por su posición en la lista.
Las colecciones son potentes, pero su uso debe ser considerado cuidadosamente, especialmente para colecciones grandes, ya que pueden afectar el rendimiento de las escrituras y lecturas.
| Tipo de Colección | Características | Caso de Uso Típico |
|---|---|---|
MAP | Pares clave-valor únicos, ordenados por clave. | Almacenar atributos con nombres (ej: {'color': 'rojo', 'tamaño': 'grande'}) |
SET | Valores únicos, ordenados. | Almacenar etiquetas o categorías asociadas a un elemento (ej: {'electrónica', 'hogar', 'oferta'}) |
LIST | Valores no únicos, ordenados por posición. | Almacenar un historial de eventos o una secuencia de elementos (ej: ['login', 'logout', 'login']) |
Generalmente, los SET son más eficientes que los LIST si no se requiere el orden por posición y los valores son únicos, debido a la forma en que Cassandra maneja las actualizaciones internas.
Tipos Tuple
Los tipos Tuple permiten agrupar un número fijo de elementos relacionados de tipos posiblemente diferentes en una sola columna. Son similares a una estructura simple o un registro con un número predefinido de campos sin nombre específico.
Un tuple se define especificando los tipos de sus elementos entre paréntesis, por ejemplo: tuple<text, int, float>. Los valores se acceden por su índice (0, 1, 2...). Aunque son flexibles, un Tipo Definido por el Usuario (UDT) es a menudo más descriptivo para estructuras complejas o con muchos elementos, ya que cada campo tiene un nombre.
Tipos Definidos por el Usuario (UDTs)
Los UDT (User-Defined Types) son tipos complejos que permiten crear estructuras de datos personalizadas con múltiples campos nombrados, cada uno con su propio tipo. Son muy similares a los objetos o estructuras en lenguajes de programación y ofrecen una mayor claridad y organización que los tuples cuando se manejan datos estructurados.
Se definen en CQL utilizando la sintaxis CREATE TYPE y luego pueden ser utilizados como tipo de columna en las tablas. Por ejemplo:
CREATE TYPE address ( street text, city text, zip_code int);Luego, puedes usar address como tipo para una columna en una tabla. Los UDTs mejoran la legibilidad del esquema y la organización de datos relacionados.
Tipos Personalizados (Custom Types)
Para casos de uso muy específicos que no pueden ser manejados por los tipos nativos o definidos en CQL, Cassandra permite la creación de tipos personalizados. Estos se implementan en Java, extendiendo la clase org.apache.cassandra.db.marshal.AbstractType. Esta opción ofrece la máxima flexibilidad, pero requiere conocimientos de programación en Java y acceso a la configuración del clúster para desplegar el nuevo tipo.
El Concepto 'Frozen'
El modificador frozen es importante al trabajar con colecciones y UDTs, especialmente cuando se anidan o se utilizan dentro de otras estructuras. Cuando un tipo (como una colección o un UDT) se marca como frozen, se trata como un valor inmutable. Esto significa que, al actualizar una columna de tipo frozen, no se pueden modificar elementos individuales dentro de ella; en su lugar, se debe sobrescribir el valor completo de la columna.
Por ejemplo, una LIST que no es frozen permite añadir o eliminar elementos individualmente. Una LIST<int> frozen solo puede ser reemplazada por una lista completamente nueva.
Una restricción importante es que las colecciones no pueden contener otras colecciones a menos que la colección interna esté marcada como frozen (ej: list<list<int> frozen>).
Tipos de Datos y el Modelo de Datos de Cassandra
Aunque este artículo se centra en los tipos de datos, es útil recordar brevemente cómo encajan en el modelo de datos de Cassandra. Cassandra organiza los datos en tablas (anteriormente llamadas column families). Cada tabla contiene una colección ordenada de filas. Cada fila se identifica por una clave de partición y, opcionalmente, claves de clustering. Dentro de una fila, los datos se organizan en columnas. Una columna es la unidad básica de almacenamiento y consta de un nombre, un valor y una marca de tiempo. Los tipos de datos que hemos discutido se aplican principalmente a los valores de estas columnas. Las columnas clave (partición y clustering) también deben tener tipos de datos definidos, con la restricción de que el tipo counter no puede ser utilizado para ninguna parte de la clave primaria.
Preguntas Frecuentes sobre Tipos de Datos en Cassandra
Aquí abordamos algunas preguntas comunes relacionadas con los tipos de datos en Cassandra:
¿Cómo clasifica Cassandra los tipos de datos?
Cassandra clasifica los tipos de datos en categorías principales: tipos nativos (para valores escalares básicos), tipos de colección (para agrupar múltiples valores), tipos tuple (para estructuras fijas sin nombre de campo), tipos definidos por el usuario - UDTs (para estructuras nombradas complejas) y tipos personalizados (implementados en Java para necesidades avanzadas).
¿Cuáles son los diferentes tipos de datos en Cassandra?
CQL soporta una variedad de tipos de datos. Los tipos nativos incluyen numéricos (int, bigint, float, double, decimal, varint, smallint, tinyint, counter), cadenas (ascii, text, varchar), binarios (blob), booleanos (boolean), fecha/hora (date, time, timestamp, timeuuid), direcciones de red (inet), duraciones (duration) y UUIDs (uuid, timeuuid). Los tipos de colección son map, set y list. También existen los tuple, los tipos definidos por el usuario (UDTs) y la posibilidad de crear tipos personalizados en Java.
¿Qué tipos de datos son soportados en Cassandra?
Cassandra soporta los tipos nativos, tipos de colección (map, set, list), tipos tuple, tipos definidos por el usuario (UDTs) y permite la creación de tipos personalizados implementados en Java.
¿Cómo se crean tipos de datos personalizados en Cassandra?
Los tipos de datos personalizados en Cassandra se crean implementándolos en Java. Esto implica extender la clase org.apache.cassandra.db.marshal.AbstractType y desplegar el código en el clúster de Cassandra. Es una opción avanzada para necesidades muy específicas.
¿Qué tipo de modelo de datos usa Cassandra?
Cassandra utiliza un modelo de datos basado en tablas, filas y columnas. Las tablas contienen filas, identificadas por una clave primaria. Cada fila contiene columnas, que son pares nombre-valor-timestamp. Los tipos de datos se aplican principalmente a los valores de estas columnas.
¿Qué tipos de datos de columna son soportados en una Column Family (Tabla)?
Casi todos los tipos de datos soportados por Cassandra pueden ser usados para las columnas en una tabla. La principal restricción es que el tipo counter no puede ser usado como parte de la clave primaria.
¿Qué es un tipo de dato Cassandra List Frozen?
Cuando un tipo List se marca como frozen, el valor de la lista se trata como inmutable. Esto significa que no se pueden añadir, eliminar o modificar elementos individuales dentro de la lista. Cualquier actualización a una columna de tipo frozen list reemplazará la lista completa con un nuevo valor. Las listas anidadas (una lista dentro de otra lista) solo son posibles si la lista interna está marcada como frozen.
¿Soporta ScyllaDB los tipos de datos de Cassandra?
Sí, ScyllaDB está diseñado para ser compatible con Cassandra Query Language (CQL), lo que incluye el soporte completo para todos los tipos de datos de Cassandra. Esto permite una alta compatibilidad entre ambas bases de datos.
Dominar los tipos de datos en Cassandra es un paso fundamental para construir aplicaciones eficientes y esquemas de base de datos bien diseñados. La elección correcta del tipo impacta directamente en el rendimiento, el espacio de almacenamiento y la complejidad de las consultas.
Si quieres conocer otros artículos parecidos a Clasificación de Tipos de Datos en Cassandra puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL