Apache Cassandra y CQL: modelado de datos y ejemplos de consulta
Cassandra está pensada para escrituras distribuidas, alta disponibilidad y consultas conocidas de antemano. La idea clave es que la tabla se diseña desde el patrón de acceso, no desde un modelo normalizado clásico.
Clave de partición
Define dónde viven los datos en el cluster y qué consultas serán eficientes.
Columnas de clustering
Definen el orden dentro de una partición y permiten lecturas ordenadas.
Diseño por consulta
Se duplican datos cuando hace falta para que cada consulta importante tenga su tabla.
Filtrado con cuidado
ALLOW FILTERING sirve para aprender, pero suele ser una alerta en producción.
Introducción a Cassandra. Ejemplos de consulta CQL
El objetivo de este articulo es gestionar información acerca los cursos y los estudiantes del máster en filología hispánica en una base de datos con Cassandra:
Cursos
IdC
Título
Créditos
Profesor
101
Filología románica
7
Sara Martínez
102
Griego moderno
7
Daniel Pérez
103
Literatura moderna
10
Amalia Sierra
104
Literatura hispano-americana
5
Paloma Sánchez
105
Fonética y morfología
5
Miguel Hernández
106
Teorías literarias
3
Juan García
107
Lingüística general
3
Samuel López
108
Español moderno
10
Isabel Sanz
Estudiante
IdE
Nombre estudiante
201
Maria Mestre
202
Rodrigo Calvo
203
Oriol Menezes
204
Carlo Berruzo
205
Sofia Canyadell
206
Marina Perez
207
Arianna Ruiz
208
Naiara Zapico
Notas
IdE
IdC
Nota Exam
Fecha Examen
201
101
B
2019-02-11
201
102
B
2018-06-30
202
106
C
2018-06-30
203
103
A
2019-02-11
203
108
A
2018-06-30
203
105
B
2020-01-04
204
101
B
2020-01-04
205
103
C
2020-01-04
1. Recuperar la información de los cursos (título del curso, créditos, nombre profesor, nombre estudiante) que han sido atendidos por un estudiante concreto y ordenados por el título del curso.
IdE
IdC
Título
Créditos
Profesor
Nombre estudiante
201
101
Filología románica
7
Sara Martínez
Maria Mestre
201
102
Griego moderno
7
Daniel Pérez
Maria Mestre
202
106
Teorías literarias
3
Juan García
Rodrigo Calvo
203
103
Literatura moderna
10
Amalia Sierra
Oriol Menezes
203
105
Fonética y morfología
5
Miguel Hernández
Oriol Menezes
203
108
Español moderno
10
Isabel Sanz
Oriol Menezes
204
101
Filología románica
7
Sara Martínez
Carlo Berruzo
205
103
Literatura hispano-americana
5
Paloma Sánchez
Sofia Canyadell
205
104
Literatura hispano-americana
5
Paloma Sánchez
Sofia Canyadell
205
108
Español moderno
10
Isabel Sanz
Sofia Canyadell
206
106
Teorías literarias
3
Juan García
Marina Perez
206
107
Lingüística general
3
Samuel López
Marina Perez
207
107
Lingüística general
3
Samuel López
Arianna Ruiz
208
104
Literatura hispano-americana
5
Paloma Sánchez
Naiara Zapico
Como se puede comprobar, para evitar problemas con nombres duplicados, he añadido a la consulta los campos IdE y IdC no solicitados en el enunciado. Con estos campos ya puedo diferenciar correctamente dos alumnos con el mismo nombre o dos cursos con el mismo título. Debido a las peticiones de los siguientes apartados, he decidido utilizar primary key idE_estudiante, titulo_curso y idC_curso. El clave principal, idE_estudiante me permitirá poder agrupar los datos por este valor y, así, conocer el curso con más créditos dónde se ha matriculado. La siguiente clave utilizada ha sido titulo_curso, de esta forma cumplo el requerimiento de ordenación por este valor indicado en el enunciado.
1 Resultado del bloque ejercicio_1
2. Recuperar la información de los cursos en los que hubo estudiantes que recibieron una nota concreta. Se piden título del curso, créditos, nombre profesor, identificador del estudiantes y nota, ordenados por el número de créditos del curso.
Créditos
Nota Exam
IdE
Título
Profesor
7
B
201
Filología románica
Sara Martínez
7
B
201
Griego moderno
Daniel Pérez
3
C
202
Teorías literarias
Juan García
10
A
203
Literatura moderna
Amalia Sierra
5
B
203
Fonética y morfología
Miguel Hernández
10
A
203
Español moderno
Isabel Sanz
7
B
204
Filología románica
Sara Martínez
10
C
205
Literatura moderna
Paloma Sánchez
5
B
205
Literatura hispano-americana
Paloma Sánchez
10
A
205
Español moderno
Isabel Sanz
3
B
206
Teorías literarias
Juan García
3
B
206
Lingüística general
Samuel López
3
A
207
Lingüística general
Samuel López
5
C
208
Literatura hispano-americana
Paloma Sánchez
Respecto a este punto, repetimos el proceso anterior. Para evitar problemas de repetición de datos y poder incluir todos los datos, es necesario tener como clave primaria de la colección idE_estudiante y titulo_curso. En este caso, no considero importante distinguir los cursos al nivel de identificador ya que lo realmente importante es el titulo del curso y sus créditos. El orden de las claves será: nota_exam, creditos_curso, idE_estudiante y titulo_curso. La clave principal, nota_exam me permitirá poder resolver adecuadamente el primer requerimiento del enunciado. En este sentido, la siguiente clave utilizada ha sido creditos_curso, de esta forma resolvemos el requerimiento de ordenación indicado en el enunciado. El resultado se puede valorar en la siguiente imagen: 2 Resultado del bloque ejercicio_b
3. A partir de las dos familias de columnas creadas en los apartados A) y B) generamos consultas en CQL y mostrar los resultados obtenidos de cada consulta:
Recuperar todos los cursos con estudiantes que han recibido una ‘C’ ordenados descendentemente por número de créditos.
La consulta es muy sencilla para la colección ejercicio_b. Utilizamos su clave principal para obtener la información deseada y posteriormente ordenamos los datos según el enunciado. 3 Resultado ejercicio C apartado 1 Cassandra
Obtener el número de créditos máximo que ha obtenido cada estudiante de una asignatura.
En este punto utilizamos la colección ejercicio_a. Al estar ordenada por la clave principal idE_estudiante, se puede realizar un group by por este valor y obtener la consulta deseada. 4 Respuesta ejercicio C apartado 2 Cassandra Añado el nombre del estudiante, cumpliendo los requerimientos del enunciado. 5 Respuesta ejercicio C apartado 2 Cassandra (añadido el nombre de estudiante)
Recuperar la información del curso “Literatura Moderna” sin usar la cláusula ALLOW FILTERING. Sabiendo que “titulo_curso” no forma parte de las family keys de esta colección y que, además, forma parte de una condición del “WHERE”, entonces será necesario definir un índice sobre ese campo. De esta forma podremos evitar el comando ALLOW FILTERING indicada en el enunciado.
6 Respuesta Ejercicio C apartado 3 Cassandra
Cambiar el nombre de la profesora Daniel Perez por Xesus Cortinhas.
En este punto, tenemos que realizar modificaciones en ambas colecciones. Para ello realizamos el siguiente procedimiento en la tabla ejercicio_a:
Buscamos las líneas afectadas.
Obtenemos las primary key que identifican los registros mostrados ( idc_curso in (102) and ide_estudiante in (201) and titulo_curso='Griego moderno')
Comprobamos el éxito de la modificación.
7 Respuesta Ejercicio 4 a en Cassandra. Tabla ejercicio_a
Para modificar la colección ejercicio_b realizamos el siguiente procedimiento:
Buscamos las líneas afectadas.
Obtenemos las primary key que identifican los registros mostrados ( titulo_curso='Griego moderno' and creditos_curso=7 and ide_estudiante=201 and nota_exam='B')
Comprobamos el éxito de la modificación.
8 Respuesta Ejercicio 4 b en Cassandra. Tabla ejercicio_b
Eliminar la información relativa al estudiante "Rodrigo Calvo''.
Al igual que el punto anterior, tenemos que realizar modificaciones en ambas colecciones. Para ello realizamos el siguiente procedimiento en la colección ejercicio_a:
Buscamos las líneas afectadas.
Obtenemos las primary key que identifican los registros mostrados ( idc_curso=106 and ide_estudiante=202 and titulo_curso='Teorías literarias' ) y ejecutamos el delete.
Comprobamos el éxito del borrado.
9 Respuesta Ejercicio 5 a en Cassandra. Tabla ejercicio_a
Ahora realizamos el siguiente procedimiento en la colección ejercicio_b:
Buscamos las líneas afectadas.
Obtenemos las primary key que identifican los registros mostrados ( nota_exam='C' and creditos_curso=3 and ide_estudiante=202 and titulo_curso='Teorías literarias' ) y ejecutamos el delete.
Comprobamos el éxito del borrado.
10 Respuesta Ejercicio 5 b en Cassandra. Tabla ejercicio_b