What Relationships Do in the Data Model
A relationship in Power BI links two tables through a common column, allowing a filter or selection applied to one table to automatically propagate to another — clicking a region in a slicer built from a Region dimension table filters the Sales fact table down to that region's rows without any manual join in every visual. Under the hood, Power BI's VertiPaq engine stores relationships as one-to-many or many-to-many cardinality with a defined cross-filter direction, and every visual's query is resolved by walking these relationships rather than executing an explicit SQL join.
Cricket analogy: This is like a broadcast graphics system where selecting a team automatically filters every stat panel — batting, bowling, fielding — to that team's players, without a producer manually re-linking each panel.
Star Schema: Facts and Dimensions
A star schema organizes a model into one or more fact tables — tall tables holding numeric, transactional measurements like Sales Amount or Quantity, one row per event — surrounded by dimension tables that hold descriptive attributes like Product Name, Customer City, or Calendar Date, each connected to the fact table by a one-to-many relationship radiating outward like the points of a star. This shape keeps fact tables narrow and fast, avoids storing repeated descriptive text in every transaction row, and matches exactly how DAX filter context and the VertiPaq engine are optimized to work, which is why Microsoft's own modeling guidance treats star schema as the default recommended design.
Cricket analogy: This is like a scorecard database where the Ball-by-Ball fact table holds only runs, wicket, and extras per delivery, while separate Player and Venue dimension tables hold names and details, joined by ID rather than repeated in every row.
-- Once Sales (fact) is related to Product and Date (dimensions) via one-to-many relationships,
-- a single measure automatically respects any filter placed on either dimension table.
Total Sales = SUM ( Sales[SalesAmount] )
-- No table joins are written here: filtering Product[Category] = "Bikes" in a slicer
-- automatically restricts which Sales rows this measure sums, via the relationship.Build a dedicated Date dimension table (rather than relying on the date column inside your fact table) and mark it as the official Date Table in Power BI. This unlocks DAX time-intelligence functions like SAMEPERIODLASTYEAR and TOTALYTD, which require a continuous, unique calendar column to compute correctly.
Cardinality and Cross-Filter Direction
Each relationship has a cardinality — most commonly one-to-many, where one row in a dimension table matches many rows in a fact table — and a cross-filter direction, which controls whether filtering flows one way (single, the default and recommended setting) or both ways (bidirectional). Bidirectional filtering can be useful for specific scenarios like a many-to-many bridge table, but overusing it across a model risks ambiguous filter paths and circular logic that silently changes measure results, so Microsoft's guidance is to default to single-direction filtering and enable bidirectional only when a specific, understood need exists.
Cricket analogy: This is like a one-way rule where selecting a bowler filters which deliveries show up in a match summary, but selecting a specific delivery does not unusually filter back to change which bowler is highlighted — keeping the logic predictable.
Avoid connecting two fact tables directly to each other with a many-to-many relationship. Instead, route both through a shared dimension table (or a dedicated bridge table), because direct fact-to-fact relationships tend to produce ambiguous or double-counted totals that are hard to debug.
- Relationships let filters on one table automatically propagate to related tables without manual joins in each visual.
- A star schema separates tall, numeric fact tables from descriptive dimension tables joined by one-to-many relationships.
- Star schema keeps fact tables narrow and matches how the VertiPaq engine and DAX filter context are optimized.
- A dedicated, marked Date dimension table is required for DAX time-intelligence functions to work correctly.
- Relationships have cardinality (typically one-to-many) and a cross-filter direction (single or bidirectional).
- Single-direction filtering should be the default; bidirectional filtering is reserved for specific, understood cases.
- Avoid direct many-to-many relationships between two fact tables to prevent ambiguous or double-counted results.
Practice what you learned
1. In a star schema, which table typically holds numeric, transactional measurements with one row per event?
2. Why is a dedicated Date dimension table needed for DAX time-intelligence functions?
3. What is the recommended default cross-filter direction for relationships in a star schema?
4. What problem commonly arises from connecting two fact tables directly with a many-to-many relationship?
5. What does a relationship's cardinality describe?
Was this page helpful?
You May Also Like
Power Query Basics
Learn how Power Query lets you connect, shape, and clean data before it ever reaches your Power BI model, using a repeatable, no-code ETL workflow.
Calculated Columns vs Measures
Learn the fundamental DAX distinction between calculated columns, which compute row-by-row and are stored, and measures, which compute dynamically based on filter context.
Data Refresh
Understand how Power BI keeps report data current through scheduled, incremental, and real-time refresh strategies, and the role of the on-premises data gateway.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics