El modelo relacional, propuesto por Edgar F. Codd en 1970, ha sido el paradigma dominante en la gestión de datos durante décadas. Se basa en tablas con filas y columnas, relaciones mediante claves ajenas y el lenguaje SQL para consultas.
Sin embargo, a partir de los años 2000, con la explosión de Internet y las aplicaciones web a gran escala, surgieron necesidades que el modelo relacional no podía satisfacer eficientemente:
| Limitación | Descripción |
|---|---|
| Escalabilidad horizontal | Las BBDD relacionales escalan mejor verticalmente (más potencia en un solo servidor) que horizontalmente (añadir más servidores). La distribución de datos relacionales entre nodos es compleja |
| Esquema rígido | El esquema debe definirse antes de almacenar datos. Cambios estructurales son costosos (migraciones) |
| Datos no estructurados | Las tablas no son el formato natural para datos como documentos JSON, grafos sociales, series temporales o datos geoespaciales |
| Rendimiento en escritura masiva | Las garantías ACID y los bloqueos impactan el rendimiento en escrituras intensivas a gran escala |
| Volumen extremo | Gestionar petabytes en sistemas relacionales tradicionales presenta problemas de rendimiento y coste |
El término NoSQL (Not Only SQL) fue popularizado en 2009, aunque los sistemas que describe existían desde antes. No significa "sin SQL", sino que engloba sistemas que no siguen el modelo relacional estricto.
Principales impulsores del desarrollo NoSQL:
Las transacciones en bases de datos relacionales cumplen las propiedades ACID:
| Propiedad | Descripción |
|---|---|
| A — Atomicidad | Una transacción se ejecuta completa o no se ejecuta. No hay estados intermedios visibles |
| C — Consistencia | Una transacción lleva la base de datos de un estado válido a otro estado válido, respetando todas las restricciones de integridad |
| I — Aislamiento | Las transacciones concurrentes se ejecutan como si fueran secuenciales. Una transacción no ve los efectos intermedios de otra |
| D — Durabilidad | Los cambios confirmados (commit) persisten aunque el sistema falle |
El teorema CAP, enunciado por Eric Brewer en 2000 y demostrado formalmente por Gilbert y Lynch en 2002, establece que un sistema distribuido solo puede garantizar dos de las tres propiedades siguientes de forma simultánea:
| Propiedad | Descripción |
|---|---|
| C — Consistencia (Consistency) | Todos los nodos ven los mismos datos al mismo tiempo. Tras una escritura, cualquier lectura devuelve el valor más reciente |
| A — Disponibilidad (Availability) | El sistema siempre responde a las peticiones (puede no ser el dato más reciente) |
| P — Tolerancia a particiones (Partition Tolerance) | El sistema sigue funcionando aunque haya una partición de red (fallo en la comunicación entre nodos) |
Consistencia (C)
/\
/ \
/ \
/ CA \
/ \
/----+-----\
/ CP | AP \
/ | \
+--------+--------+
Disponibilidad (A) Tolerancia a
particiones (P)
Clasificación de sistemas según CAP:
| Tipo | Propiedades | Ejemplos |
|---|---|---|
| CA | Consistencia + Disponibilidad | Sistemas relacionales tradicionales (MySQL, PostgreSQL en nodo único), pero en la práctica no son distribuidos |
| CP | Consistencia + Tolerancia a particiones | MongoDB (en ciertos modos), HBase, Zookeeper, Redis (con ciertas configuraciones) |
| AP | Disponibilidad + Tolerancia a particiones | Cassandra, CouchDB, DynamoDB, Riak |
Nota: En la práctica, todo sistema distribuido debe tolerar particiones (P), por lo que la decisión real es entre CP (prioriza consistencia) y AP (prioriza disponibilidad).
Muchos sistemas NoSQL ofrecen consistencia eventual (eventual consistency): el sistema garantiza que, si no se realizan nuevas escrituras, eventualmente todos los nodos convergerán al mismo valor. No garantiza cuándo ocurrirá esta convergencia.
Frente a ACID, los sistemas NoSQL suelen seguir el modelo BASE:
| Propiedad | Descripción |
|---|---|
| BA — Básicamente disponible (Basically Available) | El sistema garantiza disponibilidad, aunque algunas peticiones puedan fallar o devolver datos desactualizados |
| S — Estado blando (Soft state) | El estado del sistema puede cambiar con el tiempo, incluso sin nuevas entradas (por la propagación de la consistencia eventual) |
| E — Consistencia eventual (Eventually consistent) | El sistema convergerá a un estado consistente en algún momento futuro |
Las bases de datos NoSQL se clasifican principalmente según su modelo de datos:
BASES DE DATOS NoSQL
|
+----------------+----------------+
| | |
CLAVE-VALOR DOCUMENTALES COLUMNARES
(Key-Value) (Document) (Wide-Column)
Redis, Dynamo MongoDB, Cassandra,
Memcached, CouchDB, HBase,
Riak Elasticsearch BigTable
+----------------+----------------+
| | |
GRAFOS SERIES BÚSQUEDA
(Graph) TEMPORALES (Search)
Neo4j, InfluxDB, Elasticsearch,
ArangoDB, TimescaleDB, Solr
Amazon Neptune Prometheus
Las bases de datos clave-valor (key-value stores) son el tipo más simple de NoSQL. Almacenan datos como pares clave → valor, donde:
El acceso se realiza siempre por clave. No existe lenguaje de consulta para buscar por el contenido del valor (salvo extensiones específicas de cada producto).
Redis (Remote Dictionary Server) es el sistema clave-valor más popular. Fue creado por Salvatore Sanfilippo en 2009.
| Estructura | Descripción | Ejemplo de uso |
|---|---|---|
| String | Texto, números, datos binarios | Contadores, tokens de sesión |
| List | Lista enlazada de strings | Colas de mensajes, historial |
| Set | Conjunto sin duplicados | Etiquetas, relaciones únicas |
| Sorted Set (ZSet) | Conjunto ordenado por puntuación | Rankings, leaderboards |
| Hash | Mapa de campo-valor | Objetos con atributos |
| Bitmap | Operaciones bit a bit | Estadísticas de presencia |
| HyperLogLog | Estimación de cardinalidad | Conteo aproximado de elementos únicos |
| Stream | Log de eventos ordenados | Mensajería, eventos IoT |
DynamoDB es el servicio de base de datos clave-valor (y documental) gestionado de Amazon Web Services. Se basa en los principios del paper de Amazon Dynamo (2007).
Memcached es un sistema de caché en memoria distribuida, más simple que Redis:
Riak es una base de datos clave-valor distribuida de tipo AP (disponibilidad + tolerancia a particiones):
Las bases de datos documentales almacenan datos como documentos, generalmente en formato JSON (JavaScript Object Notation) o BSON (Binary JSON). Cada documento es una unidad autónoma que puede contener estructuras anidadas, arrays y campos de distintos tipos.
A diferencia de las tablas relacionales, los documentos de una misma colección no necesitan tener el mismo esquema.
{
"_id": "5f3a2b1c4d5e6f7a8b9c0d1e",
"nombre": "María García",
"edad": 34,
"direccion": {
"calle": "Calle Mayor, 15",
"ciudad": "Madrid",
"cp": "28013"
},
"telefonos": ["612345678", "913456789"],
"activo": true,
"fechaAlta": "2023-01-15T10:30:00Z"
}
Características del modelo documental:
- Documentos anidados: evitan JOINs almacenando datos relacionados juntos.
- Arrays: permiten almacenar listas de valores o subdocumentos.
- Esquema dinámico: cada documento puede tener campos diferentes.
- Identificador único: cada documento tiene un _id que actúa como clave primaria.
MongoDB es la base de datos documental más utilizada del mundo. Fue creada por 10gen (ahora MongoDB Inc.) en 2009.
| SQL | MongoDB | Descripción |
|---|---|---|
| Base de datos | Base de datos | Contenedor de colecciones |
| Tabla | Colección (Collection) | Agrupación de documentos |
| Fila / Registro | Documento (Document) | Unidad básica de datos |
| Columna | Campo (Field) | Atributo del documento |
| JOIN | $lookup / documentos embebidos |
Relación entre documentos |
| PRIMARY KEY | _id |
Identificador único del documento |
| Índice | Índice | Estructura para acelerar consultas |
| Vista | Vista | Consulta almacenada |
$match, $group, $sort, $project, $lookup, etc.).// Insertar un documento
db.usuarios.insertOne({ nombre: "Ana", edad: 28, ciudad: "Madrid" })
// Buscar documentos
db.usuarios.find({ ciudad: "Madrid", edad: { $gt: 25 } })
// Actualizar
db.usuarios.updateOne({ nombre: "Ana" }, { $set: { edad: 29 } })
// Eliminar
db.usuarios.deleteOne({ nombre: "Ana" })
// Aggregation Pipeline
db.pedidos.aggregate([
{ $match: { estado: "completado" } },
{ $group: { _id: "$clienteId", total: { $sum: "$importe" } } },
{ $sort: { total: -1 } }
])
Apache CouchDB es otra base de datos documental relevante:
Elasticsearch es una base de datos documental especializada en búsqueda y análisis de texto (aunque también se usa para análisis de logs y métricas):
Las bases de datos columnares o de columna ancha (Wide Column Stores) almacenan datos por columnas en lugar de por filas. Existen dos variantes:
a) Almacenamiento por columnas (Column-oriented):
Los datos de cada columna se almacenan juntos en disco. Esto mejora el rendimiento en consultas analíticas que acceden solo a determinadas columnas de muchas filas.
b) Familia de columnas (Column-family / Wide Column):
Inspiradas en Google Bigtable, organizan los datos en familias de columnas. Cada fila puede tener un conjunto diferente de columnas dentro de cada familia.
Almacenamiento por filas (row-oriented) — típico en OLTP:
Fila 1: [1, "Ana", 28, "Madrid"]
Fila 2: [2, "Luis", 35, "Barcelona"]
Fila 3: [3, "Eva", 42, "Sevilla"]
Almacenamiento por columnas (column-oriented) — típico en OLAP:
ID: [1, 2, 3]
Nombre: ["Ana", "Luis", "Eva"]
Edad: [28, 35, 42]
Ciudad: ["Madrid", "Barcelona", "Sevilla"]
Apache Cassandra fue desarrollada originalmente por Facebook para gestionar la bandeja de entrada de mensajes. Fue liberada como open source en 2008 y donada a la Apache Software Foundation.
-- Ejemplo de tabla en CQL
CREATE TABLE mensajes (
usuario_id UUID,
fecha TIMESTAMP,
mensaje TEXT,
PRIMARY KEY (usuario_id, fecha)
) WITH CLUSTERING ORDER BY (fecha DESC);
Apache HBase es una base de datos columnar distribuida basada en el modelo de Google Bigtable, construida sobre Apache Hadoop HDFS.
Google Bigtable (2004, paper publicado en 2006) es el origen conceptual de los sistemas de familia de columnas. Es un sistema de almacenamiento distribuido para datos estructurados a escala masiva.
Para análisis de datos (OLAP), existen sistemas columnar específicos:
| Sistema | Descripción |
|---|---|
| Amazon Redshift | Data warehouse columnar en AWS |
| Google BigQuery | Data warehouse serverless de Google Cloud |
| Snowflake | Data warehouse cloud multi-cloud |
| Apache Parquet | Formato de almacenamiento columnar (no es BBDD) |
| ClickHouse | OLAP columnar open source, muy alto rendimiento |
| Vertica | Base de datos columnar analítica comercial |
| DuckDB | OLAP analítica embebida, orientada a análisis local |
Una base de datos orientada a grafos almacena datos como un grafo: una estructura matemática compuesta por:
El modelo de grafo es especialmente eficiente para datos con relaciones complejas y profundas, donde las consultas de tipo "traversal" (recorrido del grafo) serían prohibitivamente lentas en una base de datos relacional.
Escenario: encontrar los amigos de los amigos de un usuario (2 saltos).
En SQL (modelo relacional):
SELECT DISTINCT f2.amigo_id
FROM amistades f1
JOIN amistades f2 ON f1.amigo_id = f2.usuario_id
WHERE f1.usuario_id = 1
AND f2.amigo_id != 1;
En Neo4j (Cypher):
MATCH (u:Usuario {id: 1})-[:AMIGO*2]->(amigo)
RETURN DISTINCT amigo
Neo4j es la base de datos orientada a grafos más utilizada del mundo. Fue desarrollada por Neo Technology (ahora Neo4j Inc.) y lanzada en 2007.
(persona:Persona {nombre: "Ana", edad: 28})
-[:TRABAJA_EN {desde: 2020}]->
(empresa:Empresa {nombre: "Ayuntamiento de Madrid"})
Cypher es el lenguaje de consulta declarativo de Neo4j, diseñado para ser intuitivo mediante patrones ASCII:
-- Crear un nodo
CREATE (p:Persona {nombre: "Ana", edad: 28})
-- Crear una relación
MATCH (a:Persona {nombre: "Ana"}), (b:Persona {nombre: "Luis"})
CREATE (a)-[:CONOCE {desde: 2020}]->(b)
-- Consultar amigos de amigos
MATCH (yo:Persona {nombre: "Ana"})-[:CONOCE*2]->(posibleAmigo)
WHERE NOT (yo)-[:CONOCE]->(posibleAmigo)
RETURN posibleAmigo.nombre
-- Encontrar el camino más corto
MATCH path = shortestPath(
(a:Persona {nombre: "Ana"})-[:CONOCE*]-(b:Persona {nombre: "Eva"})
)
RETURN path
Neo4j Graph Data Science (GDS) incluye algoritmos de:
| Caso de uso | Descripción |
|---|---|
| Redes sociales | Relaciones de amistad, seguidores, interacciones |
| Detección de fraude | Identificar patrones sospechosos en redes de transacciones |
| Motores de recomendación | "Los usuarios que compraron X también compraron Y" |
| Grafos de conocimiento | Knowledge graphs, ontologías semánticas |
| Gestión de redes | Topología de redes de telecomunicaciones, infraestructuras |
| Ciberseguridad | Análisis de rutas de ataque, dependencias de sistemas |
| Master Data Management | Gestión de datos maestros con relaciones complejas |
| Rutas y logística | Optimización de rutas, gestión de dependencias |
| Sistema | Descripción |
|---|---|
| Amazon Neptune | Servicio de grafo gestionado en AWS; soporta Property Graph (Gremlin) y RDF/SPARQL |
| ArangoDB | Multi-modelo: grafos + documentos + clave-valor en un mismo sistema |
| JanusGraph | Grafo distribuido, construido sobre Cassandra o HBase |
| TigerGraph | Base de datos de grafo nativa para analítica en tiempo real |
| Dgraph | Base de datos de grafo distribuida con GraphQL nativo |
| Azure Cosmos DB | Multi-modelo de Microsoft; soporta grafos con API Gremlin |
Además del Property Graph Model, existe el modelo RDF (Resource Description Framework):
Las bases de datos de series temporales están optimizadas para almacenar y consultar datos indexados por tiempo (timestamp).
Características:
- Ingesta masiva de datos con marca temporal.
- Consultas eficientes sobre rangos temporales.
- Funciones de agregación temporal (downsampling, rollup).
- Políticas de retención y expiración automática de datos.
- Compresión eficiente de datos temporales (los datos cambian poco entre muestras consecutivas).
| Sistema | Descripción |
|---|---|
| InfluxDB | La más popular para métricas e IoT; lenguaje Flux |
| TimescaleDB | Extensión de PostgreSQL para series temporales; compatible con SQL |
| Prometheus | Enfocada en métricas de monitorización; usada con Grafana |
| OpenTSDB | Construida sobre HBase |
| QuestDB | Alto rendimiento para ingesta y consultas de series temporales |
Casos de uso:
- Métricas de infraestructura y aplicaciones (CPU, memoria, red).
- Datos de sensores IoT.
- Datos financieros (precios de acciones, transacciones).
- Monitorización de sistemas industriales (SCADA).
| Sistema | Descripción |
|---|---|
| Elasticsearch | Búsqueda de texto completo + análisis (ya mencionado) |
| Apache Solr | Basado en Lucene, similar a Elasticsearch |
| Meilisearch | Motor de búsqueda open source, ligero y rápido |
| Typesense | Alternativa a Meilisearch, tolerante a errores tipográficos |
| Sistema | Descripción |
|---|---|
| Redis | Ya descrito en clave-valor |
| Memcached | Caché pura en memoria |
| VoltDB | BBDD relacional completamente en memoria, ACID, alta velocidad |
| SAP HANA | BBDD columnar en memoria para analítica y OLTP |
Optimizadas para almacenar y consultar datos con componente geográfica.
Operaciones típicas: buscar puntos dentro de un radio, calcular distancias, intersección de polígonos, operaciones topológicas.
Algunos sistemas modernos soportan múltiples modelos en un único motor:
| Sistema | Modelos soportados |
|---|---|
| ArangoDB | Documentos + Grafos + Clave-valor |
| Azure Cosmos DB | Documentos (API MongoDB), Grafos (Gremlin), Clave-valor (Table), Columnar (Cassandra), SQL |
| FaunaDB | Documentos + Relacional + Grafos |
| OrientDB | Documentos + Grafos + Objetos |
Almacenan objetos directamente, tal como se representan en un lenguaje orientado a objetos, sin necesidad de mapeo objeto-relacional (ORM).
Las bases de datos NewSQL son sistemas relacionales diseñados para escalar horizontalmente como NoSQL, manteniendo las garantías ACID.
| Sistema | Descripción |
|---|---|
| Google Spanner | BBDD relacional globalmente distribuida de Google; primer sistema que ofrece consistencia externa global |
| CockroachDB | Compatible con PostgreSQL, distribuida y ACID |
| TiDB | Compatible con MySQL, distribuida y ACID |
| YugabyteDB | Compatible con PostgreSQL y Cassandra |
| Vitess | Sistema de sharding para MySQL (usado por YouTube, Slack) |
Un Data Warehouse (almacén de datos) es un repositorio centralizado de datos integrados, históricos y organizados para el análisis y la toma de decisiones. Fue definido por Bill Inmon en 1992.
Definición de Bill Inmon: "Un Data Warehouse es una colección de datos orientada a temas, integrada, variable en el tiempo y no volátil, que se usa para el apoyo al proceso de toma de decisiones."
| Característica | Descripción | Diferencia con BBDD operacional |
|---|---|---|
| Orientado a temas (Subject-oriented) | Los datos se organizan por áreas de negocio (ventas, clientes, productos), no por aplicaciones | Una BBDD operacional organiza los datos por procesos (pedidos, facturación) |
| Integrado (Integrated) | Los datos provienen de múltiples fuentes heterogéneas y se unifican con formatos y códigos consistentes | Cada sistema operacional tiene su propio formato |
| Variable en el tiempo (Time-variant) | Almacena datos históricos; cada registro incluye una dimensión temporal | Las BBDD operacionales suelen tener solo el estado actual |
| No volátil (Non-volatile) | Los datos no se modifican ni se borran una vez cargados; solo se añaden nuevos datos | Las BBDD operacionales tienen operaciones INSERT, UPDATE, DELETE frecuentes |
| Característica | OLTP (Operacional) | OLAP (Analítico / DW) |
|---|---|---|
| Propósito | Gestión de operaciones diarias | Análisis y toma de decisiones |
| Usuarios | Personal operativo | Directivos, analistas |
| Operaciones | INSERT, UPDATE, DELETE frecuentes | SELECT con agregaciones complejas |
| Volumen de datos | GB | TB - PB |
| Tiempo de respuesta | Milisegundos | Segundos - minutos |
| Diseño | Normalizado (3FN) | Desnormalizado (estrella, copo de nieve) |
| Transacciones | Muchas, cortas, concurrentes | Pocas, largas, de solo lectura |
| Horizonte temporal | Datos actuales | Datos históricos (años) |
| Ejemplos | ERP, CRM, e-commerce | Data Warehouse, Data Mart |
FUENTES DE DATOS ETL / ELT DW / DL CONSUMO
+---------------+ +---------------+ +---------------+ +----------+
| Sistemas ERP | → | Extract | → | Data Warehouse| → | Informes |
| CRM | | Transform | | (Star/Snowfl) | | Dashboards|
| Ficheros CSV | | Load | +-------+-------+ | OLAP |
| APIs externas | +---------------+ | | ML / IA |
| BBDD legadas | +------+------+ +----------+
+---------------+ | Data Marts |
+-------------+
El proceso ETL (Extract, Transform, Load) es el responsable de mover datos desde los sistemas fuente al Data Warehouse:
| Fase | Descripción |
|---|---|
| Extract (Extracción) | Obtención de datos de los sistemas fuente (BBDD, APIs, ficheros) |
| Transform (Transformación) | Limpieza, validación, integración, conversión de formatos, cálculo de métricas derivadas |
| Load (Carga) | Inserción de los datos transformados en el DW, típicamente en cargas nocturnas (batch) |
ELT (Extract, Load, Transform) es una variante moderna donde los datos se cargan primero en el DW (o Data Lake) y la transformación se realiza dentro del propio sistema, aprovechando su potencia de cómputo (Big Data, cloud DW).
El modelado dimensional fue desarrollado por Ralph Kimball como alternativa al enfoque de Inmon.
+---------------+
| DIM_TIEMPO |
| id_tiempo |
| año, mes, día |
+-------+-------+
|
+------------+ +---------+--------+ +---------------+
| DIM_CLIENTE| | | | DIM_PRODUCTO |
| id_cliente | → | TABLA DE HECHOS | ← | id_producto |
| nombre | | VENTAS | | nombre |
| ciudad | | | | categoria |
+------------+ | id_cliente (FK) | +---------------+
| id_producto (FK) |
| id_tiempo (FK) | +---------------+
| id_tienda (FK) | ← | DIM_TIENDA |
| importe | | id_tienda |
| unidades | | ciudad, pais |
+------------------+ +---------------+
Es una extensión del esquema estrella donde las tablas de dimensión están normalizadas, creando subdimensiones:
DIM_TIENDA → DIM_CIUDAD → DIM_PAIS
DIM_PRODUCTO → DIM_SUBCATEGORIA → DIM_CATEGORIA
| Tipo de métrica | Descripción | Ejemplo |
|---|---|---|
| Aditiva | Se puede sumar en todas las dimensiones | Importe de ventas |
| Semi-aditiva | Se puede sumar en algunas dimensiones, no en todas | Saldo de cuenta (no tiene sentido sumarlo en el tiempo) |
| No aditiva | No se puede sumar en ninguna dimensión | Ratio, porcentaje, precio unitario |
Un Data Mart es un subconjunto del Data Warehouse orientado a un departamento o área de negocio específica (ventas, finanzas, RRHH).
Un Data Lake es un repositorio que almacena datos en su formato nativo (sin transformar), incluyendo datos estructurados, semiestructurados y no estructurados.
| Característica | Data Warehouse | Data Lake |
|---|---|---|
| Datos | Estructurados, procesados | Todos los formatos (raw) |
| Esquema | Schema-on-write | Schema-on-read |
| Calidad | Alta (limpiados) | Variable (puede tener "data swamp") |
| Usuarios | Analistas de negocio | Data scientists, ingenieros de datos |
| Coste | Alto (almacenamiento estructurado) | Bajo (almacenamiento en objeto: S3, ADLS) |
| Tecnologías | Redshift, Snowflake, BigQuery | Hadoop HDFS, AWS S3, Azure Data Lake |
Data Lakehouse: arquitectura híbrida que combina la flexibilidad del Data Lake con las capacidades analíticas del Data Warehouse (Delta Lake, Apache Iceberg, Apache Hudi).
Las Dimensiones de Cambio Lento gestionan cómo se actualiza una tabla de dimensión cuando sus atributos cambian con el tiempo. Existen varios tipos:
| Tipo | Descripción | Ejemplo |
|---|---|---|
| SCD Tipo 0 | No se actualiza nunca | Fecha de nacimiento |
| SCD Tipo 1 | Sobrescribe el valor anterior (no hay histórico) | Corrección de errores tipográficos |
| SCD Tipo 2 | Añade una nueva fila con el nuevo valor (mantiene histórico) | Cambio de dirección del cliente |
| SCD Tipo 3 | Añade una nueva columna para el valor anterior | Cambio de nombre de producto |
Un cubo OLAP (Online Analytical Processing) es una estructura de datos multidimensional que organiza la información en:
| Operación | Descripción | Ejemplo |
|---|---|---|
| Roll-up (drill-up) | Subir en la jerarquía, agregar datos | De ventas por mes → ventas por trimestre |
| Drill-down | Bajar en la jerarquía, desagregar | De ventas por año → ventas por mes |
| Slice | Seleccionar una "rebanada" del cubo fijando una dimensión | Ventas solo del año 2023 |
| Dice | Seleccionar un subcubo fijando múltiples dimensiones | Ventas de 2023 en Madrid para Producto A |
| Pivot (rotate) | Rotar el cubo, cambiar la perspectiva | Ver ventas por producto en filas y por tiempo en columnas |
| Tipo | Descripción | Almacenamiento |
|---|---|---|
| MOLAP (Multidimensional OLAP) | El cubo se precalcula y almacena en formato multidimensional | Cubo multidimensional propietario |
| ROLAP (Relational OLAP) | El cubo se calcula dinámicamente sobre una BBDD relacional | Tablas relacionales (estrella/copo de nieve) |
| HOLAP (Hybrid OLAP) | Combinación de MOLAP y ROLAP | Híbrido |
MDX (MultiDimensional eXpressions) es el lenguaje estándar de consulta para bases de datos multidimensionales (cubos OLAP). Fue desarrollado originalmente por Microsoft para SQL Server Analysis Services (SSAS) y adoptado como estándar de facto.
SELECT
<eje_columnas> ON COLUMNS,
<eje_filas> ON ROWS
FROM <cubo>
[WHERE <slicer>]
| Elemento | Descripción | Ejemplo |
|---|---|---|
| Dimensión | Eje de análisis | [Tiempo], [Producto], [Geografia] |
| Jerarquía | Niveles de una dimensión | [Tiempo].[Calendario] |
| Miembro | Valor concreto en una jerarquía | [Tiempo].[2023], [Producto].[Laptop] |
| Medida | Valor numérico | [Measures].[Ventas], [Measures].[Unidades] |
| Conjunto (Set) | Colección de miembros | {[Producto].[Laptop], [Producto].[Tablet]} |
| Tupla | Combinación de miembros de distintas dimensiones | ([2023], [Laptop], [Madrid]) |
-- Ejemplo 1: Ventas por año en columnas, por producto en filas
SELECT
{[Tiempo].[2022], [Tiempo].[2023]} ON COLUMNS,
{[Producto].[Laptop], [Producto].[Tablet], [Producto].[Móvil]} ON ROWS
FROM [Ventas]
WHERE ([Measures].[Importe_Ventas])
-- Ejemplo 2: Total de ventas del año actual vs año anterior
SELECT
{ [Measures].[Ventas],
[Measures].[Ventas] } ON COLUMNS,
[Tiempo].[Año].Members ON ROWS
FROM [Ventas]
-- Ejemplo 3: Top 10 productos por ventas
SELECT
[Measures].[Importe_Ventas] ON COLUMNS,
TopCount(
[Producto].[Producto].Members,
10,
[Measures].[Importe_Ventas]
) ON ROWS
FROM [Ventas]
| Función | Descripción |
|---|---|
Members |
Todos los miembros de un nivel |
Children |
Hijos de un miembro en la jerarquía |
Parent |
Padre de un miembro |
Descendants |
Todos los descendientes |
TopCount(set, n, medida) |
Los N miembros con mayor valor |
BottomCount(set, n, medida) |
Los N miembros con menor valor |
Filter(set, condición) |
Filtra miembros según condición |
Sum(set, medida) |
Suma de una medida sobre un conjunto |
Avg(set, medida) |
Media de una medida |
ParallelPeriod |
Miembro del período paralelo (mismo mes del año anterior) |
YTD |
Year To Date (acumulado del año) |
MTD |
Month To Date (acumulado del mes) |
| Herramienta | Tipo | Descripción |
|---|---|---|
| Microsoft SQL Server Analysis Services (SSAS) | MOLAP/ROLAP | Servidor OLAP de Microsoft |
| Microsoft Power BI | ROLAP | Usa MDX y DAX internamente |
| SAP BW | MOLAP | Business Warehouse de SAP |
| Oracle OLAP | MOLAP | Módulo OLAP de Oracle DB |
| IBM Cognos | Herramienta BI | Usa MDX para consultas a cubos |
| Apache Mondrian | ROLAP open source | Motor OLAP sobre BBDD relacional |
| Pentaho | BI open source | Suite BI que usa Mondrian |
La minería de datos (data mining) es el proceso de descubrir patrones, correlaciones y conocimiento útil en grandes conjuntos de datos mediante técnicas estadísticas y de machine learning.
CRISP-DM (Cross-Industry Standard Process for Data Mining) es la metodología estándar para proyectos de minería de datos:
1. Comprensión del negocio (Business Understanding)
↓
2. Comprensión de los datos (Data Understanding)
↓
3. Preparación de los datos (Data Preparation) ←──┐
↓ |
4. Modelado (Modeling) ───────────────────────────┘
↓
5. Evaluación (Evaluation)
↓
6. Despliegue (Deployment)
| Fase | Actividades principales |
|---|---|
| Comprensión del negocio | Definir objetivos, criterios de éxito, plan de proyecto |
| Comprensión de los datos | Recopilar datos, exploración inicial, calidad de datos |
| Preparación de los datos | Selección, limpieza, construcción de variables, integración, formateo |
| Modelado | Selección de técnicas, diseño de pruebas, construcción y evaluación del modelo |
| Evaluación | Revisar si el modelo cumple los objetivos de negocio |
| Despliegue | Planificación, monitorización y mantenimiento del modelo en producción |
| Técnica | Descripción | Uso típico |
|---|---|---|
| Regresión lineal | Predicción de valores continuos | Predicción de precios |
| Regresión logística | Clasificación binaria | Detección de spam, fraude |
| Árboles de decisión | Clasificación y regresión con reglas | Diagnóstico médico, crédito |
| Random Forest | Ensemble de árboles de decisión | Clasificación robusta |
| SVM (Support Vector Machine) | Clasificación con hiperplanos | Reconocimiento de imágenes |
| Redes neuronales / Deep Learning | Modelos complejos de múltiples capas | Imagen, NLP, voz |
| Técnica | Descripción | Uso típico |
|---|---|---|
| K-Means | Agrupamiento (clustering) por centroides | Segmentación de clientes |
| DBSCAN | Clustering basado en densidad | Detección de anomalías |
| PCA (Principal Component Analysis) | Reducción de dimensionalidad | Visualización, preprocesamiento |
| Reglas de asociación (Apriori) | Patrones de co-ocurrencia | Market basket analysis |
| Análisis de componentes independientes (ICA) | Separación de señales | Procesamiento de señales |
El agente aprende por interacción con el entorno, maximizando una recompensa. Usado en robótica, juegos (AlphaGo), sistemas de recomendación.
El PCA (Principal Component Analysis) es una técnica de reducción de dimensionalidad:
Ejemplo del examen: dado un conjunto de 100.000 observaciones con 100 dimensiones, PCA se usa para obtener las mismas 100.000 observaciones pero con un número de dimensiones inferior a 100 (no reduce el número de observaciones, sino las dimensiones/características).
El concepto Big Data se caracteriza por las 5 Vs:
| V | Descripción |
|---|---|
| Volumen | Cantidad masiva de datos (petabytes, exabytes) |
| Velocidad | Alta velocidad de generación e ingesta (streaming, tiempo real) |
| Variedad | Múltiples formatos: estructurado, semiestructurado, no estructurado |
| Veracidad | Calidad e incertidumbre de los datos |
| Valor | El objetivo final: extraer valor de negocio |
Apache Hadoop es el framework open source de referencia para procesamiento de Big Data:
| Componente | Función |
|---|---|
| HDFS | Sistema de ficheros distribuido (Hadoop Distributed File System) |
| YARN | Gestión de recursos del clúster |
| MapReduce | Modelo de programación para procesamiento paralelo |
| Hive | SQL sobre Hadoop (HiveQL) |
| HBase | Base de datos columnar sobre HDFS |
| Pig | Lenguaje de scripts para flujos de datos |
| Sqoop | Importación/exportación entre Hadoop y BBDD relacionales |
| Flume | Ingesta de logs y datos de streaming |
| Oozie | Planificación de flujos de trabajo Hadoop |
| Zookeeper | Coordinación distribuida |
Apache Spark es el sustituto moderno de MapReduce para procesamiento de datos distribuido:
| Tipo | Modelo de datos | Escalabilidad | Consistencia | Ejemplos | Mejor para |
|---|---|---|---|---|---|
| Relacional | Tablas, filas, columnas | Vertical (principalmente) | ACID fuerte | MySQL, PostgreSQL, Oracle | Transacciones, datos estructurados con relaciones |
| Clave-valor | Par clave → valor | Horizontal excelente | BASE (configurable) | Redis, DynamoDB, Memcached | Caché, sesiones, contadores |
| Documental | Documentos JSON/BSON | Horizontal buena | Variable (ACID en MongoDB 4+) | MongoDB, CouchDB, Elasticsearch | Catálogos, CMS, perfiles de usuario |
| Columnar | Familias de columnas | Horizontal excelente | AP o CP según producto | Cassandra, HBase, BigTable | Escrituras masivas, series temporales, IoT |
| Grafos | Nodos y aristas | Moderada (difícil de particionar) | ACID (Neo4j) | Neo4j, Neptune, ArangoDB | Redes sociales, recomendaciones, fraude |
| Series temporales | Datos indexados por tiempo | Horizontal | Variable | InfluxDB, TimescaleDB, Prometheus | Métricas, IoT, monitorización |
| Búsqueda | Documentos indexados | Horizontal | Eventual | Elasticsearch, Solr | Full-text search, análisis de logs |
| Data Warehouse | Dimensional (estrella/copo) | Horizontal (cloud) | Alta | Redshift, BigQuery, Snowflake | Análisis histórico, reporting, BI |
¿Datos muy relacionados y consultas complejas en grafos?
→ Base de datos de GRAFOS (Neo4j)
¿Necesito máxima velocidad de lectura/escritura, datos simples?
→ CLAVE-VALOR (Redis, DynamoDB)
¿Documentos JSON con esquema flexible?
→ DOCUMENTAL (MongoDB)
¿Escrituras masivas distribuidas, IoT, series temporales?
→ COLUMNAR (Cassandra) o SERIES TEMPORALES (InfluxDB)
¿Análisis histórico, reporting, BI?
→ DATA WAREHOUSE (Redshift, BigQuery, Snowflake)
¿Búsqueda de texto completo, análisis de logs?
→ BÚSQUEDA (Elasticsearch)
¿Transacciones complejas, integridad referencial, SQL estándar?
→ RELACIONAL (PostgreSQL, MySQL, Oracle)
| Concepto | Dato clave |
|---|---|
| NoSQL significa | "Not Only SQL" (no solo SQL) |
| Teorema CAP | Solo se pueden garantizar 2 de 3: Consistencia, Disponibilidad, Tolerancia a particiones |
| ACID | Atomicidad, Consistencia, Aislamiento, Durabilidad (BBDD relacionales) |
| BASE | Básicamente disponible, Estado blando, Consistencia eventual (NoSQL) |
| Redis | Clave-valor, in-memory, estructuras de datos ricas, caché, sesiones |
| MongoDB | Documental, documentos JSON/BSON, esquema flexible, Aggregation Pipeline |
| Cassandra | Columnar, sin maestro (masterless), AP, escrituras masivas, CQL |
| HBase | Columnar, sobre Hadoop HDFS, CP, inspirado en Google Bigtable |
| Neo4j | Grafos, Property Graph Model, lenguaje Cypher |
| Elasticsearch | Documental + búsqueda de texto completo, basado en Lucene |
| InfluxDB | Series temporales, métricas, IoT |
| Data Warehouse (Inmon) | Orientado a temas, integrado, variable en el tiempo, no volátil |
| OLTP vs OLAP | OLTP = operacional, normalizado; OLAP = analítico, desnormalizado |
| Esquema estrella | Tabla de hechos + tablas de dimensión (desnormalizado) |
| Esquema copo de nieve | Dimensiones normalizadas (más JOINs) |
| MDX | Lenguaje de consulta para cubos OLAP multidimensionales |
| CRISP-DM | Metodología de minería de datos: 6 fases |
| PCA | Reducción de dimensionalidad (mantiene observaciones, reduce dimensiones) |
| K-Means | Clustering, aprendizaje no supervisado, descubrir grupos ocultos |
| Aprendizaje supervisado | Datos etiquetados (clasificación y regresión) |
| ETL | Extract, Transform, Load (proceso de carga al DW) |
| Data Lake | Datos en formato nativo (raw), schema-on-read |
| Big Data 5 Vs | Volumen, Velocidad, Variedad, Veracidad, Valor |
P: Neo4j, ¿qué tipo de base de datos es?
→ b) Base de datos orientada a grafos (no relacional, no columnar)
P: ¿Cuál de las siguientes opciones no es un sistema de gestión de bases de datos?
→ b) SQL (SQL es un lenguaje, no un SGBD; MySQL y Microsoft SQL Server sí son SGBD)
P: Indica qué base de datos es del tipo Clave-valor:
→ c) Redis (MongoDB es documental; Neo4j es de grafos)
P: ¿Qué lenguaje debo utilizar para realizar una consulta a una base de datos multidimensional (cubo OLAP)?
→ a) MDX (MultiDimensional eXpressions) (MQL y SMQL no existen como estándares)
P: ¿Cuál de las siguientes características se corresponde con una de las características de los datawarehouse?
→ c) La información se organiza por temas o áreas de negocio (sí distingue datos actuales de históricos; no es volátil)
P: Un almacén de datos se diferencia de una base de datos en:
→ c) Ambos son sistemas de almacenamiento, pero se utilizan para propósitos distintos (el DW para análisis histórico, la BBDD operacional para transacciones diarias)
P: En minería de datos se analizan hechos sobre la realidad basándose en los datos disponibles. Estos datos se organizan en dimensiones que son:
→ a) Las diferentes perspectivas a través de las que se pueden analizar los datos disponibles (no son datos numéricos ni tablas físicas)
P: Dado un conjunto de datos con 100.000 observaciones, donde cada observación es un vector real de 100 dimensiones, normalmente usaremos PCA para:
→ b) Obtener 100.000 observaciones, pero con un número de dimensiones inferior a 100 (PCA reduce dimensiones, no observaciones)
P: ¿Qué técnica de aprendizaje automático es más adecuada para descubrir grupos ocultos en un conjunto de datos?
→ c) K-Means clustering (regresión lineal es supervisada; árboles de decisión son para clasificación/regresión supervisada)
P: De acuerdo con la metodología CRISP-DM, ¿cuántas fases presenta el proceso de minería de datos?
→ c) 6 (no 7, no 8)
P: Respecto a JSON, ¿pueden las bases de datos almacenar y utilizar datos en este formato?
→ a) Sí, existen algunas bases que permiten trabajar con JSON de manera nativa (MongoDB, PostgreSQL con jsonb, MySQL, etc.)
P: ¿Cuál es la función principal de un Sistema de Información Geográfica (SIG)?
→ a) Capturar, almacenar, analizar y visualizar datos geográficos para comprender patrones y relaciones espaciales