Les Lois de la Physique
des Données

La normalisation n'est pas une suggestion bureaucratique.

C'est la loi de la gravité qui empêche votre architecture de s'effondrer.

Avant le combat : votre arène

Tous les défis tournent sur un vrai jeu de données PostgreSQL : 50 clients, 200 000 achats, des fantômes et de la pollution.

Installation (une seule fois)
createdb -h localhost -U postgres sqlfun
psql -h localhost -U postgres -d sqlfun -f jeu-de-donnees-sql-fun.sql

Ou dans pgAdmin 4 : créer la base sqlfun, ouvrir le fichier dans l'outil de requête, puis Exécuter (F5).

📥 Télécharger jeu-de-donnees-sql-fun.sql

Activité 1 : Le Monstre d'Excel

Un collègue a importé ce fichier Excel dans votre base de données relationnelle :

Commande_IDClientProduits_Achetés
101AliceClavier, Souris, Écran

Le cauchemar : Trouvez tous les clients qui ont acheté une "Souris".

Mission de déconstruction

Au tableau : Atomisez ces données pour que chaque cellule ne contienne qu'une seule valeur. Combien de tables obtenez-vous ?

Solution 1 : Le Monstre d'Excel

Une cellule, une valeur. Chaque produit acheté devient sa propre ligne :

Solution
commandecommande_produit
101, Alice101, Clavier
101, Souris
101, Écran

Réponse : 2 tables, 3 avec un catalogue produit. La Souris se trouve avec un simple WHERE produit = 'Souris'.

⚖️ La loi que vous venez d'appliquer : la première forme normale (1NF), une cellule, une valeur, jamais de liste.

💀 Mode hardcore : atomisez la table commande_brute de l'arène sans rien retaper, avec string_to_array() et unnest().

Activité 1 bis : La Clé à Deux Têtes

La table `LIGNE_COMMANDE` a une clé composée : (Commande_ID, Produit_ID).

Mission de dissection
Commande_IDProduit_IDQuantitéNom_ProduitPrix
101A11RAM 16GB89.99
102A14RAM 16GB89.99

Quelles colonnes ne dépendent que d'une moitié de la clé ? Découpez la table pour que chaque colonne dépende de toute la clé.

Solution 1 bis : La Clé à Deux Têtes

Nom_Produit et Prix ne dépendent que de Produit_ID : c'est une dépendance partielle. ⚖️ La loi qui l'interdit : la deuxième forme normale (2NF).

Solution
produitligne_commande
produit_id (clé), nom, prixcommande_id, produit_id (clé étrangère), quantité

La 2NF ne concerne que les clés composées : une table en 1NF à clé simple est automatiquement en 2NF.

💀 Mode hardcore : dans l'arène, comptez combien de fois chaque nom de produit est répété dans ligne_commande_brute.

Activité 2 : L'Anomalie de Mise à Jour

Une table `PRODUITS` contient 10 millions de lignes. Le numéro de téléphone de votre fournisseur "TechCorp" vient de changer.

Produit_IDNomFournisseurTel_Fournisseur
A1RAM 16GBTechCorp555-0101
A2SSD 1TBTechCorp555-0101

Diagnostic d'urgence

1. Que se passe-t-il techniquement lors de cette modification sur 10 millions de lignes ?

2. Quelle est la structure mathématique (clés étrangères) pour corriger cette dépendance toxique ?

Solution 2 : L'Anomalie de Mise à Jour

1. L'UPDATE réécrit 10 millions de lignes pour une seule information. Si une ligne échappe au WHERE, TechCorp a deux téléphones : la base se contredit.

2. Le téléphone dépend du fournisseur, pas du produit (dépendance transitive). On le sort :

Solution
CREATE TABLE fournisseur (
  id SERIAL PRIMARY KEY, nom VARCHAR(40), telephone VARCHAR(20));
CREATE TABLE produit (
  id VARCHAR(10) PRIMARY KEY, nom VARCHAR(40),
  fournisseur_id INTEGER REFERENCES fournisseur (id));

Le numéro change en une seule ligne. ⚖️ La loi : la troisième forme normale (3NF), rien ne dépend d'autre chose que la clé.

Activité 2 bis : Les Deux Autres Catastrophes

La même table `PRODUITS` cache deux autres anomalies.

Diagnostic d'urgence

1. Insertion : un nouveau fournisseur, NanoChip, n'a encore aucun produit. Où inscrire son téléphone ?

2. Suppression : on retire du catalogue le seul produit de VisionPlus. Que perd-on au passage ?

Solution 2 bis : Les Deux Autres Catastrophes

1. Anomalie d'insertion : impossible sans inventer un faux produit, puisque Produit_ID est obligatoire.

2. Anomalie de suppression : le téléphone de VisionPlus disparaît avec son dernier produit.

La leçon

La table fournisseur de la solution 2 règle les trois anomalies d'un coup : un fait, une seule place.

Comprendre la Cage

Pourquoi vous imposer cette rigidité mathématique absolue ?

Parce qu'il est impossible de maîtriser la liberté sauvage et déstructurée du NoSQL ou des documents JSON si l'on ne comprend pas d'abord ce que l'on déconstruit.

Il faut comprendre les règles de l'Univers avant de jouer avec le chaos.

Épilogue : Briser la Loi exprès

Les experts violent la normalisation, mais seulement quand ils savent exactement ce qu'ils cassent. Ça s'appelle la dénormalisation.

Quand on la brise volontairement

⚡ Lecture rapide : recopier le nom du client dans la facture pour éviter une jointure sur un écran consulté des millions de fois.

📦 Cache : une vue matérialisée garde des totaux déjà calculés.

🍃 NoSQL : un document MongoDB contient ses commandes imbriquées, exprès.

Le prix : garder les copies synchronisées. Qui brise la loi en paie la dette.

Flèches gauche/droite pour naviguer