Gyromitra Inc.
← Back to Blog

Study Guide

Star Schema vs Flat Table: Why PL-300 Tests This So Heavily

By Dr. Rosario Feghali · August 28, 2026 · 8 min read

Every cohort I run has at least one student who arrives with a single wide Excel-style table — every column they could ever need, all in one place — and asks why they should bother splitting it apart. It's a fair question, and I understand the instinct: one table feels easier to build and easier to reason about. But PL-300 spends a meaningful share of the modeling domain testing exactly this decision, because getting it wrong is the single most common reason a report performs badly or a DAX measure returns the wrong number. Here's what actually changes when you move from a flat table to a star schema, and why the exam cares so much.

What a flat table actually is

A flat table is one table that mixes transactional data with descriptive attributes: every sales row repeats the customer's name, city, and segment; the product's category and color; the date's month and fiscal year — all as columns sitting next to the sale amount. It looks like a normal spreadsheet because it is one. Nothing about it is wrong for a quick pivot table in Excel.

What a star schema is

A star schema separates that same data into two kinds of tables:

  • Fact tables hold the events or transactions — one row per sale, per order line, per measurement — plus the numeric columns you'll aggregate (SalesAmount, Quantity) and keys that point to the tables describing that row.
  • Dimension tables hold the descriptive attributes — one row per customer, per product, per date — with no repetition. Customer has one row for each customer, not one row for every sale that customer made.

Relationships connect the fact table to each dimension, radiating outward like points on a star — hence the name. A single Sales fact table might relate to Customer, Product, Date, and Region dimensions, each a single-direction, one-to-many relationship from dimension to fact.

Why the flat table breaks down

The problem isn't aesthetic — it's mechanical, and it shows up in three places PL-300 tests directly.

1. DAX filter context gets confused. DAX is built around the assumption that filtering happens on dimension columns and propagates to facts through relationships. In a flat table, there's no relationship to propagate through — every column lives on the same grain as the transaction, so a measure like DISTINCTCOUNT([CustomerName]) has to do real work counting duplicates instead of trivially reading a dimension table's row count. Measures that are one line in a star schema (COUNTROWS(Customer)) become fragile workarounds in a flat table.

2. Model size balloons. Repeating "Contoso Ltd", "Toronto", "Enterprise" on every one of a customer's 4,000 sales rows instead of storing it once in a Customer table wastes memory — and Power BI's VertiPaq storage engine compresses columns far better when values repeat within a column than when a wide row repeats the same string across many columns. A flat table with dozens of descriptive columns compresses worse and loads slower than the equivalent star schema, sometimes dramatically so on large datasets.

3. Time intelligence functions stop working correctly. Functions like TOTALYTD and SAMEPERIODLASTYEAR require a proper date dimension marked as a date table, related to the fact table on a date key. Bury your dates as a column inside a flat transactional table and you lose the ability to mark it as a date table at all — which means time intelligence functions either error out or silently return wrong results. I've covered this in more depth in my date table guide, but it's worth repeating here: this single issue is one of the most common causes of "my YTD measure gives the wrong number" questions I get from students.

A concrete example

Say you're building a sales report and want "sales by customer segment." In a star schema, that's:

Total Sales = SUM(Sales[SalesAmount])

dropped onto a matrix visual with Customer[Segment] on rows. The relationship does the filtering automatically — no extra logic required.

In a flat table, the segment column lives on every row already, so this particular measure still works. But now ask for "customers with sales above $10,000 this year, compared to last year, by segment" — a completely reasonable report request. In a star schema this is a straightforward CALCULATE with a SAMEPERIODLASTYEAR wrapped around a FILTER. In a flat table, you're fighting row-level duplication at every step, because "customer" isn't a clean, filterable entity — it's smeared across thousands of transaction rows.

What PL-300 actually asks

The exam rarely asks "what is a star schema" directly. It asks scenario questions that require you to recognize when a model needs to be reshaped:

  • A case study describes a wide table imported from a single source and asks which modeling change would most improve performance — the answer is almost always "split into fact and dimension tables."
  • A question describes slow report performance on a large dataset and offers several fixes; if one option is "normalize the flat table into a star schema" and another is a report-layer trick (fewer visuals, disabled interactions), the modeling fix is usually the intended answer when the root cause is the data model itself.
  • Questions about DAX behaving unexpectedly often trace back to a flat or improperly related table, not a DAX syntax error.

The exam's modeling domain is testing whether you understand why Power BI works the way it does, not just whether you can recite the term "star schema."

When a flat table is actually fine

To be fair to my students who ask this: a flat table isn't always wrong. For a genuinely small, one-off analysis — a few hundred rows, no time intelligence, no need to scale — a flat table is simpler and there's no practical cost to that simplicity. The exam isn't testing dogma; it's testing whether you can recognize when a model's size, its reporting requirements, or its need for time intelligence tip the balance toward a proper star schema. The tipping point is smaller than most people expect, and Power BI's tooling — relationships, Manage Roles, time intelligence functions, even the Performance Analyzer — is all built assuming you've made that choice.

The practical habit

When you get a new dataset, before building a single visual, ask: what are the facts (things that happened, with numbers attached) and what are the dimensions (things you'd filter or group by)? If a column would have the same value repeated across many rows of your data, it almost certainly belongs in a dimension table, not baked into the fact table. Get in the habit of asking that question on every dataset you touch, not just the ones you build for practice — it's the modeling instinct PL-300 is actually testing.

Want your data model reviewed by a Microsoft Certified Trainer?

Gyromitra's PL-300 membership pairs the full self-paced course with a live weekly Q&A with a Microsoft Certified Trainer — bring your own model and we'll work through the star schema together. Join anytime, no cohort to wait for.