Salta el contingut

Data Warehouse

Un Data Warehouse (magatzem de dades, DW) és un sistema d'emmagatzematge analític dissenyat específicament per donar suport a la presa de decisions de negoci. A diferència d'una base de dades operacional que optimitza les escriptures individuals (OLTP), el Data Warehouse optimitza les lectures massives sobre grans volums de dades histórics (OLAP). Entendre el DW és fonamental perquè és la capa "Gold" de quasi totes les arquitectures de Big Data modernes: el lloc on les dades netejades es transformen en coneixement de negoci.


OLTP vs OLAP: dues filosofies oposades

La distinció entre OLTP i OLAP és el primer concepte que cal entendre per comprendre per qué existeix el Data Warehouse.

OLTP — Processament transaccional en línia

Un sistema OLTP (Online Transaction Processing) és la base de dades que suporta les operacions del dia a dia d'una empresa: les comandes d'un e-commerce, les reserves d'un hotel, les transaccions bancàries. Les seves característiques fonamentals són:

  • Lectures i escriptures individuals: inserir un registre, actualitzar l'estoc d'un producte, llegir la comanda d'un client concret.
  • Dades actuals: conté l'estat present de l'empresa, rarament l'historial complet.
  • Esquema normalitzat (3FN): minimitza la redundància de dades i protegeix la integritat referencial.
  • Molts usuaris concurrents: centenars o milers d'usuaris fent operacions simultànies.
  • Latència molt baixa: cada operació ha de completar-se en mil·lisegons.

Exemple: la base de dades PostgreSQL d'una botiga en línia que gestiona els pedidos, els clients i l'estoc.

OLAP — Processament analític en línia

Un sistema OLAP (Online Analytical Processing) és el sistema que respon preguntes analítiques: quines categories de producte han venut més aquest trimestre? Quin és el marge brut per regió comparant el 2025 amb el 2024? Les seves característiques fonamentals són:

  • Lectures massives: una consulta llegeix milions o milers de milions de registres per calcular un agregat.
  • Dades histórics: conté anys d'historial per permetre comparatives temporals.
  • Esquema desnormalitzat: optimitzat per a la velocitat de lectura, sacrificant l'eficiència d'escriptura.
  • Pocs usuaris concurrents: desenes o centenars d'analistes de negoci.
  • Latència de consulta de segons o minuts: acceptable per a anàlisi, no per a operació.
Característica OLTP OLAP
Operació típica INSERT / UPDATE individual SELECT amb GROUP BY i JOINs massius
Volum de dades llegit Uns pocs registres Milions - milers de milions
Usuaris Molts (1.000+) Pocs (10-100 analistes)
Esquema Normalitzat (3FN) Desnormalitzat (estrella, floc de neu)
Historial Dades actuals Anys d'historial
Motor típic PostgreSQL, MySQL, SQL Server Redshift, Snowflake, BigQuery, Synapse
Emmagatzematge Per files (row-oriented) Per columnes (columnar)

Per qué l'emmagatzematge columnar és clau per a OLAP

En un sistema row-oriented, tots els camps d'un registre es guarden consecutivament al disc. Per llegir la columna import_net de 100 milions de registres, cal llegir tot el bloc de dades de cada registre, incloent els camps que no s'usen (id_client, id_producte, data, etc.).

En un sistema column-oriented (columnar), tots els valors de la mateixa columna es guarden junts. Per llegir import_net de 100 milions de registres, el motor llegeix únicament el bloc corresponent a import_net, ignorant completament les altres columnes. Resultat: menys I/O, millor compressió (valors del mateix tipus es comprimen millor), i execució vectoritzada molt més ràpida.


Kimball vs Inmon: dues filosofies de disseny

Hi ha dues escoles de pensament clàssiques sobre com dissenyar un Data Warehouse. Cap de les dues és "correcta" de forma absoluta: la tria depèn del context, la mida de l'organització i la maduresa del equip de dades.

La filosofia de Kimball — Bottom-up

Ralph Kimball va proposar el modelatge dimensional com a base del DW. La seva aproximació és bottom-up (de baix a dalt): es construeix un Data Mart per a cada àrea de negoci (vendes, finances, recursos humans) i s'integren progressivament en un DW complet.

Les unitats bàsiques del modelatge dimensional de Kimball són les taules de fets i les taules de dimensions, organitzades en un esquema estrella.

Avantatges de l'enfocament Kimball: - Resultats ràpids: el primer Data Mart es pot tenir en poques setmanes. - Fàcil d'entendre per als analistes de negoci. - Directament usable per a BI sense transformació addicional.

La filosofia de Inmon — Top-down

