100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Relationships and Star Schema

Understand how Power BI relationships work and why a star schema of fact and dimension tables is the recommended foundation for accurate, performant models.

Data ModelingIntermediate10 min readJul 10, 2026
Analogies

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.

dax
-- 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

Was this page helpful?

Topics covered

#Programming#PowerBIStudyNotes#RelationshipsAndStarSchema#Relationships#Star#Schema#Data#SQL#StudyNotes#SkillVeris