Gérer des données de l'information
« Gérer des données de l'information » porte sur la conception et l'interrogation de bases de données : modèle conceptuel, normalisation, SQL, transactions et stockage. L'épreuve teste la rigueur du schéma autant que la justesse des requêtes.
Règles et concepts clés
- Du MCD au MLD : entités → tables, association many-to-many → table de jonction, clé primaire (unique, non NULL), clé étrangère (intégrité référentielle).
- Normalisation : 1FN = valeurs atomiques, pas de liste dans une colonne ; 2FN = pas de dépendance à une partie seulement d'une clé composite ; 3FN = pas de dépendance transitive entre attributs non clés. On dénormalise parfois volontairement pour la lecture (table de reporting).
- SQL :
WHEREfiltre les lignes avant agrégation,HAVINGfiltre les groupes après ;COUNT(*)compte les lignes,COUNT(col)ignore les NULL ; les agrégats ignorent NULL ;NULL = NULLvaut UNKNOWN, d'oùIS NULL. UnNOT INsur une sous-requête contenant NULL ne renvoie aucune ligne. - Transactions : ACID ; niveaux d'isolation et anomalies associées (lecture sale, lecture non répétable, lignes fantômes).
- Index, vues, plans d'exécution : un
EXPLAINaffichant unSeq Scansur une grande table signale un index manquant. - NoSQL : document (MongoDB), clé-valeur (Redis), colonne large, graphe ; on choisit selon le motif d'accès, pas par mode.
- RGPD : minimisation, finalité, durée de conservation, droit d'accès et d'effacement.
Exemple travaillé
Tables client(id, ville) et commande(id, client_id, date_cmd, montant). Question : clients de Lyon ayant passé plus de 3 commandes en 2025.
SELECT c.id, c.ville, COUNT(*) AS nb
FROM client c
JOIN commande o ON o.client_id = c.id
WHERE c.ville = 'Lyon'
AND o.date_cmd >= '2025-01-01'
AND o.date_cmd < '2026-01-01'
GROUP BY c.id, c.ville
HAVING COUNT(*) > 3;
Le filtre sur l'année va dans WHERE (il porte sur des lignes), le seuil de commandes dans HAVING (il porte sur un groupe). GROUP BY doit contenir toutes les colonnes non agrégées du SELECT. La borne stricte < '2026-01-01' évite de rater le 31 décembre à 23 h.
Pièges qui coûtent des points
- Écrire
WHERE COUNT(*) > 3: un agrégat ne se filtre pas dansWHERE. - Transformer un
LEFT JOINenINNER JOINen filtrant la table de droite dans leWHERE. - Croire que la 3FN est toujours optimale, même en lecture intensive.
- Comparer des dates stockées en texte ou ignorer les fuseaux horaires.