Bill Inmon va proposar que un DW ha de ser primer un repositori centralitzat, normalitzat i integrat de totes les dades de l'empresa (Corporate Information Factory), i que els Data Marts per a cada àrea de negoci es creen a partir d'aquest repositori central.

La seva aproximació és top-down (de dalt a baix): primer es dissenya l'arquitectura global i el model de dades corporatiu (normalitzat en 3FN), i després se'n deriven els Data Marts desnormalitzats per a cada àrea.

Avantatges de l'enfocament Inmon: - Consistència total de les dades a tota l'organització. - Flexibilitat per crear nous Data Marts sense reestructurar les dades. - Millor per a grans corporacions amb moltes àrees de negoci.

Desavantatges: el temps fins als primers resultats és molt més llarg i requereix un equip de disseny de dades molt experientat.


Modelatge dimensional de Kimball

El modelatge dimensional organitza les dades al voltant de dos tipus de taules: les taules de fets (que contenen les mètriques) i les taules de dimensions (que contenen el context).

Taules de fets (Fact Tables)

Una taula de fets registra els esdeveniments de negoci mesurables: una venda, un vol, una trucada de telèfon, una sessió web. Cada fila representa una ocurrència d'un fet a un cert nivell de detall (la granularitat).

Característiques d'una taula de fets: - Conté mètriques numèriques (imports, quantitats, durades, distàncies) que se sumen o s'agreguen. - Conté claus foranes (FKs) cap a totes les taules de dimensions relacionades. - Pot ser molt gran (milers de milions de files en sistemes grans). - Les columnes propies solen ser poques (les FK + les mètriques).

Granularitat

La granularitat és el nivell de detall de cada fila de la taula de fets. Triar la granularitat correcta és una de les decisions de disseny més importants:

  • Granularitat alta (molts detalls): cada fila és una línia d'una comanda individual. Permet calcular qualsevol agregació, però la taula és molt gran.
  • Granularitat baixa (menys detalls): cada fila és el total de vendes d'un dia per una botiga. La taula és petita però no es poden fer certes anàlisis detallades.

La recomanació de Kimball és sempre triar la granularitat més fina possible que sigui còmoda d'emmagatzemar, per tenir màxima flexibilitat analítica.

Taules de dimensions (Dimension Tables)

Les taules de dimensions contenen el context descriptiu dels fets: qui, on, quan, qué. No contenen mètriques numèriques, sinó atributs textuals que permeten filtrar, agrupar i etiquetar els fets.

Característiques d'una taula de dimensions: - Conté atributs descriptius (nom, categoria, adreça, descripció, codi postal). - Normalment és relativament petita (milers o desenes de milers de files, rarament milions). - Usa una surrogate key (clau sintètica, normalment un enter incremental) com a clau primària, independent de la clau de negoci del sistema origen. - Pot contenir jerarquies (país → comunitat → província → municipi) aplanades en columnes separades.

Per qué surrogate keys i no les claus de negoci?

Les claus de negoci (el codi de client del sistema CRM, el codi de producte del ERP) pot canviar, pot tenir formats inconsistents, o pot repetir-se entre sistemes. Les surrogate keys eviten aquests problemes i permeten gestionar els canvis histórics de les dades (Slowly Changing Dimensions).


Esquema estrella (Star Schema)

L'esquema estrella és el patró de modelatge dimensional recomanat per Kimball per a la majoria de casos d'ús. La taula de fets es troba al centre, i les taules de dimensions l'envolten com les puntes d'una estrella.

