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.