Pour un profil senior, écrire une requête ne suffit pas : il faut savoir modéliser et optimiser. Ce cas en deux parties, à donner en entretien (30-40 min), révèle la capacité d'arbitrage d'un candidat expérimenté. Corrigé et grille inclus.
On n'attend pas une réponse unique mais un raisonnement : quels compromis, pourquoi, à quel coût. Un senior justifie ses choix ; un junior déguisé applique des recettes sans les relier au contexte.
Donnez cette table au candidat.
On part d'une seule grande table où tout est répété (le nom du client, son pays, le nom du produit reviennent à chaque ligne de commande). C'est le point de départ classique d'un cas de modélisation.
-- Table de depart (tout dans une seule table)
ventes_brutes(
commande_id, date_commande, statut,
client_nom, client_pays, client_email,
produit_nom, produit_categorie, produit_prix,
quantite, montant
)Proposez un schéma normalisé (ou en étoile) et justifiez vos choix.
On demande au candidat de découper cette table en un modèle propre et d'expliquer les compromis. Un bon senior propose un schéma en étoile (une table de faits, des dimensions) et sait dire pourquoi.
-- Corrige : schema en etoile (orientation analytique)
dim_clients(id, nom, email, pays)
dim_produits(id, nom, categorie, prix)
fait_commandes(
id, date_commande, statut,
client_id -> dim_clients(id),
produit_id -> dim_produits(id),
quantite, montant
)
-- La table de faits ne garde que des cles + mesures ;
-- les libelles vivent dans les dimensions (une seule source de verite).Signal d'alerte : ce qu'on évalue : pas le schéma « parfait », mais la capacité à arbitrer (normaliser pour la cohérence vs dénormaliser pour la vitesse de lecture) et à relier ce choix à l'usage réel.
Cette requête d'agrégation est lente sur des millions de lignes. Comment l'améliorer ?
On soumet une requête réaliste mais mal écrite. Un senior identifie les anti-patterns et propose des pistes concrètes (index, éviter les fonctions sur colonnes filtrées, pré-agrégation).
-- Requete lente (anti-pattern)
SELECT client_id, SUM(montant)
FROM fait_commandes
WHERE YEAR(date_commande) = 2024 -- fonction sur colonne = pas d'index
GROUP BY client_id;
-- Corrige : filtre par plage (l'index sur date_commande est utilisable)
SELECT client_id, SUM(montant)
FROM fait_commandes
WHERE date_commande >= '2024-01-01'
AND date_commande < '2025-01-01'
GROUP BY client_id;
-- + index sur (date_commande, client_id) ; envisager une table pre-agregee
-- si cette requete tourne souvent.Signal d'alerte : le vrai marqueur senior : commencer par « je regarde le plan d'exécution », pas appliquer des optimisations au hasard. La démarche compte autant que la solution.
| Niveau | Maîtrise attendue | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Sait écrire des requêtes | Découpe la table en dimensions/faits | Ne voit pas le problème de la table unique |
| Confirmé | Modélise correctement | Justifie normalisation vs étoile | Modélise sans expliquer les compromis |
| Senior | Optimise avec méthode | Lit le plan, repère les anti-patterns | Optimise au hasard sans diagnostic |
| Lead | Arbitre selon le contexte | Relie chaque choix au coût et à l'usage | Applique des recettes hors contexte |
Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.