Architecture•9 min read•2026-01-10
7 Common Semantic Model Problems (and How to Fix Them)
From bidirectional relationship cascades to auto date/time table bloat: the architectural anti-patterns hurting enterprise models.
Core Engineering Takeaways
- •Snowflake dimension normalization causes needless table joins and slows down VertiPaq decompression.
- •Many-to-many relationships through bridge tables introduce ambiguous filter propagation and silent double-counting.
- •Role-playing dimensions should be modeled using inactive relationships and USERELATIONSHIP, not duplicated dimension tables.
1. Snowflake Schemas in Power BI
Relational database developers often normalize dimension tables (e.g. `Product` → `SubCategory` → `Category`). In Power BI's columnar VertiPaq engine, normalization is an anti-pattern. Every additional table hop requires the engine to traverse relationship pointer tables. **Fix:** Flatten all dimension hierarchies into a single star-schema dimension table during Power Query or SQL view staging.
2. Bidirectional Relationship Cascades
Enabling bidirectional (`Both`) cross-filtering seems like an easy fix when a visual slicer doesn't filter another slicer. But bidirectional filters create circular filter propagation loops, leading to wrong calculation totals and catastrophic query degradation. **Fix:** Use single direction (`1:*`) and implement `CALCULATETABLE` or `CROSSFILTER` in explicit DAX measures.
3. Inactive Role-Playing Duplication
When a Sales table has `OrderDate`, `ShipDate`, and `DueDate`, developers frequently copy the `Date` table three times (`Order Date`, `Ship Date`, `Due Date`). This triples memory overhead and prevents cross-metric analysis. **Fix:** Use a single canonical Date table with inactive relationships activated inside DAX via `USERELATIONSHIP`.
4. Calculated Columns in Fact Tables
Writing DAX calculated columns inside a 50-million-row fact table wastes memory and defeats VertiPaq compression because calculated columns are computed post-compression without optimal dictionary sorting. **Fix:** Compute row-level attributes upstream in SQL or Power Query.
Power BI Diagnostic Audit
Suspect architectural debt in your model?
Request a Power BI Engineering Health Check. We diagnose VertiPaq memory bloat, DAX bottlenecks, and relationship issues with a prioritized remediation roadmap.