Database & Architecture
Thème :
Junior
2 vues ·7/12 leçonsNormalisation & Conception de Schéma
Une bonne conception de base de données prévient les anomalies de données et améliore les performances.
Les Formes Normales
Première Forme Normale (1FN)
- Valeurs atomiques (pas de tableaux/listes dans les colonnes)
- Chaque ligne est unique
-- MAUVAIS : Viole la 1FN
CREATE TABLE orders (
id INT,
products VARCHAR(255) -- 'Widget, Gadget, Truc'
);
-- BON : Conforme à la 1FN
CREATE TABLE orders (id INT PRIMARY KEY);
CREATE TABLE order_items (
order_id INT,
product_id INT
);
Deuxième Forme Normale (2FN)
- En 1FN
- Pas de dépendances partielles (toutes les colonnes non-clé dépendent de toute la clé primaire)
-- MAUVAIS : product_name ne dépend que de product_id
CREATE TABLE order_items (
order_id INT,
product_id INT,
product_name VARCHAR(255), -- Dépendance partielle !
quantity INT,
PRIMARY KEY (order_id, product_id)
);
-- BON : Table séparée pour les produits
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
Troisième Forme Normale (3FN)
- En 2FN
- Pas de dépendances transitives
-- MAUVAIS : city dépend de zip_code, pas directement de l'utilisateur
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
zip_code VARCHAR(10),
city VARCHAR(255) -- Dépendance transitive !
);
-- BON : Séparer les localisations
CREATE TABLE locations (
zip_code VARCHAR(10) PRIMARY KEY,
city VARCHAR(255)
);
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
zip_code VARCHAR(10) REFERENCES locations(zip_code)
);
Dénormalisation pour les Performances
-- Parfois la dénormalisation est acceptable
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
user_name VARCHAR(255), -- Dénormalisé pour l'affichage
total_amount DECIMAL(10,2), -- Calcul mis en cache
item_count INT -- Comptage mis en cache
);
Stratégies d’Indexation
-- Clé primaire (index automatique)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT
);
-- Index de clé étrangère
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Index composite pour les requêtes courantes
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
-- Contrainte unique avec index
CREATE UNIQUE INDEX idx_users_email ON users(email);
-- Recherche plein texte
CREATE FULLTEXT INDEX idx_products_search ON products(name, description);
Les Grimoires
📘 Cette leçon fait partie du cours PHP & Bases de Données Relationnelles sur la plateforme d’apprentissage RostoDev.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Normalisation & Conception de Schéma. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.