Most of the reasons Power BI projects fail lie not in the complexity of DAX formulas but in the wrong setup of the underlying data model. The star schema — the dimensional-modeling approach popularized by Ralph Kimball — is the structure that works most efficiently with Power BI's mathematical engine. In this article we'll cover the star schema, fact and dimension tables, relationship-direction decisions and common mistakes from an enterprise perspective.
01. Why the Star Schema? From the VertiPaq Engine's Perspective
The heart of Power BI is a columnar compression engine called VertiPaq. This engine compresses and stores data separately for each column and processes queries in parallel.
VertiPaq compresses repeating values very efficiently: in a 10-million-row table, if the "Product Category" column has only 8 distinct values, the compression ratio rises to 99%. But if the same column is kept in a "flat" table merged with product name and supplier information, the repetition pattern breaks and compression drops dramatically.
The star schema maximizes exactly this compression: it separates repetitive attributes into dimension tables and keeps measurable events in the fact table. The result: a 5-10x smaller model, 3-5x faster queries.
02. Fact and Dimension Tables: An Anatomical Look
The fact table holds measurable business events: sales, orders, collections, production output. Each row represents an "event," and its content is:
- Numeric measures (quantity, amount, cost, count)
- Foreign keys referencing dimension tables
The dimension table holds the "who, what, where, when" dimensions of the event:
- Customer (name, industry, city)
- Product (code, category, brand)
- Date (year, quarter, month, day, holiday flag)
- Store / Warehouse (location, region, type)
In an ideal star schema, the fact table is thin and long (millions of rows but only 8-15 columns), and the dimension tables are wide but short (thousands of rows, 20-40 columns).
03. The Date Dimension: An Indispensable Standard
Every serious Power BI model should have a separate Date dimension table. This isn't a small decision that looks like "just a day"; it's a mandatory building block for DAX time-intelligence functions (YTD, SAMEPERIODLASTYEAR, DATESYTD, PARALLELPERIOD) to work.
A correct Date table:
- Contains a continuous date range covering the analysis period (one row per day)
- Is marked as a "Date table" in the model
- Contains year, quarter, month name, month number, week, day and business-day flag columns
- Forms a one-to-many relationship with the date fields in fact tables
In a model without a Date table you can't write time-intelligence DAX; even if you do, it produces unexpected results.
04. Relationship Direction and Cardinality Decisions
When creating a relationship between two tables, three decisions must be made:
- Cardinality (one-to-many, one-to-one, many-to-many)
- Cross-filter direction (single or both)
- Active / inactive relationship
In a standard star schema, all relationships should be one-to-many (from dimension to fact) and work in a single direction. A bidirectional relationship looks tempting but leads to a more complex model, slower queries and unexpected total behaviors.
Many-to-many relationships should especially be avoided; if truly needed, they should be turned into single-direction relationships with a bridge table. There can be only one active relationship between each table pair; the USERELATIONSHIP function is needed for a second relationship.
05. Snowflake Schema: When Is It Acceptable?
The snowflake schema is a structure where dimension tables are broken into sub-dimensions within themselves (Product → Category → Main Category). In classic theory it was preferred because it's "normalized."
In Power BI, snowflake reduces the VertiPaq engine's compression advantage and complicates DAX writing. The general rule: denormalize dimension tables as much as possible (prefer a single wide table).
The case where snowflake is acceptable: if the same sub-dimension is shared by different main dimensions (for example, if "Region" applies to both "Customer" and "Store"). Then a separate Region table stays cleaner than denormalizing.
06. 5 Common Modeling Mistakes
The most common mistakes we see in the field:
- Merging fact and dimension into one table (flat model): performance collapses, compression drops
- Using the date column in the fact table as the date dimension: time-intelligence breaks
- Putting numeric fields in a dimension: measures like amount and price must be in the fact
- Making relationships bidirectional: complexity and slowness
- Using a composite key: rather than creating a key from the combination of two fields, a single surrogate key should be produced at the source
If these five mistakes are corrected, both the model's size and speed improve two- to threefold.
07. Validating the Model: Vertipaq Analyzer and Best Practices
Don't set up the model and move on; measure its performance character. Vertipaq Analyzer (a free tool inside DAX Studio) shows how much space each column of your table takes. The columns that take the most space are usually:
- High-cardinality text (customer name, product description)
- Date-time columns (time kept when only the date is needed)
- ID columns (unique ones can't be compressed)
The Best Practices Analyzer (BPA) inside Tabular Editor automatically checks star-schema best practices; violations are listed. It should be run before every production release.
Explore our Power BI solution
You can book a free consultation call to get detailed information.