05. BDs orientadas a columnas

Son un tipo de base de datos que almacenan los datos en columnas en lugar de filas, totalmente opuesto a las bases de datos relacionales. Esto permite tener un enfoque a la hora de recuperar y analizar la información en una columna.

Características principales

  • Compresión y eficiencia a la hora de almacenar los datos: al almacenar la información en una columna se pueden aplicar técnicas de compresión en la columna, lo que reduce el espacio de almacenamiento.
  • Acceso selectivo a columnas: las consultas pueden recuperar y analizar selectivamente la columna que nos interese en lugar de leer toda la fila, lo que permite tener un acceso más rápido con menos recursos.
  • Alto rendimiento de análisis y agregaciones (suma, count, promedio…).
  • Flexibilidad en el esquema: cada registro no tiene que tener el mismo esquema.
  • Escalabilidad horizontal: es altamente escalable de forma horizontal.

Algunos ejms populares son Apache Cassandra o Apache HBase.

Apache Cassandra

Su página oficial es https://cassandra.apache.org/_/index.html. Es una base de datos distribuida, altamente escalable y de alto rendimiento, diseñada para manejar grandes volúmenes de información. Permite una alta disponibilidad. Fue desarrollado por Facebook y después se convirtió en un proyecto de código abierto. Tiene una comunidad muy activa que es la que ha ido desarrollando el proyecto

Características principales

Entre ellas está:

  • Escalabilidad horizontal.
  • Modelo de datos sin esquema tan rígido como SQL.
  • Alta disponibilidad y tolerancia a fallos.
  • Rendimimento rápido en lectura y escritura.
  • Integración con herramientas de la familia Apache como es Apache Spark y Apache Hadoop, que permite realizar análisis y consultas más complejas cuando tenemos volúmenes grandes de datos

Vamos a seguir manejando los mismos términos de SQL (tablas, columnas) pero su lenguaje se denomina CQL (Cassandra Query Language). Es un código muy similar a SQL.

Para no tener que instalar nada a modo local, existe un servicio denominado Datastax, cuya URL es https://www.datastax.com/, y es con la plataforma que vamos a trabajar en nuestros ejms con Cassandra. Tenemos que ir, dentro de sus servicios, a uno denominado Luna for Apache Cassandra. Elegimos la opción Try for Free, rellenamos el formulario de Login y accedemos a un Dashboard, cuya capa gratuita no necesita tarjeta de crédito.

Una vez nos hemos logueado, hay una opción para crear una nueva base de datos, donde creamos nuestra base de datos, la vamos a llamar demo-cassandra, y en el Keyspace name podemos poner nuestro nombre, y seguimos rellenando los distintos campos que nos pide obligatoriamente que rellenemos.

Una vez hayamos creado nuestra base de datos demo-cassandra, la cual aparecerá en verde en nuestro panel de administración. Y hay una opción denominada CQL Console, que es como si estuviéramos trabajando en una terminal.

Ejm con Cassandra

Veamos la sintaxis utilizada en Cassandra con un ejm práctico, vamos a imaginar que queremos construir una aplicación de redes sociales, con sus usuarios y publicaciones.

Ejm

-- Mostrar todos los comando de Cassandra
HELP;

-- Ver todas las bases de datos
DESC KEYSPACES;
-- Que base de datos voy a utilizar
USE DB_NAME
-- Mostrar todas las tabla
DESC TABLES;

-- Crear una tabla users
CREATE TABLE users (
user_id UUID PRIMARY KEY,
username TEXT,
email TEXT,
password TEXT,
full_name TEXT
);

-- Crear una tabla user_posts
CREATE TABLE user_posts (
user_id UUID,
post_id UUID,
post_content TEXT,
created_at TIMESTAMP,
PRIMARY KEY (user_id, post_id)
);

-- Crear tabla followers
CREATE TABLE followers (
user_id UUID,
follower_id UUID,
PRIMARY KEY (user_id, follower_id)
);

-- Operaciones del CRUD
INSERT INTO users (user_id, username, email, password, full_name) 
VALUES (uuid(), 'francisco','info@sutilweb.eu','mypassword','Francisco Paredes');

INSERT INTO user_posts (user_id, post_id, post_content, created_at)
VALUES (<user_id>,uuid(),'Hola',toTimeStamp(now()));

INSERT INTO followers (user_id, follower_id, follower_username)
VALUES (<user_id>,uuid(),'Francisco');

-- Selects
SELECT * FROM users;
SELECT * FROM users WHERE nombre='Francisco' LIMIT 200 ALLOW FILTERING;

-- Updates
UPDATE users SET email='otro@sutilweb.eu' WHERE user_id=<user_id>;

-- Delete
DELETE FROM users WHERE user_id=<user_id>;
Scroll al inicio