erDiagram
    FACT_VENDES ||--o{ DIM_TEMPS : "sk_temps"
    FACT_VENDES ||--o{ DIM_PRODUCTE : "sk_producte"
    FACT_VENDES ||--o{ DIM_CLIENT : "sk_client"
    FACT_VENDES ||--o{ DIM_BOTIGA : "sk_botiga"
    FACT_VENDES ||--o{ DIM_PROMOTIO : "sk_promotio"

    FACT_VENDES {
        bigint sk_venda PK
        int sk_temps FK
        int sk_producte FK
        int sk_client FK
        int sk_botiga FK
        int sk_promotio FK
        decimal quantitat
        decimal preu_unitari
        decimal import_net
        decimal cost_unitari
        decimal marge_brut
    }

    DIM_TEMPS {
        int sk_temps PK
        date data_completa
        int any
        int trimestre
        int mes
        string nom_mes
        int setmana
        int dia_setmana
        string nom_dia
        boolean es_cap_de_setmana
        boolean es_festiu
    }

    DIM_PRODUCTE {
        int sk_producte PK
        string codi_producte_negoci
        string nom_producte
        string categoria
        string subcategoria
        string marca
        string unitat_mesura
        decimal preu_pvp
    }

    DIM_CLIENT {
        int sk_client PK
        string codi_client_negoci
        string nom_client
        string segment
        string pais
        string comunitat
        string provincia
        string municipi
        string canal_adquisicio
        date data_alta
    }

    DIM_BOTIGA {
        int sk_botiga PK
        string codi_botiga
        string nom_botiga
        string tipus_botiga
        string pais
        string provincia
        string adreca
        int any_obertura
    }

    DIM_PROMOTIO {
        int sk_promotio PK
        string codi_promotio
        string nom_promotio
        string tipus_promotio
        decimal descompte_pct
        date data_inici
        date data_fi
    }

Avantatges de l'esquema estrella

  • Simplicitat: un analista pot entendre el model sense documentació exhaustiva.
  • Rendiment: un JOIN entre la taula de fets i una sola dimensió és molt eficient, fins i tot sobre milions de files.
  • Compatibilitat: tots els motors de DW i eines de BI entenen l'esquema estrella.
  • Desnormalitzat: les dimensions aplanades (sense normalitzar) redueixen el nombre de JOINs necessaris per a les consultes.

Exemple SQL: consulta típica de BI sobre el DW

-- Vendes per trimestre, per comunitat i per categoria de producte
-- per al any 2025, comparades amb el 2024
SELECT
    t.any,
    t.trimestre,
    cl.comunitat,
    p.categoria,
    SUM(f.import_net)                                    AS total_vendes,
    SUM(f.marge_brut)                                   AS total_marge,
    ROUND(SUM(f.marge_brut) / SUM(f.import_net) * 100, 2) AS pct_marge,
    COUNT(DISTINCT f.sk_client)                          AS clients_actius
FROM fact_vendes f
JOIN dim_temps     t  ON f.sk_temps    = t.sk_temps
JOIN dim_client    cl ON f.sk_client   = cl.sk_client
JOIN dim_producte  p  ON f.sk_producte = p.sk_producte
WHERE t.any IN (2024, 2025)
GROUP BY t.any, t.trimestre, cl.comunitat, p.categoria
ORDER BY t.any, t.trimestre, total_vendes DESC;

Esquema en floc de neu (Snowflake Schema)

L'esquema en floc de neu és una variant de l'esquema estrella on les dimensions es normalitzen: les jerarquies es descomponen en taules separades. Per exemple, en lloc d'una sola taula DIM_CLIENT amb pais, provincia i municipi, hi hauria taules DIM_PAIS, DIM_PROVINCIA i DIM_MUNICIPI relacionades entre elles.

Avantatge: menor redundància de dades en les dimensions.

Desavantatge: més JOINs en cada consulta, menor rendiment, major complexitat per als analistes.

La majoria d'equips de dades prefereixen l'esquema estrella per la seva simplicitat i rendiment. L'esquema en floc de neu s'usa ocasionalment per a dimensions molt grans on la redundància és problemàtica.


Slowly Changing Dimensions (SCD)

Les dimensions canvien al llarg del temps: un client canvia d'adreça, un producte canvia de categoria, una botiga canvia de nom. La pregunta clau és: quan canvia un atribut d'una dimensió, com gestionen el canvi?

SCD Tipus 1 — Sobreescriptura (Overwrite)

L'atribut antic s'esborrar i es substitueix pel valor nou. No es conserva cap historial.

Quan usar: quan el valor anterior no té cap valor analític (per exemple, un error d'introducció de dades que cal corregir, o un codi postal mal introduït).

Limitació: les anàlisis histórics que segmentin per l'atribut modificat quedaran inconsistents (les vendes antigues apareixeran associades al valor nou, no al valor que era vàlid quan es va fer la venda).

SCD Tipus 2 — Historial complet (Nova fila)

Quan un atribut canvia, s'insereix una nova fila a la taula de dimensions amb el valor nou i dates de vigència (data_inici i data_fi). La fila antiga es tanca amb la data de canvi. El registre de la taula de fets sempre apunta a la surrogate key de la versió vàlida en el moment de la venda.

-- Exemple de DIM_CLIENT amb SCD Tipus 2
-- El client C001 va viure a Girona fins al 2024-06-30 i des del 2024-07-01 viu a Barcelona
SELECT sk_client, codi_client_negoci, nom_client, provincia, data_inici, data_fi, es_actual
FROM dim_client
WHERE codi_client_negoci = 'C001'
ORDER BY data_inici;

-- sk | codi  | nom          | provincia | data_inici | data_fi    | es_actual
-- 1  | C001  | Maria Puig   | Girona    | 2020-01-01 | 2024-06-30 | false
-- 47 | C001  | Maria Puig   | Barcelona | 2024-07-01 | 9999-12-31 | true

Quan usar: quan cal analitzar el comportament históric amb el valor vàlid en el moment de l'event. És el tipus de SCD més usat en Data Warehouses professionals.

SCD Tipus 3 — Atribut anterior (Columna addicional)

S'afegeix una columna addicional a la taula de dimensions per emmagatzemar el valor anterior: provincia_actual i provincia_anterior. Només es conserva un nivell d'historial.

Quan usar: quan cal comparar el valor actual i l'anterior, però no hi ha necessitat d'un historial complet. Poc usat en pràctica perquè és inflexible (si hi ha un tercer canvi, es perd el primer valor).


Càrrega de dades: ETL tradicional vs ELT modern

ETL (Extract, Transform, Load) tradicional

En l'ETL clàssic, les dades s'extreuen de les fonts, es transformen en un servidor d'ETL intermig (que pot ser un servidor Informatica, SSIS, o un clúster Spark), i finalment es carreguen ja transformades al DW.

Avantatge: el DW no ha de gestionar el cost de la transformació. Desavantatge: requereix infraestructura ETL addicional i la transformació és un coll d'ampolla si el volum creix.

ELT (Extract, Load, Transform) modern

En l'ELT modern, les dades s'extreuen de les fonts, es carreguen en brut al DW (o al lake), i les transformacions s'executen dins del propi DW aprofitant la seva potència de còmput distribuïda. Eines com dbt (data build tool) codifiquen les transformacions com a models SQL que s'executen directament a Snowflake, Redshift o BigQuery.

Avantatge: simplifica l'arquitectura, aprofita la potència dels DW moderns, i les transformacions estan versionades com a codi. Desavantatge: totes les dades brutes arriben al DW, augmentant el cost d'emmagatzematge.

Càrrega incremental vs full load

  • Full load: trunca la taula i la reconstrueix completament en cada execució. Simple, però inviable per a taules de fets de milers de milions de files.
  • Incremental: insereix o actualitza únicament els registres nous o modificats des de l'última càrrega. Requereix identificar els registres nous (per timestamp, per CDC — Change Data Capture, per watermark).
  • Idempotència: una càrrega idempotent produeix el mateix resultat si s'executa una o deu vegades. Essencial per a pipelines resilients: si una execució falla a mig camí i es torna a executar, no s'han de duplicar dades.

Eines modernes de Data Warehouse

Eina Proveïdor Arquitectura Punt fort
Snowflake Snowflake Inc. Separació còmput/emmagatzematge Escalat independent, multi-cloud (AWS/Azure/GCP)
Google BigQuery Google Cloud Serverless Sense gestió de clústers, cost per query
Amazon Redshift AWS MPP + RA3 nodes Integrat amb ecosistema AWS
Azure Synapse Microsoft MPP + Serverless Integrat amb ecosistema Azure + Power BI
Databricks SQL Databricks Lakehouse (Delta Lake) Unifica DW i Data Lake, multi-cloud

La tendència: del DW al Lakehouse

L'any 2026, la frontera entre Data Warehouse i Data Lake s'ha difuminat significativament. Plataformes com Databricks i Snowflake permeten consultar dades obertes (Parquet, Iceberg) des del DW, i emmagatzemar les dades del DW en formats oberts. El terme "Lakehouse" descriu aquesta convergència. En projectes nous, és cada vegada menys comú construir un DW clàssic separat del lake.


AC5074/04/03 — Miniactivitat

Una aerolínia de baix cost vol construir un Data Warehouse per analitzar el rendiment dels seus vols: taxes d'ocupació, puntualitat, ingressos per ruta, costs operacionals i satisfacció dels passatgers.

Dissenya el model dimensional per a aquest Data Warehouse:

  1. Identifica la taula de fets principal. Quina és la granularitat adequada (per vol, per passatger i vol, per segment de vol)? Raona la tria en base a les consultes analítiques que s'haurien de poder respondre.
  2. Identifica almenys cinc taules de dimensions. Per a cada dimensió, llista els 5 atributs més importants.
  3. Quin atribut de la dimensió DIM_RUTA podria canviar al llarg del temps (per exemple, si l'aerolínia canvia la categoria d'una ruta de "domèstica" a "europeu")? Quin tipus de SCD usaries i per qué?
  4. Escriu la consulta SQL que respondria: "Quines 10 rutes han tingut la major taxa d'ocupació mitjana durant el segon trimestre de 2025, i quants minuts de retard mig han tingut?"
  5. Dibuixa l'esquema estrella resultant en format Mermaid (erDiagram).

Format de lliurament: document amb el model i la consulta SQL, entregat al Campus Virtual.


Mòdul M5074 Sistemes de Big Data | Institut Sa Palomera (Blanes) | Curs CEIABD 2026-2027