Courseiva
PL-300Chapter 7 of 18Objective 2.1

Data Modeling Fundamentals

Data modeling is the invisible architecture that turns raw, messy data into a clean, organised story that reports and dashboards can tell. Without a solid model, your Power BI reports will be slow, confusing, and prone to errors. For the PL-300 exam, understanding how to design this structure is the single most important skill because everything from visuals to DAX formulas depends on it.

12 min read
Intermediate
Updated Jul 24, 2026
Editorial oversight: Johnson Ajibi· Security Systems Architect · MSc IT Security · IEEE Senior Member

A simple way to picture Data Modeling Fundamentals

The Kitchen Recipe Book Analogy

A cookbook is the source of truth for every meal in a restaurant kitchen. This cookbook doesn't just list ingredients; it defines the structure of every dish, the relationships between components, and the rules for combining them. A data model works exactly the same way for a business's information.

Imagine you are the head chef at a busy restaurant. You have a recipe book that specifies how a 'Customer Order' is built. It shows that an order needs a customer name (from the guest list), menu items, quantities, and a total price. This recipe also defines relationships: one order can have many menu items, but each menu item belongs to just one category on the menu. If a waiter tries to add a 'Table Number' to the order recipe, but the cookbook has no rule for that, the order becomes confusing and inconsistent.

In data modeling, the 'cookbook' is the schema (the blueprint). The 'recipes' are the tables (like 'Customers', 'Orders', 'Products'). The 'ingredient lists' are the columns (like 'CustomerID', 'OrderDate', 'ProductName'). The 'combining rules' are the relationships and keys that link tables together. A well-designed data model ensures that every report, every chart, and every dashboard in Power BI is built from a consistent, understandable, and efficient recipe — no mystery meat, no missing ingredients, and no kitchen chaos.

How It Actually Works

At its heart, a data model is a blueprint for how different pieces of information relate to each other. Think of it as a map of your business's data. Before Power BI can create a chart showing 'Sales by Region', it needs to know how 'Sales' connects to 'Regions'. The data model defines those connections.

The fundamental building blocks of a data model are tables and relationships. A table is a collection of data about a single subject, like 'Customers', 'Products', or 'Orders'. Each row in a table represents one record (one customer, one product, one order). Each column represents a specific attribute of that record (Customer Name, Product Price, Order Date).

Relationships are the connections between tables. They answer questions like: 'Which customer placed this order?' or 'Which product is in this order category?' These relationships are powered by keys. A primary key is a unique identifier for each row in a table — think of it as a passport number that is unique to every person. A foreign key is a column in one table that points to the primary key in another table — like using someone's passport number to link their travel record to their personal details.

There are three main types of relationships you need to know for PL-300:

One-to-many relationship: This is the most common type. One row in the primary table (like 'Customers') can be related to many rows in the related table (like 'Orders'). A single customer can place many orders.

One-to-one relationship: One row in one table is related to exactly one row in another. For example, one employee has exactly one desk. This is less common in business reporting.

Many-to-many relationship: Multiple rows in one table can relate to multiple rows in another. For example, students and classes — one student can take many classes, and one class can have many students. Power BI handles these using bridge tables or a technique called 'many-to-many cardinality' which the exam tests.

You also need to understand star schema. This is a recommended modelling approach that organises tables into two groups: fact tables and dimension tables. A fact table contains the measurable, numerical data of a business process — like sales amount, quantity sold, or transaction count. It is usually very long, with many rows. Dimension tables describe the context around those facts — like who (Customer), what (Product), when (Date), and where (Store). They are shorter and wider, with descriptive columns. The star schema gets its name because the fact table is at the centre, and dimension tables radiate out from it like the points of a star. This structure makes queries fast and simple.

Another key concept is granularity. This refers to the level of detail stored in a fact table. For example, sales data could be at the 'transaction line level' (each item on a receipt is a row) or at the 'daily store total level' (one row per day per store). A common mistake is to mix granularities in the same table. Power BI expects consistent granularity to calculate correctly.

Finally, you need to know about calculated columns and measures. A calculated column is a new column added to a table, computed row by row during data refresh. A measure is a calculation performed on the fly when you drag it into a visual, using DAX (Data Analysis Expressions). For performance and best practice, always use measures for aggregations (like SUM, AVERAGE) and calculated columns only when you need a value per row (like a full name from first and last name).

Data modeling replaces the old approach of using spreadsheets with everything in one giant table. That single-table approach leads to duplicate data, huge file sizes, and slow reports. By separating data into logical tables and linking them with relationships, you reduce redundancy, improve performance, and make your reports easier to maintain.

