Introduction
Un data warehouse centralise les données de votre entreprise pour l'analyse. Contrairement à une base transactionnelle, il est optimisé pour les requêtes complexes et l'historisation. Ce tutoriel vous guide pas à pas pour créer un data warehouse simple avec PostgreSQL en 2026.
Prérequis
- PostgreSQL 16+
- Connaissances SQL de base
- Python 3.11+
- Docker Desktop installé
Lancer PostgreSQL avec Docker
docker run --name dw-postgres -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:16Cette commande démarre un conteneur PostgreSQL persistant. Le port 5432 est exposé pour les connexions locales.
Créer la base et le schéma en étoile
CREATE DATABASE datawarehouse;
\c datawarehouse;
CREATE TABLE dim_client (
client_id SERIAL PRIMARY KEY,
nom VARCHAR(100),
ville VARCHAR(50)
);
CREATE TABLE dim_produit (
produit_id SERIAL PRIMARY KEY,
nom VARCHAR(100),
categorie VARCHAR(50)
);
CREATE TABLE fact_ventes (
vente_id SERIAL PRIMARY KEY,
client_id INT REFERENCES dim_client(client_id),
produit_id INT REFERENCES dim_produit(produit_id),
montant DECIMAL(10,2),
date_vente DATE
);Nous créons une structure en étoile classique : deux dimensions et une table de faits. Cela optimise les jointures analytiques.
Script ETL simple en Python
import psycopg2
conn = psycopg2.connect("host=localhost dbname=datawarehouse user=postgres password=secret")
cur = conn.cursor()
cur.execute("INSERT INTO dim_client (nom, ville) VALUES ('Jean Dupont', 'Paris');")
cur.execute("INSERT INTO dim_produit (nom, categorie) VALUES ('Laptop', 'Informatique');")
cur.execute("INSERT INTO fact_ventes (client_id, produit_id, montant, date_vente) VALUES (1, 1, 999.99, '2026-01-15');")
conn.commit()
cur.close()
conn.close()Ce script insère des données de test dans les tables. En production, remplacez les valeurs par des données extraites de sources externes.
Requête d'analyse
SELECT
dc.ville,
dp.categorie,
SUM(fv.montant) AS total_ventes
FROM fact_ventes fv
JOIN dim_client dc ON fv.client_id = dc.client_id
JOIN dim_produit dp ON fv.produit_id = dp.produit_id
GROUP BY dc.ville, dp.categorie
ORDER BY total_ventes DESC;Cette requête agrège les ventes par ville et catégorie. Elle exploite la structure en étoile pour des performances optimales.
Configuration du fichier .env
DB_HOST=localhost
DB_PORT=5432
DB_NAME=datawarehouse
DB_USER=postgres
DB_PASSWORD=secretStockez les identifiants de connexion dans un fichier .env pour éviter de les hardcoder dans le code source.
Bonnes pratiques
- Utilisez toujours des clés primaires surrogates
- Séparez les données brutes (staging) des données modélisées
- Documentez chaque table et colonne
- Automatisez les chargements ETL avec des outils comme Airflow
Erreurs courantes à éviter
- Oublier les index sur les clés étrangères
- Charger des données sans nettoyage préalable
- Utiliser des types de données trop génériques (TEXT au lieu de VARCHAR)
- Ignorer la gestion des dates et des fuseaux horaires
Pour aller plus loin
Découvrez nos formations Learni sur la data engineering et les data warehouses avancés.