Ian Klosowicz

Data modeling in Power BI is the part most beginners skip past. They connect to data, drag fields onto a canvas, and get charts -- and it seems to work. Then the numbers start coming out wrong, and the reason is usually the model underneath.
Getting the model right is what makes everything else in Power BI reliable. It's also what separates reports that scale from reports that fall apart when you add another table.
A star schema separates your data into fact tables (what happened -- sales, transactions, events) and dimension tables (context -- customers, products, dates, regions). The fact table sits in the center; the dimension tables connect to it in a star pattern.
This structure is what Power BI's calculation engine is designed around. Work with it and your measures will be simpler and more reliable. Work against it and you'll spend hours debugging numbers that don't match.
The distinction matters because they serve different roles in the model.
Fact tables contain the things you want to measure: sales amounts, quantities, costs, durations. Each row is usually a transaction or event. Fact tables tend to be long (many rows) and narrow (fewer columns). The columns you keep are numeric measures and foreign keys that link to dimension tables.
Dimension tables contain the context that describes or categorizes the facts: which customer, which product, which date, which store. Each row is usually a unique entity -- one row per customer, one row per product. Dimension tables tend to be shorter (fewer rows) and wider (more columns).
When you're deciding which is which, ask: do I sum or count this column, or do I use it to group and filter? If you sum or count it, it belongs in a fact table. If you group or filter by it, it belongs in a dimension table.
Power BI's DAX engine processes filters by following relationships from dimension tables into fact tables. When a user selects a product in a slicer, that filter travels from the product dimension into the fact table and narrows which rows get calculated.
Star schemas make this reliable because:
A relationship in Power BI connects two tables on a matching column -- usually a key column that's unique in the dimension table and repeated in the fact table. The relationship has a direction, which determines where filters go.
In a standard star schema relationship:
This means when you filter on a dimension, it affects calculations on the fact table. That's what you want.
Cross-filter direction is where beginners get into trouble. Setting relationships to "both" directions makes filters flow in both directions, which can cause unexpected interactions and circular filter paths. Start with single-direction filters unless you have a specific reason to change it.
Time intelligence in DAX -- year-to-date, prior year comparison, rolling averages -- requires a dedicated date table. Power BI can auto-generate one, but building your own is better because it lets you control what columns exist and how fiscal periods are defined.
A date table should:
Once marked, DAX time intelligence functions will use it correctly. Without a properly marked date table, functions like DATESYTD and SAMEPERIODLASTYEAR often produce incorrect results.
The mistakes beginners make most often:
DAX measures calculate in the context of the model's relationships and the filters active at the time of calculation. When you write a measure, you're writing instructions for how to aggregate numbers given whatever filter context exists.
A well-structured model makes DAX simpler. When the relationships are correct and the dimension tables are clean, most measures can be written with straightforward aggregation functions: SUM, AVERAGE, COUNT, DISTINCTCOUNT. The complexity comes in when you need to modify the filter context -- that's where functions like CALCULATE, ALL, and FILTER come in.
If you find yourself writing complex DAX to get a simple result, the model is often the actual problem. Fixing the model usually simplifies the DAX.
Do I need a star schema for small datasets?
Not strictly. But even for small datasets, building the habit of separating facts and dimensions makes your reports more maintainable and makes the DAX easier to write. It's worth doing from the start.
What if my data source already has everything in one table?
Use Power Query to split it into dimension tables and a fact table before loading into the model. This is one of the primary uses of Power Query -- shaping data into the structure the model needs.
How do I know if my model is correct?
The most reliable check is building a few measures you can verify against a source you trust -- a spreadsheet, a report, a number your business already knows. If those measures match, the model is probably right. If they don't, start by checking the relationships and the filter directions.
Should I use the auto-generated date table?
It's fine for simple reports, but it won't have fiscal periods or custom columns, and it doesn't give you control over the date range. Building your own date table in Power Query takes about 15 minutes and is worth doing for anything beyond basic time intelligence.