A star schema showing a central Sales fact table linked to Products, Customers, and Date dimensions, with a bridge table connecting Products to Categories for a many-to-many relationship.

Walk-Through

1

Identify Business Entities

Start by listing the key 'nouns' of your business process — customers, products, orders, dates, stores. Each of these becomes a potential dimension or fact table. This step ensures you capture all data sources before modelling.

2

Classify Tables as Facts or Dimensions

Separate your tables into two groups. Facts contain numerical measurements (sales amount, quantity) and are long with many rows. Dimensions contain descriptive attributes (product name, customer city) and are shorter with multiple columns. This classification is the foundation of star schema.

3

Define Primary and Foreign Keys

Identify a unique column (primary key) in each dimension table, like CustomerID or ProductID. Ensure the fact table has matching columns (foreign keys) to link back. If keys are missing, you may need to create them in Power Query by combining columns or adding an index.

4

Create Relationships

In the Model view of Power BI Desktop, drag the primary key from a dimension table to the matching foreign key in the fact table. Choose the correct cardinality (usually one-to-many) and cross-filter direction (usually single). Repeat for every dimension linked to the fact table.

5

Build a Date Dimension Table

Create a separate table with one row for every date in your data range. Use the CALENDAR or CALENDARAUTO DAX function, or generate it in Power Query. Add columns for Year, Month, Quarter, and Day of Week. Link this date table to every date column in your fact tables using inactive relationships as needed.

6

Create Measures and Calculated Columns

Write DAX measures for aggregations like Total Sales = SUM(Sales[Amount]). Create calculated columns only for row-level values that don't change with filtering, like a full name. Use RELATED() in calculated columns to bring a value from a related dimension table into a fact table if needed.

7

Validate the Model

Test your model by dragging fields from dimension tables into a matrix visual and measures into the values field. Verify that filtering works correctly. Check that cross-filtering does not produce ambiguous results. Adjust inactive relationships or cardinality if needed.

What This Looks Like on the Job

Imagine you work for a retail company called 'Northwind Traders'. The company sells products online and in physical stores. Your manager asks you to build a Power BI report showing total sales by product category for each month of last year. Without a data model, you would have a single monster spreadsheet with every order line, customer name, product name, category, and date all in one sheet. This spreadsheet would have millions of rows, be slow to load, and any mistake (like a typo in a product name) would break your report.

Here is how you would build a proper data model for this scenario:

First, you identify the core tables from the source system (a SQL database or a data warehouse). You discover four key tables: 'SalesOrders' (facts), 'Products' (dimension), 'Customers' (dimension), and 'Date' (dimension).

You load these tables into Power BI's Power Query Editor. Here, you clean the data: remove duplicate rows, ensure date columns are actual dates, and split 'FullName' into 'FirstName' and 'LastName' if needed.

Next, you create relationships. The 'SalesOrders' table has a 'ProductID' column. You connect this to the 'Products' table's 'ProductID' column (one-to-many: one product can appear in many orders). Similarly, 'SalesOrders' has 'CustomerID' linked to 'Customers', and 'OrderDate' linked to the 'Date' table.

You check the cardinality. The relationship between 'SalesOrders' and 'Date' is many-to-one because many orders happen on the same date. You set the cross filter direction to 'Single' (from Date to SalesOrders) to avoid ambiguity.

You then create a date dimension using either Power Query or DAX. A proper date table contains one row per day, with columns for Year, Month, Quarter, Day of Week, etc. This allows users to drill down from year to month to day.

Now you build your measures. Instead of simply dragging the 'SalesAmount' column into a chart, you create a measure: 'Total Sales = SUM(SalesOrders[SalesAmount])'. This ensures the sum is always calculated correctly, even when filters (like product category or month) are applied.

You also create a 'Sales by Category' chart. Because you linked 'SalesOrders' to 'Products' and 'Products' to a 'Categories' table (if it exists), or you add Category as a column in the Products dimension, the report automatically filters correctly.

Finally, you test the model. You drag 'CategoryName' from the Products table into a matrix visual, and 'Total Sales' into the values. The numbers match the source system. You then add a slicer for 'Month' from the Date table, and the chart updates instantly.

The result is a fast, accurate, and flexible report. When your manager asks 'What about sales by region?', you can easily add a 'Region' dimension table and link it, without rewriting your entire report.

How PL-300 Actually Tests This

The PL-300 exam (exam DA-100 before the rename) tests data modeling fundamentals heavily. Expect around 15-20% of the questions to come from this area. The exam loves to test your understanding of star schema design, relationship cardinality, and the difference between active and inactive relationships.

Here are the specific concepts and trap patterns the exam uses:

