Saltar al contenido
Datacon Alex— inicio
YouTube
← Glosario

Modelado

Modelo estrella

en inglés: Star Schema

Una forma de organizar el almacén en una tabla central de hechos —lo que pasó, con sus números— rodeada de tablas de dimensiones que describen el contexto. Se dibuja como una estrella y por eso el nombre.

El modelo estrella responde a una pregunta muy concreta: cómo acomodar las tablas para que un analista pueda contestar preguntas del negocio sin escribir consultas de cuarenta líneas.

La respuesta: una tabla al centro con lo que pasó, y alrededor tablas con el contexto de lo que pasó.

Hechos

La tabla de hechos guarda eventos medibles: una venta, un clic, un envío. Tiene dos tipos de columnas y nada más:

  • Métricas: los números que se suman. Cantidad, importe, descuento.
  • Llaves foráneas: apuntadores a las dimensiones.

Es larga —millones de filas— y angosta.

Dimensiones

Las dimensiones describen el quién, qué, cuándo y dónde. Cliente, producto, tienda, fecha. Son cortas y anchas: pocas filas, muchas columnas de texto que sirven para filtrar y agrupar.

-- Dimensión: pocas filas, muchos atributos descriptivos.
CREATE TABLE dim_producto (
  id_producto   INT PRIMARY KEY,   -- llave sustituta
  sku           VARCHAR(32),       -- llave del sistema origen
  nombre        VARCHAR(200),
  categoria     VARCHAR(80),
  marca         VARCHAR(80)
);

-- Hechos: muchas filas, casi puros números y llaves.
CREATE TABLE hechos_ventas (
  id_fecha      INT REFERENCES dim_fecha(id_fecha),
  id_producto   INT REFERENCES dim_producto(id_producto),
  id_cliente    INT REFERENCES dim_cliente(id_cliente),
  cantidad      INT,
  importe       DECIMAL(12,2)
);

Con eso, la pregunta "¿cuánto vendimos de calzado por mes?" es un JOIN y un GROUP BY, legible para cualquiera:

SELECT f.mes, SUM(h.importe) AS venta
FROM hechos_ventas h
JOIN dim_fecha    f ON f.id_fecha = h.id_fecha
JOIN dim_producto p ON p.id_producto = h.id_producto
WHERE p.categoria = 'Calzado'
GROUP BY f.mes
ORDER BY f.mes;

Por qué se desnormaliza a propósito

En una base transaccional normalizarías: sacarías categoria y marca a sus propias tablas para no repetir texto. Aquí no, y es deliberado.

Cada tabla extra es un JOIN extra en cada consulta. Como el almacén se optimiza para leer y no para escribir, repetir la palabra "Calzado" diez mil veces sale más barato que obligar a cada consulta a dar un salto más. Cuando sí se normalizan las dimensiones, la estrella se convierte en un copo de nieve (snowflake), y en general se evita.

Llaves sustitutas

Habrás notado el id_producto además del sku. Esa llave sustituta (surrogate key) es un entero que tú generas y controlas. Sirve para dos cosas: te aísla de que el origen cambie su forma de numerar, y es lo que hace posible guardar historia con dimensiones de cambio lento.

Siguientes en la fila