2.1Relations & modèle de données
L'essentiel en 30 secondes
- Les relations relient deux tables sur une colonne commune (Produits[Code] ↔ Ventes[CodeProduit]) : le modèle propage les filtres, sans aucune formule.
- Cardinalité normale : un-à-plusieurs (1 → *), du référentiel (côté « 1 ») vers les faits (côté « * ») ; le sens de filtrage unique est la norme saine.
- Diagnostic n°1 : des totaux identiques sur toutes les lignes d'un visuel = relation manquante ou cassée — on vérifie toujours les relations auto-détectées.
Mini-cas filé — Zineb relie ses ventes au référentiel produits
Zineb, contrôleuse de gestion dans une PME agroalimentaire à Alger, doit croiser ses ventes par catégorie de produit, mais ses tables Ventes et Produits vivent chacune de leur côté. Elle applique la leçon : dans la vue Modèle, elle glisse Ventes[CodeProduit] sur Produits[Code] — le trait apparaît —, lit la cardinalité 1:* et le sens de filtrage unique, puis prouve par un histogramme Catégorie × Montant que les deux tables dialoguent. Pour voir le symptôme, elle supprime la relation : tous les totaux deviennent identiques sur chaque catégorie. Elle la recrée aussitôt et retient le diagnostic n°1 pour toujours.
Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 2.1.
1. Relier les tables
Niveau décisif : le modèle. Vos données réelles arrivent en plusieurs tables (ventes, produits, clients) que Power BI relie par des relations : un trait entre deux tables sur une colonne commune. Une fois la relation posée, un visuel croise « Désignation produit » et « Montant des ventes » sans aucune formule — le modèle propage les filtres. Zineb remplace ainsi ses anciens RECHERCHEV : le filtre circule tout seul d'une table à l'autre.
2. Cardinalité & sens
On lit la cardinalité (un-à-plusieurs dans l'immense majorité des cas : UN produit ↔ PLUSIEURS ventes) et le sens de filtrage (du côté « 1 » vers le côté « * »). Le sens unique est la norme saine ; le bidirectionnel crée ambiguïtés et lenteurs. Les relations auto-détectées à l'import doivent toujours être vérifiées dans la vue Modèle. Zineb double-clique le trait pour lire 1:* et « unique » avant de conclure.
3. Le diagnostic n°1
Le symptôme classique d'une relation manquante ou cassée : des totaux identiques sur toutes les lignes d'un visuel — chaque catégorie affiche le même total. On le reconnaît à vie. Autre cause d'échec d'une relation 1:*, côté « 1 » : des doublons ou des vides dans la colonne clé, car une dimension a une seule ligne par élément. Zineb corrige alors dans Power Query (Supprimer les doublons, filtrer les nuls).
🔎 Exemple concret — 🔎 Exemple concret — Ventes ↔ Produits
Zineb croise catégorie et montant, deux tables reliées :
Relation : Ventes[CodeProduit] → Produits[Code] (1:*)
→ visuel Catégorie (de Produits) × Montant (de Ventes)
les deux tables dialoguent, sans aucune formule.
Supprimer la relation → mêmes totaux partout (le symptôme).
Lecture : la cardinalité 1:* est portée par la clé unique côté dimension (Produits[Code]).
Leçon : supprimer la relation fait apparaître des totaux identiques — le réflexe de diagnostic à reconnaître.
Vocabulaire de la section
- Relation
- Le lien entre deux tables sur une colonne commune (Produits[Code] ↔ Ventes[CodeProduit]) : le canal par lequel les filtres circulent.
Exemple simple : Zineb relie Ventes et Produits pour croiser catégorie et montant.
Ce que ce n'est pas : deux tables posées côte à côte, sans trait entre elles.
Réflexe : deux tables à croiser → une relation sur la colonne clé.
- Cardinalité un-à-plusieurs (1:*)
- Le cas standard : UN produit du référentiel ↔ PLUSIEURS lignes de ventes.
Exemple simple : Zineb lit 1:* sur le trait entre Produits et Ventes.
Ce que ce n'est pas : un-à-un ou plusieurs-à-plusieurs, réservés à d'autres cas.
Réflexe : 1:* du côté « 1 » (dimension) vers le côté « * » (faits).
- Sens de filtrage
- Par défaut, le filtre va du côté « 1 » vers le côté « * » : filtrer un produit filtre ses ventes.
Exemple simple : Zineb garde le sens unique, sans ambiguïté.
Ce que ce n'est pas : le mode bidirectionnel, source de lenteurs et de bugs.
Réflexe : sens unique par défaut ; bidirectionnel = cas très particulier.
- Détection automatique
- Power BI devine certaines relations à l'import : à vérifier systématiquement.
Exemple simple : Zineb contrôle chaque relation auto-détectée dans la vue Modèle.
Ce que ce n'est pas : une relation supposée bonne sans vérification.
Réflexe : relation auto-détectée → toujours vérifier cardinalité et sens.
- Colonne clé
- La colonne commune qui porte la relation : unique côté dimension, répétée côté faits.
Exemple simple : Zineb s'assure que Produits[Code] est unique.
Ce que ce n'est pas : une clé avec doublons ou vides qui bloque le 1:*.
Réflexe : clé unique côté « 1 » : nettoyer dans Power Query si besoin.
En pratique — En pratique — Relier ventes et référentiel produits
- Importez une seconde table « Produits » (Code, Désignation, Catégorie, PrixUnitaire) — créez-la dans Excel si besoin, comme Zineb.
- Vue Modèle : si Power BI n'a pas créé la relation, glissez Ventes[CodeProduit] sur Produits[Code] — le trait apparaît.
- Double-cliquez le trait : lisez cardinalité (1:*) et sens de filtrage (unique) — la configuration saine par défaut.
- Preuve par le visuel : créez un histogramme Catégorie × Montant. Supprimez la relation pour VOIR le symptôme (mêmes totaux partout), puis recréez-la.
Script pas-à-pas — relier comme Zineb (5 min)
1) Importez la table Produits à côté de Ventes. 2) Dans la vue Modèle, glissez Ventes[CodeProduit] sur Produits[Code] : le trait apparaît. 3) Double-cliquez le trait et lisez la cardinalité (1:*) et le sens (unique). 4) Créez un histogramme Catégorie × Montant et vérifiez que les deux tables dialoguent. 5) Supprimez la relation, observez les totaux identiques partout, puis recréez-la — le diagnostic n°1 est ancré.
Si la relation refuse le 1:*, cherchez des doublons ou des vides dans la clé côté dimension et nettoyez dans Power Query.
Modèle copier-coller — ma check-list de relation
Relation : Ventes[CodeProduit] → Produits[Code] (1:*)
[ ] Colonne clé unique côté dimension (pas de doublon, pas de vide)
[ ] Cardinalité lue : 1:*
[ ] Sens de filtrage : unique (1 → *)
[ ] Relation auto-détectée vérifiée dans la vue Modèle
Diagnostic : totaux identiques partout → relation manquante ou cassée.
Croiser catégorie et montant
Zineb relie Ventes et Produits : le visuel Catégorie × Montant fonctionne sans formule.
Remplacer un RECHERCHEV
Zineb n'écrit plus de recherche : la relation propage le libellé produit depuis la dimension.
Diagnostiquer un total figé
Tous les totaux identiques par catégorie ? Zineb vérifie aussitôt la relation dans la vue Modèle.
Nettoyer une clé
Une clé à doublons bloque le 1:* : Zineb supprime les doublons côté dimension dans Power Query.
✓ Bonnes pratiques
- Relier les tables par la colonne clé (unique côté dimension).
- Garder le sens de filtrage unique (1 → *) : réflexe par défaut.
- Vérifier toute relation auto-détectée dans la vue Modèle.
✗ Pièges fréquents
- Laisser une relation auto-détectée fausse sans vérifier.
- Passer en bidirectionnel « pour que ça marche » (ambiguïtés, lenteurs).
- Une clé côté dimension avec doublons ou vides (bloque le 1:*).
Points clés à retenir
- Les relations remplacent les RECHERCHEV : le modèle propage les filtres entre tables.
- Cardinalité normale : un-à-plusieurs, du référentiel (1) vers les faits (*).
- Vérifiez toujours les relations auto-détectées dans la vue Modèle.
- Totaux identiques sur toutes les lignes d'un visuel = relation manquante ou cassée : le diagnostic n°1.
Défi 48h — appliquez demain
Comme Zineb, reliez deux tables par une relation : glissez la clé des faits sur la clé de la dimension en vue Modèle, lisez 1:* et le sens unique, puis créez un visuel croisant les deux tables. Supprimez la relation et notez le symptôme (totaux identiques partout) avant de la recréer.
- Je peux créer une relation entre deux tables par leur colonne clé.
- Je lis la cardinalité (1:*) et le sens de filtrage (unique) d'une relation.
- Je reconnais le diagnostic n°1 : totaux identiques = relation manquante.
Questions fréquentes
Quand utiliser une relation bidirectionnelle ?
Presque jamais : elle crée des ambiguïtés de calcul et des lenteurs, et se repère par des bugs difficiles à diagnostiquer. Des cas légitimes existent (certains filtrages par dimension partagée entre deux tables de faits), mais ils se traitent d'abord par un bon schéma en étoile (2.2) ou, ponctuellement, par la fonction DAX CROSSFILTER. Le réflexe par défaut reste le sens unique.
Ma relation refuse la cardinalité 1:* : pourquoi ?
Parce que la colonne clé côté dimension contient des doublons ou des vides, alors qu'une dimension a une seule ligne par élément. Corrigez dans Power Query : Supprimer les doublons sur la clé, filtrer les valeurs nulles. Un référentiel propre (une ligne unique par élément) est la condition d'un modèle fiable.
Que signifie « totaux identiques sur toutes les lignes » d'un visuel ?