The three enterprise modeling philosophies compared, with a clear map of when each approach actually fits.
⏱ 17 min readTopics chapter readerLevel · Dimensional & Warehouse
01 · Overview
Start here
⏱ 6 min · Topic 1 of 12
A data warehouse is a database built for reports. It collects data from many source systems, such as the shop database.
The sources do not agree. One system writes a country as IN, and another writes India. Integration means making them agree in one place.
A warehouse architecture decides where integration happens. Three well-known methods give three answers: Kimball, Inmon and Data Vault.
You know the pieces already. Third normal form (3NF) stores each piece of data once. A star puts a fact table in the middle with flat dimensions around it.
This chapter builds the same shop three ways. Then it asks one question of all three, and compares the cost.
What you will learn
Why every method must integrate, and where each one does it.
Kimball: one star at a time, joined by a bus matrix.
Inmon: one 3NF core first, then marts.
Data Vault: hubs, links and satellites, with stars on top.
One query, three models, one answer. Then a trade-off table.
When each one fits, how to mix them, and what to say in an interview.
02 · The question
Where does integration happen?
⏱ 6 min · Topic 2 of 12
Take Asha. The shop database stores Asha as customer 1, with country IN. A support tool stores Asha as A-77, with country India.
Two sources, one person
system
source_id
name
country
shop
1
Asha
IN
support tool
A-77
Asha
India
Someone must decide two things. Is A-77 the same person as customer 1? Is India the same as IN?
That work is integration.
A data mart is a small set of tables for one subject, such as orders. Marts are usually stars. The three methods differ in where integration happens, and what they build first:
Three answers
Method
Where integration happens
Built first
Kimball
In shared (conformed) dimensions
One star for one business process
Inmon
In one company-wide 3NF core
The core for the needed subjects, then marts
Data Vault
Partly, in tables with one row per id (such as customer_id). Business rules come later.
A store of unchanged source data, then marts
No method skips integration. The choice is where you do it, and when you spend the work.
03 · Method 1
Kimball: stars, one by one
⏱ 11 min · Topic 3 of 12
Ralph Kimball’s method is bottom-up. You build one star for one business process, then the next. A business process is one activity the company measures, such as orders or refunds.
The stars join up through conformed dimensions. Recap: a conformed dimension is one dimension table that many stars share, with the same keys and meaning.
The shop as one star
Here is the orders star. Its dimension uses SCD Type 2 (slowly changing dimension, Type 2), so it keeps history. Asha has two rows, one for IN and one for DE.
dim_customer (6 rows)
customer_key
customer_id
name
country
valid_from
valid_to
1001
1
Asha
IN
2026-01-01
2026-01-08
1002
2
Ben
GB
2026-01-01
9999-12-31
1003
3
Carla
US
2026-01-01
9999-12-31
1004
4
Dev
NULL
2026-01-01
9999-12-31
1005
5
Omar
IN
2026-01-01
9999-12-31
1006
1
Asha
DE
2026-01-08
9999-12-31
fact_orders (6 rows)
order_id
customer_key
order_date
status
amount
101
1001
2026-01-03
paid
40.00
102
1006
2026-01-10
paid
25.00
103
1002
2026-01-11
refunded
60.00
104
1003
2026-01-15
paid
15.50
105
1003
2026-01-20
pending
NULL
106
1004
2026-01-21
paid
80.00
Order 101 points at key 1001, the IN row. Order 102 points at key 1006, the DE row. The star remembers where Asha lived at order time.
The bus matrix
To add more stars, plan the shared dimensions first. A bus matrix lists business processes down the side and shared dimensions across the top. A yes means that star uses that dimension:
Bus matrix (a plan: the shop has no refund or payment tables yet)
Business process
Fact table
dim_customer
dim_product
dim_date
Orders
fact_orders
yes
no
yes
Refunds
fact_refunds
yes
yes
yes
Payments
fact_payments
yes
no
yes
Read it by column. The dim_customer column has three yes marks, so three stars must agree on what a customer is. That column needs one owner.
Bottom-up delivery
Delivery follows the matrix, one row at a time:
Pick one business process, and write its grain (what one row means).
List its dimensions in the matrix, then build its star.
Ship reports from that star.
Build the next star. Reuse the shared dimensions, and add only what is new.
The first report waits for one star, not for the whole warehouse. The cost is discipline. If one team changes dim_customer alone, every star that shares it changes too.
Watch out
A star built alone, with its own private customer table, will not match the other stars. Reports then show different revenue for the same country. Put every dimension in the bus matrix before you build the star.
04 · Method 2
Inmon: one big core first
⏱ 9 min · Topic 4 of 12
Bill Inmon’s method is top-down. You first build one enterprise data warehouse (EDW). It is a 3NF model of the whole company, and marts come after it.
Inmon describes this core as integrated and time-variant. Time-variant means it keeps history, with dates.
The shop in the core
Here are the first two EDW tables. The table edw_customer says only who the customer is. The country sits in its own history table, with dates.
edw_customer (5 rows)
customer_id
name
1
Asha
2
Ben
3
Carla
4
Dev
5
Omar
edw_customer_country (5 rows)
customer_id
country_code
valid_from
valid_to
1
IN
2026-01-01
2026-01-08
1
DE
2026-01-08
9999-12-31
2
GB
2026-01-01
9999-12-31
3
US
2026-01-01
9999-12-31
5
IN
2026-01-01
9999-12-31
Dev has no country, so Dev has no row in edw_customer_country. The orders table keeps only order facts:
edw_order (6 rows)
order_id
customer_id
order_date
status
amount
101
1
2026-01-03
paid
40.00
102
1
2026-01-10
paid
25.00
103
2
2026-01-11
refunded
60.00
104
3
2026-01-15
paid
15.50
105
3
2026-01-20
pending
NULL
106
4
2026-01-21
paid
80.00
A full EDW has more tables, such as products, order items and country names. Each piece of data lives in one place.
Marts come second
Analysts should not query the core. It needs many joins.
Instead you build dependent data marts from it. A dependent data mart is a star built from the EDW, not from the sources.
Every mart reads the same core, so the marts agree with each other. The cost is time. The first report waits until the core models the subjects it needs.
05 · Method 3
Data Vault: hubs, links, satellites
⏱ 12 min · Topic 5 of 12
Dan Linstedt created Data Vault. This chapter uses the Data Vault 2.0 ideas. Data Vault splits data by what each part does.
A business key is the id the business uses, such as customer_id 1. Data Vault has three table types:
A hub holds one row for each business key.
A link holds one row for each relationship between hubs, such as a customer placing an order.
A satellite holds the descriptive columns of a hub or link, and their history.
Every vault table also has a load_date and a record_source. The load_date is when the warehouse loaded the row. The record_source says which system sent it.
Look at the picture. The link joins two hubs. The satellite belongs to one hub.
Hubs, link and satellite
hub_customer
ColumnTypeKeys
customer_hkchar(32)PK
customer_idint
load_datedate
record_sourcetext
hub_order
ColumnTypeKeys
order_hkchar(32)PK
order_idint
load_datedate
record_sourcetext
link_order_customer
ColumnTypeKeys
order_hkchar(32)FK
customer_hkchar(32)FK
load_datedate
record_sourcetext
sat_customer_details
ColumnTypeKeys
customer_hkchar(32)PKFK
load_datedatePK
record_sourcetext
nametext
countrytextNULL
link_order_customer joins the two hubs. sat_customer_details holds the customer details.
Hub: the keys
A hub holds the business key and no details. A hash turns any text into a fixed-length code. The hub’s hash key (customer_hk) is a hash of the business key.
MD5 and SHA-1 are common choices. Two different keys can give the same hash, which is called a collision. A collision is very rare, but some teams pick a longer hash such as SHA-256 to lower the risk.
Here is the MD5 of the text of each customer_id, cut to 8 characters:
hub_customer (5 rows)
customer_hk
customer_id
load_date
record_source
c4ca4238…
1
2026-01-01
shop_db
c81e728d…
2
2026-01-01
shop_db
eccbc87e…
3
2026-01-01
shop_db
a87ff679…
4
2026-01-01
shop_db
e4da3b7f…
5
2026-01-01
shop_db
The hash comes from the key alone. A loader needs no lookup to compute it, so many loaders can run at the same time.
Link: the relationships
A link holds the hash keys of the hubs it joins. This one says which customer placed which order.
A real link also has its own hash key, left out here. Order hashes are written as words to keep the table short:
link_order_customer (6 rows)
order_hk
customer_hk
load_date
record_source
hash of 101
c4ca4238…
2026-01-03
shop_db
hash of 102
c4ca4238…
2026-01-10
shop_db
hash of 103
c81e728d…
2026-01-11
shop_db
hash of 104
eccbc87e…
2026-01-15
shop_db
hash of 105
eccbc87e…
2026-01-20
shop_db
hash of 106
a87ff679…
2026-01-21
shop_db
Satellite: the details
The satellite holds the details about a customer, such as name and country. This is the state on 2026-01-01, before Asha moves:
sat_customer_details (5 rows)
customer_hk
load_date
record_source
name
country
c4ca4238…
2026-01-01
shop_db
Asha
IN
c81e728d…
2026-01-01
shop_db
Ben
GB
eccbc87e…
2026-01-01
shop_db
Carla
US
a87ff679…
2026-01-01
shop_db
Dev
NULL
e4da3b7f…
2026-01-01
shop_db
Omar
IN
Insert only
In a Data Vault, loaders never update or delete a row. On 2026-01-08 the loader sees Asha in DE, so it inserts one new row:
Asha now has two satellite rows. The old IN row is untouched. There is no valid_to: the next load_date ends the old row.
Compare this with SCD Type 2. There you also set valid_to on the old row. Here nothing changes, so you can always prove what the warehouse knew on any day.
Watch out
The load_date is the day the row arrived, not always the day Asha moved. If the file arrives late, the two dates differ. Store the real move date in its own satellite column, such as moved_on, and use it for “at that time” questions.
06 · Method 3, continued
Raw vault, business vault, marts
⏱ 8 min · Topic 6 of 12
People rarely query the hubs, links and satellites directly. They need many joins. A Data Vault warehouse has three layers:
Raw vault: the data exactly as the sources sent it. No business rules.
Business vault: new tables that apply business rules on top of the raw vault.
Information marts: stars built on top. These are the tables people query.
The business vault also holds helper tables, such as point-in-time (PIT) and bridge tables. They make the joins that build the marts faster. The next chapter shows them.
A rule in the business vault
Suppose the business says a missing country means UNKNOWN. That is a rule, so it does not go in the raw vault. It goes in a business vault satellite:
bsat_customer_country (6 rows)
customer_hk
load_date
country_clean
c4ca4238…
2026-01-01
IN
c4ca4238…
2026-01-08
DE
c81e728d…
2026-01-01
GB
eccbc87e…
2026-01-01
US
a87ff679…
2026-01-01
UNKNOWN
e4da3b7f…
2026-01-01
IN
Dev is NULL in the raw vault and UNKNOWN here. If the rule changes, you add new business vault rows. The raw vault keeps what the source said.
Build a mart on top
After the insert, the satellite has six rows. An information mart turns it into a dimension.
Each load_date becomes valid_from. LEAD reads a value from the next row, so the next load_date becomes valid_to:
A customer dimension from the satelliteworked example
It has the same rows and dates as dim_customer in the Kimball section, without customer_key and customer_id. It reads the raw satellite, so Dev stays NULL. Read bsat_customer_country to get UNKNOWN.
07 · Compare
Ask the same question
⏱ 12 min · Topic 7 of 12
The question is: paid revenue by country, using the country at order time. Check it by hand first:
Order 101 on 2026-01-03: Asha was in IN, so IN gets 40.00.
Order 102 on 2026-01-10: Asha had moved to DE, so DE gets 25.00.
Order 104: Carla is in US, so US gets 15.50.
Order 106: Dev has no country, so NULL gets 80.00.
Order 103 is refunded and order 105 is pending, so neither counts. IN is 40.00, not 65.00, because Asha’s second order belongs to DE.
Kimball: join the star
The fact row already points at the right customer version. One join is enough:
Same four rows. LEFT JOIN keeps order 106, because Dev has no country row. A plain JOIN would drop Dev’s 80.00.
In practice analysts query the mart built from the EDW. Its query looks like the star query above.
Data Vault: build the ranges first
The amounts sit in a satellite on the order hub. Assume each order was loaded on its order date:
sat_order_details (6 rows)
order_hk
load_date
status
amount
order_date
hash of 101
2026-01-03
paid
40.00
2026-01-03
hash of 102
2026-01-10
paid
25.00
2026-01-10
hash of 103
2026-01-11
refunded
60.00
2026-01-11
hash of 104
2026-01-15
paid
15.50
2026-01-15
hash of 105
2026-01-20
pending
NULL
2026-01-20
hash of 106
2026-01-21
paid
80.00
2026-01-21
Here each order has one satellite row. A real order satellite can have two, such as paid and then refunded. Then you first keep only the latest row per order.
Querying the vault directly takes three steps. Build the date ranges, follow the link, then join by date:
Same four rows here, with the most steps. An information mart does these steps once, so people can run the short star query.
All three models give the same answer here. The vault gets DE for order 102 only because the move was loaded on 2026-01-08, the day it happened.
If the file had come on 2026-01-12, order 102 would count under IN, and IN would show 65.00. Building the ranges from moved_on, not load_date, avoids this. A Kimball load has the same risk if the fact row is loaded before the move.
The models differ in where the at-order-time work happens:
Kimball: once, at load time, when the fact row picks its customer key.
Inmon core: at query time, in the date join. A mart can do it once.
Data Vault: at query time, or once in the mart build.
08 · Compare
Compare the three
⏱ 6 min · Topic 8 of 12
Each row is a question you can ask about a method. Here are the five that matter most:
Three methods, five questions
Question
Kimball
Inmon
Data Vault
Time to first value
Fast. One star is enough for the first report.
Slow. The core comes before the first mart.
In between. Load the vault, then build a mart.
Cost of change
Medium. A shared dimension change touches every star that uses it.
Medium. Change the core, then update the marts.
Low. A new column goes in a new satellite, and nothing old changes.
Auditability (can you prove past data?)
Only as good as the history you keep (for example SCD Type 2).
Good. One integrated core with dates.
Strongest. Insert-only, with load_date and record_source on every row.
Query complexity
Lowest. Stars are the query layer.
High on the core. Low on the marts.
Highest on the vault. Low on the marts.
Team size
A small team can start.
Needs a central modeling team.
Usually pays off with many sources and many engineers.
A source adds a column
One example makes the cost of change clear. The source adds a column, loyalty_tier, to customers. Here is what you touch:
Source adds loyalty_tier
Method
What you change
What stays the same
Kimball
Add the column to dim_customer. Choose an SCD type for it.
Fact tables, if the grain is the same
Inmon
Add it to the core, then to each mart that needs it.
Marts that do not need it
Data Vault
Add a new satellite for the new column.
Every existing hub, link and satellite
The vault is cheapest to change. It also has the most tables to build and read. That is the price.
Watch out
A common mistake is to compare only the first month. Compare the cost when the third source arrives, too.
09 · Decide
When each one fits
⏱ 4 min · Topic 9 of 12
Match the method to the situation. Here are four common ones:
Situation and a good fit
Situation
Good fit
Why
A small team, few stable sources, reports needed soon
Kimball
One star ships fast, and a small team can keep it consistent.
One company-wide model, a strong central data team, a long program
Inmon
The core fixes definitions once, and every mart reads it.
Many changing sources, strict audit, many engineers
Data Vault
Insert-only loads and new satellites absorb change and keep proof.
A regulated company that must prove what it knew on any day
Inmon or Data Vault
Both keep dated history. Data Vault also keeps every source row unchanged.
The reverse cases matter too. Inmon is a poor fit when the business needs results in weeks. Data Vault is a poor fit for a small, stable, single-source warehouse.
Watch out
Do not pick a method because it is famous. Write down which row of the table above decided it, and why.
10 · Decide
Hybrids and your answer
⏱ 8 min · Topic 10 of 12
Most real warehouses mix methods. Most teams serve stars to analysts. So the open choice is what sits under the stars.
Vault core, Kimball marts
A common mix has four steps. Each step feeds the next:
Sources send data.
The raw vault stores it, insert-only.
The business vault applies the rules.
Kimball stars serve the reports.
The vault takes new sources easily and keeps every source row. The stars are easy to query. Inmon’s own plan also ends in marts, and those marts are often stars.
Medallion layers, loosely
Many modern platforms use medallion layers: bronze, silver and gold. They describe how clean the data is, not how the tables are shaped. So the match is loose:
Medallion and the three methods
Layer
Closest match
Why it is loose
Bronze: raw copies of sources
A staging area, sometimes the raw vault
Bronze says nothing about hubs or satellites. Many teams put the whole vault in silver.
Silver: cleaned and joined
Business vault, or the Inmon core
Silver can be any shape that is clean.
Gold: ready for reports
Kimball stars, or information marts
Gold is often a star, but not always.
The chapter Modern Warehouse Modeling covers medallion layers in full.
What to say in an interview
Interview question: why Kimball and not Inmon or Data Vault?
I serve Kimball stars to the business either way. Here the team is small, there are two stable sources and no audit rule, so stars alone are enough. If sources grow or an audit rule arrives, I add a Data Vault layer under the stars.
11 · Practice
Practice lab
⏱ 3 min · Topic 11 of 12
Each exercise opens a canvas for an entity-relationship diagram (ERD). You draw the tables, and the review checks them against sample rows.
Start at the top. The last two are harder, so they are optional.
You met Data Vault as one of three architectures. It handles many changing sources and strict audit, so it gets its own chapter.
⏱ 3 min · Topic 12 of 12
Next chapter
Data Vault 2.0
You met Data Vault as one of three architectures. It handles many changing sources and strict audit, so it gets its own chapter.
The next chapter goes deeper into hubs, links and satellites, hash keys, and parallel insert-only loads. It also shows how the raw vault and business vault feed stars.