Key takeaways
- One fact table should hold one grain; mixed grain is the most common cause of inflated totals.
- Dimensions should be narrow, conformed, and related to facts with single-direction filters.
- A continuous, marked date table is required for reliable time intelligence and multiple date roles.
- Validate keys, totals, and relationship coverage before the model reaches report users.
On this page
Mixing grain in one fact table
The most expensive mistake is a fact table that tries to hold more than one event. An order header carries delivery charges once per order; an order line carries quantity and price once per product. Put both in one table and the delivery charge repeats on every line, so any sum of it overstates the total.
The fix is a fact table per grain, related through conformed dimensions. A header fact and a line fact can share Customer, Date, and Channel. Report header measures from the header fact and line measures from the line fact. Do not combine them in a single visual without a defined allocation rule.
A simple illustration: an order with three lines and a delivery charge of 20 recorded on each line contributes 60 to any total of that column, not 20. The error survives every visual that sums the fact table, so it is rarely caught by checking a single chart.
Treating a wide table as a model
A single import of a transaction extract with fifty columns feels simple until every visual scans the same wide rows. A star schema separates numeric events from descriptive attributes, which compresses better and gives each dimension one place to change.
The related mistake is snowflaking everything. Product to Subcategory to Category is sometimes justified, but each extra table adds a relationship and a filter path. Flatten small hierarchies into one dimension unless the shared table is large and reused. Keep the keys and hide them from report view.
Getting relationships wrong
Relationships decide how filters travel. Most of them should be one-to-many, from the dimension to the fact, with a single filter direction. The exceptions should be deliberate and documented.
Test each relationship by filtering a dimension and counting fact rows. If a filter changes a total in a way that cannot be explained, inspect the direction and the key before changing any DAX. Ambiguity is a model problem, and a measure workaround usually hides it.
- Many-to-many between fact and dimension: usually a sign of duplicate dimension keys; resolve the duplicates instead of accepting the relationship.
- Bidirectional filtering everywhere: creates ambiguous paths and unpredictable totals; use single direction and a defined measure for the exception.
- Inactive relationships left unexplained: document which date role each one serves and activate it deliberately with USERELATIONSHIP.
- Text keys on both sides: slower and prone to mismatches from trailing spaces or case; use integer surrogate keys.
- Missing unknown member: unmatched foreign keys produce blank dimension members and can hide transactions from grouped visuals.
Ignoring the date table
Time intelligence functions expect a continuous date table marked as such. Using the date column in the fact table creates gaps on days with no sales, and year-to-date or same-period-last-year calculations can quietly return wrong results. Build a separate date table with one row per day, mark it, and relate it to each date role.
Multiple date roles need a decision: separate role-playing date tables for clarity, or one table with inactive relationships and USERELATIONSHIP in the measures that need them. Power BI allows only one active relationship between two tables; any additional relationship is created inactive and does nothing until a measure activates it.
Hiding the model's rough edges
Users should see dimensions and measures, not foreign keys, technical column names, or a fact table with a hundred fields. Hide keys, format measures consistently, and put related measures in display folders. A clean field list is part of the model, not decoration.
Check data types and column quality before publishing. A date stored as text, a numeric key stored as text, or a column with mixed types will cause relationship failures and slow queries. Fix them upstream or in Power Query, and remove columns no visual uses.
A pre-publish check
Symptoms in the report usually point back to a small number of model problems. Use the table as a diagnostic starting point, then confirm at the lowest grain.
| Symptom | Likely cause | Fix |
|---|---|---|
| Delivery charges double-counted | Header and line grain mixed | Separate fact tables by grain |
| Totals change when a slicer is cleared | Bidirectional or ambiguous relationship | Single-direction relationships, review exceptions |
| Same-period-last-year returns blank | Date table has gaps or is not marked | Continuous marked date table |
| Transactions appear under a blank category | Unmatched or blank foreign key | Unknown member and key validation |
| Refresh is slow and the file is large | Unused columns and high-cardinality text | Prune columns, fix types, avoid calculated columns |
Frequently asked questions
Can a star schema have more than one fact table?+
Yes. Each fact table should have its own grain and share conformed dimensions with the others. Measures remain specific to the fact they aggregate.
Is a flat table ever acceptable?+
Yes, for a small, single-purpose report with one source and no reuse. The problems appear when the report grows, when several facts must be compared, or when definitions need to be governed.
Is a separate date table needed for every date column?+
Not necessarily. One date table with inactive relationships and USERELATIONSHIP measures can work. Separate tables are clearer when several teams report on different date roles and confusion is likely.
How should many-to-many relationships be handled?+
Model the bridge table explicitly, with a dimension for the entity on each side and a bridge table that holds the combinations. Avoid relying on a bidirectional relationship to simulate it.
Need help applying this?
Improve your bi dashboards & reporting.
Review the service scope or tell us what you are trying to improve. We will reply with a clear next step.
Free KPI definition templateRelated reading
Power BI star schema: a practical data model checklist
A practical checklist for designing a Power BI star schema: grain, keys, dimensions, date tables, relationships, and validation.
Power BI date tables: why they matter
Why a dedicated date table is required for reliable time intelligence in Power BI, how to build one, and how to handle fiscal years and multiple date roles.