lunes, 25 de junio de 2018

Modelado de datos en Cassandra


Me puse a estudiar un poco el modelado de datos en cassandra y no entendi mucho, me faltaban algunos conceptos. Por lo tanto y para ordenar un poco el asunto, empecemos definiendo algunas cosas:

Primary Key : Similar al concepto de primary key de las bases relacionales, cada fila se hace referencia mediante una clave principal. Hay varias columnas en una fila, pero el número de columnas puede variar en diferentes filas.

Compound Primary Key: Como su nombre lo sugiere, una clave primaria compuesta se compone de una o más columnas a las que se hace referencia en la clave principal. Un componente de la clave primaria compuesta se llama clave de partición, mientras que el otro componente se llama clave de agrupamiento.

Partition Key: El objetivo de una clave de partición es identificar la partición o el nodo en el clúster que almacena esa fila. Cuando se leen o escriben datos desde el clúster, se usa una función llamada Particionador para calcular el valor hash de la clave de partición. Este valor hash se usa para determinar el nodo / partición que contiene esa fila. Por ejemplo, las filas cuyos valores de clave de partición oscilan entre 1000 y 1234 pueden residir en el nodo A, y las filas con valores de clave de partición comprendidos entre 1235 y 2000 pueden residir en el nodo B. Si una fila contiene una clave de partición cuyo hash el valor es 1233 se almacenará en el nodo A.


Clustering Key: El objetivo de la clave de agrupamiento es almacenar datos de fila en un orden. La clasificación de los datos se basa en columnas, que se incluyen en la clave de agrupamiento. Esta disposición hace que sea eficiente recuperar datos usando la clave de agrupamiento.

Para aclarar conceptos vamos a hacer un ejemplo, vamos a utilizar cqlsh : 

Primero hacemos el keyspace que es similar al concepto de base de datos de las bases relacionales : 

create keyspace Students_Details with replication = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’:1};

elegimos esta base: 

use students_details;

creamos una tabla alumno: 

create table student (stuid int, avg_marks float, description text, 
                      primary key (stuid));

Insertamos 2 estudiantes : 

insert into student (stuid, avg_marks, description) values (1,25.5,’student 1′);
insert into student (stuid, avg_marks, description) values (2,35.5,’student 2′);

podemos revisar los datos con : 

select * from student;

Podemos ver en el resultado anterior que stuid se ha convertido en la clave de fila e identifica las filas individuales.

select token(stuid) from student;

Ahora crearemos otra tabla llamada marks, que registra las calificaciones de cada estudiante todos los días (por ejemplo, todos los días, se registran los exámenes y las calificaciones). Escriba el siguiente comando en cqlsh:

create table marks(stuid int,exam_date timestamp,marks float, exam_name text, 
                   primary key (stuid,exam_date));

Esta declaración crea la tabla marks con una clave principal (stuid, fecha_ejemplo). Como la clave principal tiene dos componentes, el primer componente se considera una clave de partición, y el segundo componente se convierte en la clave del clúster. 

Agregamos algunos datos en la tabla:

insert into marks(stuid ,exam_date ,marks ,exam_name) values (1,’2016-11-10′,76 ,’examA’);
insert into marks(stuid ,exam_date ,marks ,exam_name) values (1,’2016-11-11′,90 ,’examB’);
insert into marks(stuid ,exam_date ,marks ,exam_name) values (1,’2016-11-12′,68 ,’examC’);

Ahora, veamos cómo se ha aplicado el concepto de partición:

select token(stuid) from marks;

Podemos ver que las tres filas tienen el mismo token de partición, por lo tanto, Cassandra almacena solo una fila para cada clave de partición. Todos los datos asociados con esa clave de partición se almacenan como columnas en el almacén de datos. Los datos que hemos almacenado a través de tres instrucciones de inserción diferentes tienen el mismo valor de stuid, es decir, 1, por lo tanto, todos los datos se guardan en esa fila como columnas, es decir, bajo una partición.

El segundo componente de una clave primaria se llama clave de agrupamiento. El rol de la clave de agrupamiento es agrupar elementos relacionados. Todos los datos que se insertan con la misma clave de agrupamiento se agrupan.

Pufff, espero que haya quedado claro. 

Dejo link: