What if your data models were as simple and clear as separate folders instead of one messy drawer?
Why One model per source table rule in dbt? - Purpose & Use Cases
Imagine you have a big spreadsheet with many sheets, each sheet holding different data. You try to write one giant report by mixing all sheets manually in one place. It gets confusing fast.
Manually combining data from many tables into one model is slow and messy. It's easy to make mistakes, hard to update, and difficult to understand what each part does.
The "One model per source table" rule means you create a simple, clear model for each source table. This keeps things organized, easy to test, and easy to update without breaking everything.
select * from sales join customers on sales.customer_id = customers.id join products on sales.product_id = products.idmodel_sales as (select * from sales), model_customers as (select * from customers), model_products as (select * from products)
This rule lets you build clean, reusable data models that are easy to maintain and understand, making your data projects more reliable and faster to develop.
In a company, each department's data is stored in separate tables. By modeling each table separately, analysts can quickly update or fix one without affecting others, speeding up reporting.
Manual mixing of tables leads to confusion and errors.
One model per source table keeps data organized and clear.
This approach makes data projects easier to maintain and faster to build.
Practice
one model per source table rule in dbt?Solution
Step 1: Understand the rule and its benefits
The rule encourages creating one dbt model for each source table to keep things simple and clear. This approach helps with clarity, debugging, and teamwork by avoiding complex combined models.Final Answer:
To keep models simple and easy to understand -> Option DQuick Check:
One model per source table = simplicity [OK]
- Thinking it means combining tables into one model
- Believing it reduces the number of models
- Assuming it avoids using source tables
customers?Solution
Step 1: Match model name to source table and reference it
Following the rule, the model file should be named after the source table, herecustomers.sql. The model should select data from the source table to represent it clearly.Final Answer:
Create a model file namedcustomers.sqlwith a SELECT from the source table -> Option BQuick Check:
Model name = source table name + SELECT from source [OK]
- Naming model file unrelated to source table
- Not selecting from the source table
- Combining multiple tables in one model
orders:
select * from {{ source('sales_db', 'orders') }}
What will be the output if the source table has 100 rows?Solution
Step 1: Understand the SQL query and predict output
The query selects all columns and rows from the source tableorders. Since it selects all rows without filtering, the output will have the same 100 rows as the source.Final Answer:
The model will return 100 rows identical to the source table -> Option AQuick Check:
Select * from source = same rows [OK]
- Thinking it returns zero rows
- Assuming aggregation happens automatically
- Expecting syntax errors from correct source() usage
products:
select * from source('inventory', 'products')
But dbt throws an error. What is the problem?Solution
Step 1: Check dbt source function syntax and identify issue
The source function must be wrapped in double curly braces:{{ source(...) }}. The model usessource(...)without{{ }}, causing a syntax error.Final Answer:
Missing double curly braces around the source function -> Option CQuick Check:
dbt functions need {{ }} [OK]
- Forgetting {{ }} around source()
- Assuming select * is disallowed
- Ignoring model file naming conventions
customers and orders. According to the one model per source table rule, how should you organize your dbt models if you want to create a report showing total orders per customer?Solution
Step 1: Follow one model per source table for base models and build report model
Create one model forcustomersand one forordersseparately to keep base models simple. Create a third model that joins these base models to calculate total orders per customer, keeping transformations clear and modular.Final Answer:
Create separate base models forcustomersandorders, then create a third model joining them for the report -> Option AQuick Check:
Base models per source + separate report model [OK]
- Combining sources in one base model
- Skipping base models and joining sources directly
- Ignoring one source table
Ready to prove it?
Pass the test and this pattern moves unknown