Star schema identification: You will be given a list of tables and asked which is a fact table (contains numbers, is long and thin) and which is a dimension table (contains attributes, is wide and short). The trap: some tables can look like facts but are actually dimension tables, like a 'Budget' table that has a single numeric column per row but is actually a dimension because it defines a target.

Relationship cardinality: You will be asked to choose the correct cardinality for a given scenario. The exam loves 'many-to-many' with a bridge table. The trap: beginners often select 'one-to-many' when the model actually requires a bridge table because two dimension tables have a genuine many-to-many relationship (e.g., patients and diagnoses).

Active vs. inactive relationships: A table can have multiple relationships to the same table, but only one can be active at a time. The exam tests when to create an inactive relationship and then use USERELATIONSHIP in DAX. Example: 'OrderDate' and 'ShipDate' both link to the 'Date' table. Only one date relationship can be active. The trap: forgetting that the active relationship is the default, and using USERELATIONSHIP only in measures that need the other date.

Role-playing dimensions: A single dimension table (like 'Date') can be used multiple times in the model (as Order Date, Ship Date, Due Date). The exam tests whether you know to create multiple inactive relationships or to create separate timestamp columns. The correct pattern: one date table with multiple inactive relationships.

Bi-directional cross filter: The exam tests when to use single-direction vs. bi-directional filtering. The rule: only use bi-directional when you have a genuine need to filter both ways (e.g., a bridge table in a many-to-many relationship). The trap: beginners set bi-directional on everything, causing ambiguous filtering and slow performance.

Calendars and date tables: The exam assumes you know that a proper date model requires a separate date table with continuous dates. They will ask: 'Which DAX function creates a date table?' CALENDAR or CALENDARAUTO. The trap: using a date column from a fact table as the date dimension, which causes gaps in dates and missing time intelligence calculations.

Calculated columns vs. measures: The exam frequently asks: 'When should you use a calculated column instead of a measure?' Answer: when you need the value at the row level and it does not change based on filter context (e.g., a column that combines first and last name). Measures are always preferred for aggregations.

To memorise for the exam:

The primary key of a dimension table should be used as the 'one' side of a one-to-many relationship.

Fact tables should not have columns that are purely attributes (like product color) — those belong in dimension tables.

Avoid bi-directional cross filter unless absolutely necessary.

Always define a separate date dimension table.

Use 'Referential Integrity' and 'Assume Referential Integrity' settings correctly: if you know every foreign key has a matching primary key, you can enable it to improve query performance.

The exam questions are often scenario-based. You read a paragraph about a business need and then choose the correct modeling step from a list. Pay attention to the wording: 'which relationship type', 'which table is the fact table', 'which DAX function creates a relationship' (RELATED vs. RELATEDTABLE).

Key Takeaways

A star schema has fact tables (measurements) at the centre and dimension tables (descriptive attributes) radiating out, which makes queries fast and simple.

Primary keys uniquely identify each row in a table, and foreign keys link tables together in a relationship.

Measures are calculated on the fly and respect filter context, so always use them for aggregations like SUM or AVERAGE instead of calculated columns.

Use single-direction cross filtering by default, and only switch to bi-directional when you have a concrete need like a many-to-many bridge table.

A proper date dimension table with one row per day is non-negotiable for any time-based analysis in Power BI.

Many-to-many relationships require a bridge table to be implemented correctly; you cannot just set the cardinality without adjusting the model structure.

Granularity must be consistent within a fact table — do not mix daily totals and transaction-level details in the same table.

Inactive relationships are used when a dimension table needs to be joined to a fact table on multiple columns (e.g., OrderDate and ShipDate both linking to Date).

Easy to Mix Up

These come up on the exam all the time. Here's how to tell them apart.

Fact Table

Contains numerical measurements (e.g., sales amount, quantity)

Has many rows (often millions) and fewer columns

Foreign keys link to dimension tables

Dimension Table

Contains descriptive attributes (e.g., product name, customer city)

Has fewer rows and more columns (wide and short)

Primary keys are used to link to fact tables

Calculated Column

Computed during data refresh and stored in the model

Same value for every row regardless of filter context

Uses row context (e.g., [FullName] = [FirstName] & " " & [LastName])

Measure

Computed on the fly when a visual is rendered

Value changes based on filter context (e.g., SUM(Sales[Amount]) responds to slicers)

Uses filter context and aggregation functions (SUM, AVERAGE, COUNT)

One-to-Many Relationship

One row in the primary table relates to many rows in the related table

Implemented directly by linking primary key to foreign key

Uses single-direction cross filter by default

Many-to-Many Relationship

Multiple rows in one table relate to multiple rows in another

Requires a bridge table (intermediate table) to resolve the relationship

