2.1 · Relations & modèle de données

Niveau 2 · Modèle & DAX

2.1Relations & modèle de données

Objectif : Créer et vérifier des relations dans la vue Modèle, et reconnaître à vie le symptôme de la relation manquante.
Temps estimé : 18 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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).

Erreur d'interprétation fréquente : « Une relation, c'est facultatif : mes visuels marchent quand même, le mode bidirectionnel est plus pratique, et ma clé peut contenir des doublons ». Non, triple erreur. Sans relation, les tables ne dialoguent pas : les totaux se répètent sur toutes les lignes — c'est le diagnostic n°1. Le sens bidirectionnel n'est presque jamais nécessaire et crée ambiguïtés et lenteurs : le réflexe est le sens unique (1 → *). Et la colonne clé côté dimension doit être unique, sans doublon ni vide, sinon la relation 1:* est refusée.
Une relation, le canal des filtres Le filtre circule de la dimension (côté 1) vers les faits (côté *). Dimension (côté 1)Produits[Code] — une ligne par produit+Faits (côté *)Ventes[CodeProduit] — plusieurs lignes+Sens de filtrage1 → * (unique, la norme saine) Totaux identiques partout = relation manquante (diagnostic n°1).
Le filtre circule de la dimension (côté 1) vers les faits (côté *).
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Zineb, contrôleuse de gestion à Alger, relie ses ventes à son référentiel produits : dans la vue Modèle, elle glisse Ventes[CodeProduit] sur Produits[Code] et le trait apparaît — le modèle propage les filtres, sans formule. 2) Elle lit la cardinalité (1:* — un produit, plusieurs ventes) et le sens de filtrage unique, du côté « 1 » vers le côté « * », et vérifie toujours les relations auto-détectées. 3) Elle apprend le diagnostic n°1 : des totaux identiques sur toutes les lignes d'un visuel signalent une relation manquante ou cassée — souvent une clé à doublons ou vides côté dimension. Leçon : relier les tables remplace les RECHERCHEV, on garde le sens unique, et on vérifie la clé côté dimension.

🔎 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

  1. Importez une seconde table « Produits » (Code, Désignation, Catégorie, PrixUnitaire) — créez-la dans Excel si besoin, comme Zineb.
  2. Vue Modèle : si Power BI n'a pas créé la relation, glissez Ventes[CodeProduit] sur Produits[Code] — le trait apparaît.
  3. Double-cliquez le trait : lisez cardinalité (1:*) et sens de filtrage (unique) — la configuration saine par défaut.
  4. 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.
Votre premier modèle multi-tables fonctionnel — et le symptôme de la relation manquante reconnu à vie.

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.

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : est-ce que je crée et vérifie une relation sans hésiter ?Auto-évaluation 1-5 : ai-je reproduit le symptôme de la relation manquante pour le reconnaître ?

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.

Vérifiez votre compréhension

Que signifie « totaux identiques sur toutes les lignes » d'un visuel ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 2Questions inédites et durcies pour valider vos acquis