Introduction aux Bases de Données Relationnelles
Ce module présente les concepts fondamentaux des bases de données relationnelles.
Prérequis
| Niveau | Compétence |
|---|---|
| ✅ Requis | Avoir suivi le module 05_python_data_processing |
| ✅ Requis | Comprendre les structures de données (listes, dictionnaires) |
Objectifs du module
À la fin de ce notebook, tu seras capable de :
- Expliquer ce qu’est une base de données
- Comprendre le modèle relationnel (tables, colonnes, lignes)
- Définir les clés primaires et étrangères
- Identifier les types de relations (1-1, 1-N, N-N)
- Comprendre les principes de normalisation
- Expliquer les propriétés ACID
- Différencier OLTP et OLAP
- Expliquer ce qu’est un Data Warehouse et un Data Mart
- Comprendre la modélisation dimensionnelle (Star/Snowflake Schema)
- Distinguer tables de faits et tables de dimensions
💡 Note : Ce module est théorique. La pratique SQL viendra au module suivant !
1. C’est quoi une Base de Données ?
Définition
Une base de données est un système organisé pour :
| Fonction | Description |
|---|---|
| 💾 Stocker | Conserver des informations de façon permanente |
| 🔍 Rechercher | Retrouver rapidement n’importe quelle donnée |
| ✏️ Modifier | Mettre à jour les informations |
| 🔒 Sécuriser | Contrôler l’accès aux données sensibles |
| 🔗 Relier | Connecter différentes informations entre elles |
En une phrase
“Une base de données, c’est comme un classeur numérique géant, ultra-organisé et intelligent, capable de retrouver n’importe quelle information parmi des milliards de données.”
Fichiers vs Base de données
Pourquoi ne pas simplement utiliser des fichiers CSV ou Excel ?
| Critère | Fichiers (CSV, Excel) | Base de données |
|---|---|---|
| Accès concurrent | ❌ Conflits si plusieurs utilisateurs | ✅ Géré automatiquement |
| Volume | ❌ Lent au-delà de ~100K lignes | ✅ Millions/milliards de lignes |
| Intégrité | ❌ Pas de validation | ✅ Contraintes, types |
| Relations | ❌ Difficile à gérer | ✅ Jointures natives |
| Sécurité | ❌ Tout ou rien | ✅ Permissions fines |
| Sauvegarde | ❌ Manuelle | ✅ Automatique |
2. Le SGBD — Système de Gestion de Base de Données
Un SGBD (ou DBMS en anglais) est le logiciel qui gère la base de données.
┌─────────────────────────────────────────────────────────────┐
│ APPLICATION │
│ (Python, Java, Web...) │
└───────────────────────────┬─────────────────────────────────┘
│ Requêtes SQL
▼
┌─────────────────────────────────────────────────────────────┐
│ SGBD │
│ (PostgreSQL, MySQL, Oracle...) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Parser │ │ Optimizer │ │ Engine │ │
│ │ (SQL) │ │ (requêtes) │ │ (stockage) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ FICHIERS DISQUE │
│ (données stockées) │
└─────────────────────────────────────────────────────────────┘
SGBD Relationnels populaires
| SGBD | Type | Points forts | Cas d’usage |
|---|---|---|---|
| PostgreSQL | Open source | Puissant, extensible, SQL avancé | Production, analytics |
| MySQL | Open source | Simple, rapide, très répandu | Web, startups |
| SQLite | Embarqué | Léger, fichier unique, zéro config | Mobile, prototypage |
| Oracle | Commercial | Entreprise, haute disponibilité | Banques, grandes entreprises |
| SQL Server | Commercial | Intégration Microsoft | Entreprises Windows |
💡 Pour ce cours, on utilisera PostgreSQL — le plus complet et gratuit.
3. Le Modèle Relationnel
Le modèle relationnel a été inventé par Edgar F. Codd (IBM) en 1970. C’est le modèle le plus utilisé depuis 50 ans !
Vocabulaire de base
BASE DE DONNÉES : ma_boutique
│
├── TABLE : clients
│ │
│ │ COLONNES (attributs)
│ │ ↓ ↓ ↓
│ │ ┌─────┬────────┬─────────────────┐
│ │ │ id │ nom │ email │ ← EN-TÊTE
│ │ ├─────┼────────┼─────────────────┤
│ │ │ 1 │ Alice │ alice@mail.com │ ← LIGNE (tuple)
│ │ │ 2 │ Bob │ bob@mail.com │ ← LIGNE (tuple)
│ │ │ 3 │ Charlie│ charlie@mail.com│ ← LIGNE (tuple)
│ │ └─────┴────────┴─────────────────┘
│ │ ↑
│ │ CELLULE (valeur)
│
├── TABLE : produits
│ └── ...
│
└── TABLE : commandes
└── ...
Terminologie
| Terme technique | Terme courant | Description |
|---|---|---|
| Relation | Table | Ensemble de données du même type |
| Tuple | Ligne / Enregistrement | Une entrée (ex: un client) |
| Attribut | Colonne / Champ | Une propriété (ex: nom, email) |
| Domaine | Type | Valeurs possibles (INTEGER, VARCHAR…) |
| Schéma | Structure | Définition des colonnes et types |
4. Types de données
Chaque colonne a un type qui définit les valeurs autorisées.
Types courants (PostgreSQL)
| Catégorie | Type | Description | Exemple |
|---|---|---|---|
| Entiers | INTEGER |
Nombre entier | 42 |
BIGINT |
Grand entier | 9223372036854775807 |
|
SMALLINT |
Petit entier | 32767 max |
|
| Décimaux | DECIMAL(p,s) |
Précision exacte | 19.99 |
FLOAT |
Approximatif | 3.14159 |
|
| Texte | VARCHAR(n) |
Texte variable (max n) | 'Alice' |
TEXT |
Texte illimité | 'Long texte...' |
|
CHAR(n) |
Texte fixe (n caractères) | 'FR' |
|
| Booléen | BOOLEAN |
Vrai/Faux | TRUE, FALSE |
| Date/Heure | DATE |
Date seule | '2024-01-15' |
TIMESTAMP |
Date + heure | '2024-01-15 14:30:00' |
|
TIME |
Heure seule | '14:30:00' |
|
| Autres | UUID |
Identifiant unique | 'a0eebc99-9c0b...' |
JSON |
Données JSON | '{"key": "value"}' |
💡 Bonnes pratiques
| ✅ Faire | ❌ Éviter |
|---|---|
DECIMAL pour l’argent |
FLOAT pour l’argent (imprécis) |
VARCHAR(255) pour emails |
TEXT partout (pas de limite) |
DATE pour les dates |
VARCHAR pour les dates |
| Types les plus petits possibles | Types trop grands “au cas où” |
5. Clé Primaire (Primary Key)
La clé primaire (PK) identifie de façon unique chaque ligne d’une table.
Règles
| Règle | Description |
|---|---|
| Unique | Deux lignes ne peuvent pas avoir la même valeur |
| Non NULL | La valeur doit toujours être présente |
| Immuable | Ne devrait jamais changer |
Exemple
Table : clients
┌─────────┬──────────┬─────────────────┐
│ id (PK) │ nom │ email │
├─────────┼──────────┼─────────────────┤
│ 1 │ Alice │ alice@mail.com │
│ 2 │ Bob │ bob@mail.com │
│ 3 │ Charlie │ charlie@mail.com│
└─────────┴──────────┴─────────────────┘
↑
Clé primaire : garantit l'unicité
Types de clés primaires
| Type | Description | Exemple |
|---|---|---|
| Auto-incrémentée | Générée automatiquement (1, 2, 3…) | SERIAL en PostgreSQL |
| UUID | Identifiant universel unique | a0eebc99-9c0b-4ef8... |
| Naturelle | Donnée existante unique | Numéro de sécurité sociale |
| Composite | Plusieurs colonnes combinées | (pays, code_postal) |
💡 Recommandation : Utiliser
SERIAL(auto-increment) ouUUIDplutôt qu’une clé naturelle.
6. Clé Étrangère (Foreign Key)
La clé étrangère (FK) crée un lien entre deux tables.
Principe
Table : clients Table : commandes
┌─────────┬──────────┐ ┌─────────┬─────────────┬─────────┐
│ id (PK) │ nom │ │ id (PK) │ client_id(FK)│ produit │
├─────────┼──────────┤ ├─────────┼─────────────┼─────────┤
│ 1 │ Alice │◄───────────│ 1 │ 1 │ Clavier │
│ 2 │ Bob │◄───────────│ 2 │ 2 │ Souris │
│ 3 │ Charlie │ │ 3 │ 1 │ Écran │
└─────────┴──────────┘ └─────────┴─────────────┴─────────┘
↑
Clé étrangère : référence clients.id
Ce que garantit la FK
| Garantie | Description |
|---|---|
| Intégrité référentielle | Impossible de référencer un client inexistant |
| Cohérence | Si on supprime un client, que faire des commandes ? |
Actions en cascade
Que se passe-t-il si on supprime ou modifie la ligne référencée ?
| Action | Comportement |
|---|---|
CASCADE |
Supprime/modifie aussi les lignes liées |
SET NULL |
Met la FK à NULL |
SET DEFAULT |
Met une valeur par défaut |
RESTRICT |
Interdit la suppression/modification |
NO ACTION |
Comme RESTRICT (vérification différée) |
7. Types de Relations
1️⃣ Relation Un-à-Un (1:1)
Une ligne dans A correspond à exactement une ligne dans B.
utilisateurs profils
┌────┬─────────┐ ┌────┬─────────┬───────────┐
│ id │ email │ │ id │ user_id │ bio │
├────┼─────────┤ ├────┼─────────┼───────────┤
│ 1 │ a@m.com │◄────────│ 1 │ 1 │ Dev... │
│ 2 │ b@m.com │◄────────│ 2 │ 2 │ Designer..│
└────┴─────────┘ └────┴─────────┴───────────┘
Cas d’usage : Séparer des données rarement utilisées (optimisation).
1️⃣➡️🔢 Relation Un-à-Plusieurs (1:N)
Une ligne dans A peut correspondre à plusieurs lignes dans B.
clients commandes
┌────┬─────────┐ ┌────┬───────────┬─────────┐
│ id │ nom │ │ id │ client_id │ produit │
├────┼─────────┤ ├────┼───────────┼─────────┤
│ 1 │ Alice │◄────┬───│ 1 │ 1 │ Clavier │
│ 2 │ Bob │◄──┐ └───│ 2 │ 1 │ Souris │
└────┴─────────┘ └─────│ 3 │ 2 │ Écran │
└────┴───────────┴─────────┘
Cas d’usage : Client → Commandes, Auteur → Articles, Pays → Villes.
🔢↔︎️🔢 Relation Plusieurs-à-Plusieurs (N:N)
Plusieurs lignes dans A correspondent à plusieurs lignes dans B.
Nécessite une table de jonction !
etudiants inscriptions cours
┌────┬───────┐ ┌────────────┬──────────┐ ┌────┬─────────┐
│ id │ nom │ │ etudiant_id│ cours_id │ │ id │ nom │
├────┼───────┤ ├────────────┼──────────┤ ├────┼─────────┤
│ 1 │ Alice │◄───│ 1 │ 1 │───►│ 1 │ Maths │
│ 2 │ Bob │◄─┬─│ 1 │ 2 │─┬─►│ 2 │ Python │
└────┴───────┘ │ │ 2 │ 1 │ │ └────┴─────────┘
└─│ 2 │ 2 │─┘
└────────────┴──────────┘
Table de jonction
Cas d’usage : Étudiants ↔︎ Cours, Produits ↔︎ Tags, Acteurs ↔︎ Films.
8. Normalisation
La normalisation consiste à organiser les données pour :
- Éviter la redondance (données dupliquées)
- Éviter les anomalies (incohérences lors de modifications)
- Garantir l’intégrité des données
Exemple NON normalisé
Table : commandes (MAUVAIS)
┌────┬─────────┬───────────────┬─────────┬──────────────┐
│ id │ client │ client_email │ produit │ ville │
├────┼─────────┼───────────────┼─────────┼──────────────┤
│ 1 │ Alice │ alice@m.com │ Clavier │ Paris │
│ 2 │ Alice │ alice@m.com │ Souris │ Paris │ ← Redondance !
│ 3 │ Bob │ bob@m.com │ Écran │ Lyon │
└────┴─────────┴───────────────┴─────────┴──────────────┘
❌ Problèmes :
- Si Alice change d'email → modifier TOUTES les lignes
- Risque d'incohérence si on oublie une ligne
- Espace gaspillé
✅ Exemple normalisé
Table : clients Table : commandes
┌────┬─────────┬─────────────┐ ┌────┬───────────┬─────────┐
│ id │ nom │ email │ │ id │ client_id │ produit │
├────┼─────────┼─────────────┤ ├────┼───────────┼─────────┤
│ 1 │ Alice │ alice@m.com │ │ 1 │ 1 │ Clavier │
│ 2 │ Bob │ bob@m.com │ │ 2 │ 1 │ Souris │
└────┴─────────┴─────────────┘ │ 3 │ 2 │ Écran │
└────┴───────────┴─────────┘
✅ Avantages :
- Email modifié une seule fois
- Pas de redondance
- Données cohérentes
Formes normales (résumé)
| Forme | Règle principale |
|---|---|
| 1NF | Chaque cellule contient une seule valeur (pas de listes) |
| 2NF | 1NF + chaque colonne dépend de TOUTE la clé primaire |
| 3NF | 2NF + pas de dépendance entre colonnes non-clés |
💡 En pratique, la 3NF est généralement suffisante pour les bases OLTP.
9. Propriétés ACID
ACID garantit la fiabilité des transactions dans une base relationnelle.
Les 4 propriétés
┌─────────────────┐
│ TRANSACTION │
│ (ex: virement │
│ bancaire) │
└────────┬────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ ATOMICITÉ │ │ COHÉRENCE │ │ ISOLATION │
│ Tout ou │ │ État │ │Transactions│
│ rien │ │ valide │ │ séparées │
└───────────┘ └───────────┘ └───────────┘
│
▼
┌───────────┐
│ DURABILITÉ│
│ Permanent │
└───────────┘
Détail de chaque propriété
| Lettre | Propriété | Description | Exemple |
|---|---|---|---|
| A | Atomicité | Tout ou rien — si une partie échoue, tout est annulé | Virement : débit ET crédit réussissent ou rien |
| C | Cohérence | La base reste dans un état valide | Le solde ne peut pas être négatif |
| I | Isolation | Les transactions concurrentes ne s’interfèrent pas | Deux virements simultanés ne se mélangent pas |
| D | Durabilité | Une fois validée, la transaction est permanente | Même après un crash, le virement est enregistré |
Exemple : Virement bancaire
TRANSACTION : Virer 100€ de Alice vers Bob
1. Débiter 100€ du compte Alice
2. Créditer 100€ sur le compte Bob
ATOMICITÉ :
✅ Les deux opérations réussissent → COMMIT
❌ Une opération échoue → ROLLBACK (rien ne change)
COHÉRENCE :
✅ Alice : 500€ → 400€
✅ Bob : 200€ → 300€
✅ Total : 700€ → 700€ (inchangé)
ISOLATION :
Un autre virement simultané ne voit pas l'état intermédiaire
DURABILITÉ :
Même si le serveur crash juste après le COMMIT,
le virement sera toujours là au redémarrage
10. OLTP vs OLAP — Deux mondes différents
Les bases de données relationnelles peuvent servir à deux usages très différents. Comprendre cette distinction est fondamental en Data Engineering.
10.1 OLTP — Online Transaction Processing
Les bases OLTP gèrent les opérations quotidiennes d’une entreprise.
| Caractéristique | Description |
|---|---|
| But | Gérer les transactions courantes |
| Opérations | INSERT, UPDATE, DELETE fréquents |
| Requêtes | Simples, sur peu de lignes |
| Utilisateurs | Applications, employés |
| Volume par requête | Quelques lignes |
| Priorité | Rapidité, disponibilité |
| Schéma | Normalisé (3NF) |
Exemples : - Application e-commerce (commandes, paiements) - Système bancaire (virements, retraits) - Gestion de stock (entrées, sorties) - Réservation de billets
10.2 OLAP — Online Analytical Processing
Les bases OLAP sont conçues pour l’analyse de données et le reporting.
| Caractéristique | Description |
|---|---|
| But | Analyser les données historiques |
| Opérations | SELECT complexes (agrégations, jointures) |
| Requêtes | Complexes, sur des millions de lignes |
| Utilisateurs | Analystes, Data Scientists, dirigeants |
| Volume par requête | Des millions/milliards de lignes |
| Priorité | Performance analytique |
| Schéma | Dénormalisé (Star Schema, Snowflake) |
Exemples : - Rapport des ventes par région/mois - Analyse du comportement client - Tableaux de bord (dashboards) - Prévisions et tendances
10.3 Comparaison OLTP vs OLAP
OLTP OLAP
(Transactionnel) (Analytique)
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ INSERT │ │ SELECT │
│ UPDATE │ │ GROUP BY │
│ DELETE │ │ JOIN │
│ (CRUD) │ │ (Analyse)│
└─────┬─────┘ └─────┬─────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ Quelques │ │ Millions │
│ lignes │ │ de lignes │
└─────┬─────┘ └─────┬─────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ App │ │ Rapport │
│ Web │ │ Dashboard │
└───────────┘ └───────────┘
| Critère | OLTP | OLAP |
|---|---|---|
| Objectif | Opérations quotidiennes | Analyse, décision |
| Données | Actuelles | Historiques |
| Requêtes | Simples, fréquentes | Complexes, ponctuelles |
| Temps de réponse | Millisecondes | Secondes à minutes |
| Utilisateurs | Milliers (applications) | Dizaines (analystes) |
| Schéma | Normalisé | Dénormalisé |
| Exemples | PostgreSQL, MySQL | Snowflake, BigQuery, Redshift |
10.4 Data Warehouse — L’entrepôt de données
Un Data Warehouse (DWH) est une base de données OLAP centralisée qui stocke les données de toute l’entreprise pour l’analyse.
Définition
“Un Data Warehouse est une copie des données transactionnelles, structurée spécifiquement pour l’analyse et le reporting.” — Bill Inmon
Caractéristiques
| Caractéristique | Description |
|---|---|
| Orienté sujet | Organisé par domaine métier (ventes, clients, produits) |
| Intégré | Données de sources multiples, harmonisées |
| Historisé | Conserve l’historique (pas de suppression) |
| Non volatile | Données en lecture seule (pas de UPDATE) |
Exemples de Data Warehouses
| Produit | Type | Particularité |
|---|---|---|
| Snowflake | Cloud | Séparation stockage/calcul, très scalable |
| Amazon Redshift | Cloud AWS | Intégration AWS native |
| Google BigQuery | Cloud GCP | Serverless, pay-per-query |
| Azure Synapse | Cloud Azure | Intégration Microsoft |
| Teradata | On-premise | Historique, grandes entreprises |
10.5 Data Mart — Le magasin spécialisé
Un Data Mart est un sous-ensemble du Data Warehouse, focalisé sur un domaine métier spécifique.
Définition
“Un Data Mart est une vue spécialisée du Data Warehouse, optimisée pour les besoins d’un département ou d’une fonction métier.”
Exemples de Data Marts
| Data Mart | Données | Utilisateurs |
|---|---|---|
| Marketing | Campagnes, conversions, segments | Équipe Marketing |
| Finance | Revenus, coûts, budgets | Direction financière |
| RH | Employés, salaires, turnover | Ressources Humaines |
| Ventes | Commandes, clients, produits | Équipe commerciale |
10.6 Architecture globale
┌─────────────────────────────────────────────────────────────────────────┐
│ SOURCES DE DONNÉES │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ERP │ │ CRM │ │ E-comm │ │ Logs │ ... │
│ │ (OLTP) │ │ (OLTP) │ │ (OLTP) │ │ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼─────────────┼─────────────┼─────────────┼────────────────────-─┘
│ │ │ │
└─────────────┴──────┬──────┴─────────────┘
│
┌────────▼────────┐
│ ETL / ELT │
│ (Extraction, │
│ Transformation,│
│ Chargement) │
└────────┬────────┘
│
┌────────▼────────┐
│ DATA WAREHOUSE │
│ (OLAP) │
│ │
│ ┌─────────────┐ │
│ │ Données │ │
│ │ intégrées │ │
│ │ historisées│ │
│ └─────────────┘ │
└────────┬────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ DATA MART │ │ DATA MART │ │ DATA MART │
│ Ventes │ │ Marketing │ │ Finance │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Dashboard │ │ Rapports │ │ KPIs │
│ Power BI │ │ Campaigns │ │ Financiers │
└─────────────┘ └─────────────┘ └─────────────┘
💡 Résumé OLTP / OLAP / DWH / Data Mart
| Concept | Rôle | Analogie |
|---|---|---|
| OLTP | Opérations quotidiennes | La caisse enregistreuse |
| OLAP | Analyse des données | Le bureau de l’analyste |
| Data Warehouse | Entrepôt centralisé | Le grand entrepôt |
| Data Mart | Vue métier spécialisée | Le rayon d’un magasin |
11. Modélisation Dimensionnelle — Star & Snowflake Schema
La modélisation dimensionnelle est la technique utilisée pour structurer les données dans un Data Warehouse. Elle est optimisée pour l’analyse (OLAP), pas pour les transactions (OLTP).
💡 Cette approche a été popularisée par Ralph Kimball dans les années 1990.
11.1 Tables de Faits (Fact Tables)
Une table de faits contient les mesures (métriques) que l’on veut analyser.
┌─────────────────────────────────────────────────────────────────┐
│ TABLE DE FAITS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Contient : │
│ • Les MESURES (chiffres à analyser) │
│ • Les CLÉS ÉTRANGÈRES vers les dimensions │
│ │
│ Exemples de mesures : │
│ • Montant de la vente │
│ • Quantité vendue │
│ • Coût │
│ • Nombre de clics │
│ │
│ Caractéristiques : │
│ • Très grande (millions/milliards de lignes) │
│ • Une ligne = un ÉVÉNEMENT (une vente, un clic, etc.) │
│ • Granularité fine (niveau de détail) │
│ │
└─────────────────────────────────────────────────────────────────┘
Exemple : Table de faits fact_sales
fact_sales
┌────────────┬─────────────┬────────────────┬────────────────┬──────────┬──────────┐
│ sale_id(PK)│ date_id(FK) │ product_id(FK) │ customer_id(FK)│ quantity │ amount │
├────────────┼─────────────┼────────────────┼────────────────┼──────────┼──────────┤
│ 1 │ 20240115 │ 101 │ 501 │ 2 │ 199.98 │
│ 2 │ 20240115 │ 102 │ 502 │ 1 │ 49.99 │
│ 3 │ 20240116 │ 101 │ 501 │ 1 │ 99.99 │
│ ... │ ... │ ... │ ... │ ... │ ... │
└────────────┴─────────────┴────────────────┴────────────────┴──────────┴──────────┘
│ │ │
FK vers FK vers FK vers
dim_date dim_product dim_customer
11.2 Tables de Dimensions (Dimension Tables)
Une table de dimension contient le contexte descriptif des mesures.
┌─────────────────────────────────────────────────────────────────┐
│ TABLE DE DIMENSION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Contient : │
│ • Les ATTRIBUTS descriptifs (le "quoi", "qui", "où", "quand") │
│ • La clé primaire référencée par la table de faits │
│ │
│ Exemples de dimensions : │
│ • dim_date : année, mois, jour, trimestre, jour_semaine │
│ • dim_product : nom, catégorie, marque, prix_liste │
│ • dim_customer : nom, segment, ville, pays │
│ • dim_store : nom, région, type, surface │
│ │
│ Caractéristiques : │
│ • Relativement petite (milliers à millions de lignes) │
│ • Dénormalisée (toutes les infos dans une seule table) │
│ • Permet le "slicing & dicing" (filtres et regroupements) │
│ │
└─────────────────────────────────────────────────────────────────┘
Exemples de tables de dimensions :
dim_date dim_product
┌──────────┬──────┬─────┬─────┬──────┐ ┌────────────┬──────────┬───────────┬─────────┐
│ date_id │ year │month│ day │quarter│ │ product_id │ name │ category │ brand │
├──────────┼──────┼─────┼─────┼──────┤ ├────────────┼──────────┼───────────┼─────────┤
│ 20240115 │ 2024 │ 1 │ 15 │ Q1 │ │ 101 │ iPhone 15│ Smartphone│ Apple │
│ 20240116 │ 2024 │ 1 │ 16 │ Q1 │ │ 102 │Galaxy S24│ Smartphone│ Samsung │
└──────────┴──────┴─────┴─────┴──────┘ └────────────┴──────────┴───────────┴─────────┘
dim_customer
┌─────────────┬──────────┬──────────┬─────────┬─────────┐
│ customer_id │ name │ segment │ city │ country │
├─────────────┼──────────┼──────────┼─────────┼─────────┤
│ 501 │ Alice │ Premium │ Paris │ France │
│ 502 │ Bob │ Standard │ Lyon │ France │
└─────────────┴──────────┴──────────┴─────────┴─────────┘
11.3 Star Schema (Schéma en étoile)
Le Star Schema est le modèle dimensionnel le plus simple et le plus utilisé.
┌─────────────────┐
│ dim_date │
│─────────────────│
│ date_id (PK) │
│ year │
│ month │
│ quarter │
└────────┬────────┘
│
┌─────────────────┐ ┌────────▼────────┐ ┌─────────────────┐
│ dim_customer │ │ fact_sales │ │ dim_product │
│─────────────────│ │─────────────────│ │─────────────────│
│ customer_id(PK) │◄────────│ sale_id (PK) │────────►│ product_id (PK) │
│ name │ │ date_id (FK) │ │ name │
│ segment │ │ product_id (FK) │ │ category │
│ city │ │ customer_id(FK) │ │ brand │
│ country │ │ store_id (FK) │ │ price │
└─────────────────┘ │ quantity │ └─────────────────┘
│ amount │
└────────┬────────┘
│
┌────────▼────────┐
│ dim_store │
│─────────────────│
│ store_id (PK) │
│ name │
│ region │
│ type │
└─────────────────┘
Pourquoi “étoile” ? La table de faits est au centre, entourée des dimensions — comme une étoile !
| ✅ Avantages | ❌ Inconvénients |
|---|---|
| Simple à comprendre | Redondance dans les dimensions |
| Requêtes rapides (peu de jointures) | Dimensions peuvent être grandes |
| Facile à maintenir | Pas adapté aux hiérarchies très complexes |
11.4 Snowflake Schema (Schéma en flocon)
Le Snowflake Schema est une variante où les dimensions sont normalisées (découpées en sous-tables).
┌───────────────┐ ┌─────────────────┐
│ dim_year │ │ dim_month │
│───────────────│ │─────────────────│
│ year_id (PK) │◄────│ month_id (PK) │
│ year │ │ year_id (FK) │
└───────────────┘ │ month │
│ quarter │
└────────┬────────┘
│
┌────────▼────────┐ ┌─────────────────┐
│ dim_date │ │ dim_category │
│─────────────────│ │─────────────────│
│ date_id (PK) │ │ category_id(PK) │
│ month_id (FK) │ │ category_name │
│ day │ └────────┬────────┘
└────────┬────────┘ │
│ │
┌────────▼────────┐ ┌────────▼────────┐
│ fact_sales │ │ dim_product │
│─────────────────│ │─────────────────│
│ date_id (FK) │────────►│ product_id (PK) │
│ product_id (FK) │ │ category_id(FK) │
│ quantity │ │ name │
│ amount │ │ brand │
└─────────────────┘ └─────────────────┘
Pourquoi “flocon” ? Les branches se subdivisent comme un flocon de neige.
| ✅ Avantages | ❌ Inconvénients |
|---|---|
| Moins de redondance | Plus de jointures (plus lent) |
| Économie d’espace | Plus complexe à comprendre |
| Meilleur pour hiérarchies | Maintenance plus difficile |
11.5 Star vs Snowflake — Quand utiliser quoi ?
| Critère | Star Schema ⭐ | Snowflake Schema ❄️ |
|---|---|---|
| Performance | ⚡ Plus rapide | 🐢 Plus de jointures |
| Simplicité | ✅ Simple | ⚠️ Complexe |
| Redondance | ⚠️ Plus de duplication | ✅ Moins de duplication |
| Cas d’usage | Reporting, dashboards | Hiérarchies complexes |
💡 En pratique : Le Star Schema est recommandé dans 90% des cas. Utilise Snowflake uniquement si tu as des contraintes spécifiques de stockage ou des hiérarchies très profondes.
11.6 Exemple de requête analytique
Avec un Star Schema, les requêtes analytiques sont simples et intuitives :
-- Ventes par catégorie de produit et par trimestre
SELECT
d.year,
d.quarter,
p.category,
SUM(f.amount) as total_sales,
COUNT(*) as num_transactions
FROM fact_sales f
JOIN dim_date d ON f.date_id = d.date_id
JOIN dim_product p ON f.product_id = p.product_id
WHERE d.year = 2024
GROUP BY d.year, d.quarter, p.category
ORDER BY d.quarter, total_sales DESC;| year | quarter | category | total_sales | num_transactions |
|---|---|---|---|---|
| 2024 | Q1 | Smartphone | 1,250,000 | 8,500 |
| 2024 | Q1 | Laptop | 980,000 | 3,200 |
| 2024 | Q1 | Accessoires | 450,000 | 15,000 |
🔮 Preview : Dans le module 08, tu découvriras les concepts de Data Lake, Data Lakehouse, Medallion Architecture (Bronze/Silver/Gold) et les architectures Lambda/Kappa pour le Big Data !
12. Exemple complet : Schéma d’une boutique en ligne (OLTP)
Voici un exemple de schéma OLTP normalisé pour les opérations quotidiennes :
┌─────────────────────────────────────────────────────────────────────────┐
│ BASE DE DONNÉES : ma_boutique │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌───────────────┐ │
│ │ CLIENTS │ │ COMMANDES │ │ PRODUITS │ │
│ ├─────────────────┤ ├─────────────────┤ ├───────────────┤ │
│ │ 🔑 id (PK) │ │ 🔑 id (PK) │ │ 🔑 id (PK) │ │
│ │ nom │◄──────│ 🔗 client_id(FK)│ │ nom │ │
│ │ email │ │ date │ │ prix │ │
│ │ telephone │ │ statut │ │ stock │ │
│ │ created_at │ │ total │ │ categorie │ │
│ └─────────────────┘ └────────┬────────┘ └───────┬───────┘ │
│ │ │ │
│ │ ┌───────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────┐ │
│ │ LIGNES_COMMANDE │ │
│ ├─────────────────────┤ │
│ │ 🔑 id (PK) │ │
│ │ 🔗 commande_id (FK) │ │
│ │ 🔗 produit_id (FK) │ │
│ │ quantite │ │
│ │ prix_unitaire │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
RELATIONS :
• clients (1) ───► (N) commandes : Un client a plusieurs commandes
• commandes (1) ───► (N) lignes_commande : Une commande a plusieurs lignes
• produits (1) ───► (N) lignes_commande : Un produit dans plusieurs lignes
Ce schéma est normalisé (3NF) car c’est un système OLTP pour les opérations quotidiennes.
Résumé
Vocabulaire relationnel
| Terme | Description |
|---|---|
| Table | Collection de données structurées |
| Colonne | Attribut (nom, email, prix…) |
| Ligne | Un enregistrement (un client, une commande…) |
| Clé Primaire (PK) | Identifiant unique d’une ligne |
| Clé Étrangère (FK) | Référence vers une autre table |
| SGBD | Logiciel de gestion (PostgreSQL, MySQL…) |
Relations
| Type | Notation | Exemple |
|---|---|---|
| Un-à-Un | 1:1 | Utilisateur ↔︎ Profil |
| Un-à-Plusieurs | 1:N | Client → Commandes |
| Plusieurs-à-Plusieurs | N:N | Étudiants ↔︎ Cours |
ACID
| Lettre | Propriété |
|---|---|
| A | Atomicité — Tout ou rien |
| C | Cohérence — État valide |
| I | Isolation — Transactions séparées |
| D | Durabilité — Permanent |
OLTP vs OLAP
| Concept | OLTP | OLAP |
|---|---|---|
| Usage | Transactions | Analyse |
| Requêtes | Simples, rapides | Complexes, agrégées |
| Schéma | Normalisé | Dénormalisé |
Data Warehouse & Data Mart
| Concept | Description |
|---|---|
| Data Warehouse | Entrepôt centralisé pour l’analyse |
| Data Mart | Sous-ensemble orienté métier |
Modélisation dimensionnelle
| Concept | Description |
|---|---|
| Table de faits | Mesures numériques (ventes, quantités) |
| Table de dimension | Contexte descriptif (date, produit, client) |
| Star Schema | Faits au centre, dimensions autour |
| Snowflake Schema | Star avec dimensions normalisées |
Quiz
❓ Q1. Qu’est-ce qu’une clé primaire ?
- Une clé de chiffrement
- Un identifiant unique pour chaque ligne
- Le nom de la première colonne
- Un mot de passe
💡 Réponse
✅ b — La clé primaire identifie de façon unique chaque ligne d’une table.❓ Q2. À quoi sert une clé étrangère ?
- À chiffrer les données
- À créer un lien entre deux tables
- À indexer les colonnes
- À supprimer des lignes
💡 Réponse
✅ b — La clé étrangère référence la clé primaire d’une autre table pour créer une relation.❓ Q3. Quelle relation nécessite une table de jonction ?
- Un-à-Un (1:1)
- Un-à-Plusieurs (1:N)
- Plusieurs-à-Plusieurs (N:N)
- Aucune
💡 Réponse
✅ c — Les relations N:N nécessitent une table intermédiaire (jonction) pour stocker les associations.❓ Q4. Que signifie le A de ACID ?
- Authentification
- Atomicité
- Automatisation
- Archivage
💡 Réponse
✅ b — Atomicité : une transaction est indivisible (tout réussit ou tout échoue).❓ Q5. Pourquoi normaliser une base de données ?
- Pour la rendre plus rapide
- Pour éviter la redondance et les incohérences
- Pour ajouter du chiffrement
- Pour compresser les données
💡 Réponse
✅ b — La normalisation évite les données dupliquées et garantit la cohérence.❓ Q6. Quel SGBD est open source ET très complet ?
- Oracle
- SQL Server
- PostgreSQL
- Access
💡 Réponse
✅ c — PostgreSQL est open source, gratuit et très complet (le plus recommandé).❓ Q7. Quel type utiliser pour stocker des montants en euros ?
- FLOAT
- INTEGER
- DECIMAL
- VARCHAR
💡 Réponse
✅ c — DECIMAL garantit une précision exacte pour les montants financiers (FLOAT est imprécis).❓ Q8. Quelle est la différence principale entre OLTP et OLAP ?
- OLTP est plus récent
- OLTP gère les transactions, OLAP l’analyse
- OLAP est plus rapide
- Aucune différence
💡 Réponse
✅ b — OLTP (Online Transaction Processing) gère les opérations quotidiennes, OLAP (Online Analytical Processing) est optimisé pour l’analyse et le reporting.❓ Q9. Qu’est-ce qu’un Data Warehouse ?
- Un serveur très puissant
- Un entrepôt centralisé pour l’analyse des données
- Un type de base de données NoSQL
- Un logiciel de visualisation
💡 Réponse
✅ b — Un Data Warehouse est une base de données OLAP centralisée qui stocke les données de l’entreprise pour l’analyse et le reporting.❓ Q10. Qu’est-ce qu’un Data Mart ?
- Un magasin de données brutes
- Un sous-ensemble du Data Warehouse orienté métier
- Une base de données transactionnelle
- Un outil ETL
💡 Réponse
✅ b — Un Data Mart est une vue spécialisée du Data Warehouse, focalisée sur un domaine métier (Marketing, Finance, Ventes…).❓ Q11. Dans un Star Schema, que contient la table de faits ?
- Les descriptions des produits
- Les mesures (métriques) à analyser
- Les informations clients
- Les dates uniquement
💡 Réponse
✅ b — La table de faits contient les mesures numériques (montants, quantités, clics…) et les clés étrangères vers les dimensions.❓ Q12. Quelle est la différence entre Star Schema et Snowflake Schema ?
- Star Schema est plus récent
- Dans Snowflake, les dimensions sont normalisées (découpées)
- Snowflake n’a pas de table de faits
- Ils sont identiques
💡 Réponse
✅ b — Dans un Snowflake Schema, les tables de dimensions sont normalisées (découpées en sous-tables), ce qui ressemble à un flocon de neige.❓ Q13. Une table de dimension contient…
- Les chiffres à analyser
- Le contexte descriptif (qui, quoi, où, quand)
- Les clés étrangères uniquement
- Les données en temps réel
💡 Réponse
✅ b — Une table de dimension contient les attributs descriptifs qui donnent du contexte aux mesures (produit, client, date, magasin…).📚 Ressources
Bases de données relationnelles
- PostgreSQL Documentation
- SQLBolt — Tutoriel interactif
- DB Diagram — Créer des schémas visuels
- Database Normalization (Wikipedia)
OLTP, OLAP et Data Warehousing
Modélisation dimensionnelle
- Star Schema vs Snowflake Schema (Databricks)
- The Data Warehouse Toolkit — Ralph Kimball
- Dimensional Modeling (Kimball Group)
➡️ Prochaine étape
Tu connais maintenant la théorie des bases de données relationnelles, OLTP/OLAP, Data Warehouse, et la modélisation dimensionnelle. Passons à la pratique !
👉 Module suivant : 07_sql_for_data_engineers — Écrire des requêtes SQL
🎉 Félicitations ! Tu maîtrises les concepts fondamentaux des bases relationnelles et de l’architecture Data.