Often needs bi-directional cross filter for correct filtering

Active Relationship

The default relationship used by Power BI for filtering

Only one active relationship can exist between two tables at a time

Drawn as a solid line in Model view

Inactive Relationship

Defined but not used by default in filtering

Activated in a DAX measure using the USERELATIONSHIP function

Drawn as a dashed line in Model view

Primary Key

Unique identifier for each row in a table (e.g., CustomerID)

Cannot contain duplicate values

Used on the 'one' side of a one-to-many relationship

Foreign Key

Column in a table that references the primary key of another table

Can contain duplicate values (e.g., same ProductID appears in multiple order rows)

Used on the 'many' side of a one-to-many relationship

Watch Out for These

Mistake

I can just import all my Excel sheets into Power BI as-is and build visuals directly from them without any modeling.

Correct

Power BI works best when you transform your data into a star schema with separate fact and dimension tables, even if it means extra work in Power Query.

Beginners often come from a spreadsheet mindset where everything is in one table. They don't realise that multiple tables with relationships reduce data duplication and improve performance.

Mistake

A relationship with many-to-many cardinality works the same as one-to-many, just with more connections.

Correct

Many-to-many relationships require a bridge table (an intermediate table) to avoid ambiguous filtering. Power BI handles them differently, and you need to understand how cross-filtering behaves.

The term 'many-to-many' sounds intuitive, but the implementation is not straightforward. Beginners assume it is just a setting they can flip, not a structural design change.

Mistake

I should make all relationships bi-directional so that filtering works in both directions automatically.

Correct

Bi-directional cross filtering should be used sparingly. It can cause ambiguous filtering (circular dependencies) and slow down performance. Single-direction is the default for a reason.

New users think 'more filtering equals better filtering'. They don't understand that ambiguous filters can lead to incorrect numerical results, and they are not aware of the performance penalty.

Mistake

A calculated column and a measure are basically the same thing since both give me a value.

Correct

A calculated column is computed once during data refresh and stored in the model, while a measure is computed on the fly when a visual is rendered. Measures are more memory-efficient and respect filter context; calculated columns do not.

The names are confusing ('calculated' vs. 'measure'), and beginners often think they are interchangeable. They don't grasp the concept of filter context, which is essential for understanding measures.

Mistake

I don't need a separate date table; I can just use the date column from my sales table.

Correct

A dedicated date dimension table is essential for time intelligence calculations in DAX (like year-to-date, same period last year). Using a date column from a fact table will fail because it has gaps and lacks continuous date ranges.

Beginners see a date column and think it works. They don't understand that time intelligence functions in DAX require a continuous, contiguous date table as a separate dimension.

Do You Actually Know This?

Reveal each answer, then mark whether you got it right. Score 60%+ to unlock the next chapter.

Frequently Asked Questions

What is the difference between a fact table and a dimension table?

A fact table stores numerical, measurable data about business events (like sales amount or quantity), and it usually has many rows. A dimension table stores descriptive attributes (like product name or customer city) and is used to filter and group the facts. In a star schema, facts are at the centre and dimensions surround them.

Why do I need a separate date table in Power BI?

Time intelligence functions in DAX (like TOTALYTD, SAMEPERIODLASTYEAR) require a continuous, contiguous date table that has one row per day. Using a date column from a fact table will have gaps (e.g., weekends or holidays) and break these calculations. A dedicated date dimension ensures correct time-based analysis.

What does 'cardinality' mean in a relationship?

Cardinality describes how many rows in one table can relate to rows in another. Common types are one-to-many (one customer can have many orders) and many-to-many (students and classes). The cardinality you choose affects how Power BI filters and calculates data.

When should I use an inactive relationship?

Use an inactive relationship when a dimension table needs to be linked to a fact table on more than one column, like a 'Date' table linking to both 'OrderDate' and 'ShipDate'. Only one relationship with the same dimension can be active. You activate the inactive one using the USERELATIONSHIP function in a DAX measure.

What is a bridge table in data modeling?

A bridge table is an intermediate table used to resolve many-to-many relationships. For example, if a student can take many classes and a class can have many students, you create a 'Enrollments' bridge table that lists each student-class combination. The fact and dimension tables then connect through the bridge.

How do I know if I should use a measure or a calculated column?

Use a measure for any aggregation (SUM, AVERAGE, COUNT) that needs to change based on filters in a visual. Use a calculated column when you need a value that is computed row-by-row during data refresh and does not depend on filter context, like combining first and last name into a full name.

Terms Worth Knowing

Keep going

You've finished Data Modeling Fundamentals. Continue through the PL-300 study guide to build a complete picture of the exam.

Done with this chapter?