Track 03 · Data Modelling

Data Modelling

The discipline of defining the structure, semantics, relationships and constraints of data so it maps accurately to business reality. Good models are the difference between data that answers questions in seconds and data no one trusts. It is the shared blueprint every team reads from.

Read time ~22 min Level Foundational → Advanced For Modellers, Engineers, Architects

What you'll be able to do

Learning outcomes for this track

  • Move a model from conceptual to logical to physical with intent
  • Normalise to 2NF and 3NF and know when to denormalise
  • Build facts, dimensions and bridge tables with the right grain
  • Choose between Kimball, Inmon and Data Vault for a use case
  • Build tested, version-controlled models in dbt on a medallion lakehouse
  • Plan a career path and self-assess against a skill matrix

01 What it is

Three levels: conceptual, logical, physical

Definition

Data modelling is the practice of defining the structure, relationships and constraints of data so it maps accurately to business reality — expressed at three levels of increasing detail.

A conceptual model captures business entities and relationships with no technology in sight. A logical model adds attributes, keys and normalisation while staying platform-agnostic. A physical model realises it as tables, columns, data types and indexes for a specific engine. Modelling matters for data quality and consistency, query performance, governance, and — above all — a shared "single source of truth" understanding across teams.

02 Core concepts

The grammar of models

  • Entity, attribute, relationshipa thing, its properties, and how things associate.
  • Cardinalitythe numeric ratio of a relationship: 1:1, 1:N, M:N.
  • Keysprimary (unique row ID), foreign (a reference), surrogate (system-generated), natural/business key.
  • Normalisation1NF atomic values, 2NF no partial dependency, 3NF no transitive dependency, BCNF stricter still.
  • Denormalisationdeliberate redundancy traded for read speed.
  • ERDthe entity-relationship diagram; the visual blueprint.
  • Grainthe level of detail one fact row represents — decide it first, always.
  • Facts & dimensionsmeasurable events, and the descriptive context around them.

03 Approaches

Pick the technique for the job

There is no one true model — there are techniques, each strong for a purpose. Know when to reach for each.

Relational / 3NF (Codd)

Normalised, redundancy-free. Best for transactional OLTP systems where writes dominate.

Dimensional (Kimball)

Star and snowflake schemas — facts, dimensions and SCDs. The default for BI and analytics marts.

Data Vault 2.0 (Linstedt)

Hubs, links and satellites. Auditable, agile enterprise integration built for history and change.

Inmon (CIF)

Top-down, 3NF enterprise warehouse feeding downstream marts. For governed, integrated EDWs.

One Big Table / wide

Flattened, denormalised tables. Fast analytics in columnar warehouses.

Anchor modelling

Highly normalised and temporal — schema-evolution-friendly for high-change domains.

Document / NoSQL

Aggregate- and access-pattern-driven. For flexible, high-scale applications.

Graph

Nodes and edges. For relationship-heavy queries: fraud, networks, recommendations.

04 Worked examples

Normal forms, facts, dimensions & bridges — by example

The fastest way to internalise modelling is to watch one messy table get fixed. We take a single orders dataset from unnormalised, through 2NF and 3NF, then reshape it into a star schema — building the dimensions, the fact and a bridge table for a many-to-many — and finally as a Data Vault.

Second Normal Form (2NF)

Rule: be in 1NF, and every non-key column must depend on the whole composite key — no partial dependencies.

Violates 2NFComposite key (order_id, product_id) — but product_name and unit_price depend on product_id alone.
order_items
order_idproduct_idproduct_nameunit_priceqty
1001P9Widget12.502
1001P7Gasket3.205
1002P9Widget12.501

Partial dependency: the product name and price depend on only half the key, so "Widget / 12.50" repeats on every line — an update anomaly waiting to happen.

split the product out
2NFProduct attributes live once.
products
product_idproduct_nameunit_price
P9Widget12.50
P7Gasket3.20
2NFOnly what depends on the full key.
order_items
order_idproduct_idqty
1001P92
1001P75
1002P91

Third Normal Form (3NF)

Rule: be in 2NF, and no non-key column may depend on another non-key column — no transitive dependencies.

Violates 3NFcustomer_name and region depend on customer_id — a non-key column.
orders
order_idcustomer_idcustomer_nameregionorder_date
1001C1AcmeWest2026-02-03
1002C1AcmeWest2026-02-05
1003C2GlobexEast2026-02-06

Transitive dependency: order_id → customer_id → region. Rename Acme in one row and the data contradicts itself.

move customer facts to their own table
3NFCustomer described once.
customers
customer_idcustomer_nameregion
C1AcmeWest
C2GlobexEast
3NFOrders reference the customer.
orders
order_idcustomer_idorder_date
1001C12026-02-03
1002C12026-02-05
1003C22026-02-06

Building dimensions and a fact (the star)

Analytics flips the goal: instead of removing all redundancy, you denormalise descriptive data into dimensions and keep measures in a fact at one declared grain. Dimensions get a surrogate key and carry their attributes right on the row.

dimensions.sqlDimension tables
-- A dimension DESCRIBES: denormalised, surrogate key, SCD-ready
create table dim_product (
  product_sk   bigint primary key,  -- surrogate: stable & meaningless
  product_id   varchar,              -- natural/business key
  product_name varchar,
  category     varchar,              -- denormalised attribute
  valid_from   date, valid_to date,  -- SCD Type 2 window
  is_current   boolean
);
create table dim_date  ( date_sk int primary key, full_date date, month varchar, quarter varchar );
create table dim_store ( store_sk int primary key, store_name varchar, region varchar );
fact.sqlFact table
-- A fact MEASURES: foreign keys + additive measures at ONE grain
create table fct_sales (
  sales_sk    bigint primary key,
  date_sk     int    references dim_date(date_sk),
  product_sk  bigint references dim_product(product_sk),
  store_sk    int    references dim_store(store_sk),
  quantity    int,             -- additive measure
  net_amount  numeric(12,2)     -- additive measure
);  -- GRAIN: exactly one row per order line
DimensionDescribes — category lives on the row.
dim_product
product_skproduct_idproduct_namecategory
101P9WidgetHardware
102P7GasketSeals
FactMeasures — keys plus additive numbers.
fct_sales
sales_skdate_skproduct_skqtynet_amount
120260203101225.00
220260203102516.00
query.sqlStar join
-- "Revenue by category in Q1" — the classic star join
select p.category, sum(f.net_amount) as revenue
from fct_sales f
join dim_product p on p.product_sk = f.product_sk
join dim_date    d on d.date_sk    = f.date_sk
where d.quarter = 'Q1'
group by p.category;

Bridge tables for many-to-many

What if a sale is credited to several sales reps? You can't add multiple reps to a fact row without breaking its grain and double-counting revenue. A bridge table resolves the many-to-many with an allocation factor that sums to 1.0 per group.

bridge.sqlBridge table
-- The fact points at a GROUP, not a single rep, to keep its grain
alter table fct_sales add credit_group_sk bigint;

create table dim_sales_rep ( rep_sk bigint primary key, rep_name varchar );

create table bridge_sales_credit (
  credit_group_sk bigint,                 -- group the fact references
  rep_sk          bigint references dim_sales_rep(rep_sk),
  allocation      numeric(4,3),           -- weight; sums to 1.0 per group
  primary key (credit_group_sk, rep_sk)
);
DimensionThe reps.
dim_sales_rep
rep_skrep_name
201Dana
202Ravi
BridgeGroup 900 is split 50/50; group 901 is all Dana.
bridge_sales_credit
credit_group_skrep_skallocation
9002010.5
9002020.5
9012011.0
credited_revenue.sqlBridge query
-- Multiply the measure by allocation so nothing is double-counted
select r.rep_name, sum(f.net_amount * b.allocation) as credited_revenue
from fct_sales f
join bridge_sales_credit b on b.credit_group_sk = f.credit_group_sk
join dim_sales_rep      r on r.rep_sk = b.rep_sk
group by r.rep_name;
-- Sale 1 ($25, group 900) -> Dana $12.50, Ravi $12.50; sale 2 ($16, group 901) -> Dana $16

The same pattern handles any many-to-many: an account with several owners, a patient with multiple diagnoses, a product in several categories. The bridge holds the relationship; the allocation factor keeps sums honest.

The same data as a Data Vault

Data Vault splits everything into three parts: hubs (immutable business keys), satellites (descriptive context, fully historised) and links (relationships between hubs). It trades query simplicity for auditability and painless change.

HubJust the business key + a hash.
hub_customer
customer_hkcustomer_bkload_ts
a1f3…C12026-02-03
b7e2…C22026-02-03
SatelliteHistory — Acme's region change adds a dated row.
sat_customer
customer_hkload_tscustomer_nameregion
a1f3…2026-02-03AcmeWest
a1f3…2026-05-01AcmeCentral
LinkA relationship between hubs — here, an order line joining a customer and a product.
link_order_line
order_line_hkcustomer_hkproduct_hkload_ts
7ff0…a1f3…c901…2026-02-03
9ab2…b7e2…c901…2026-02-06

Why bother? Acme changing region never rewrites a row — it appends a dated one. Add a new source and you add hubs/links, never restructure. That is the audit-and-agility trade Data Vault is built for.

05 Key personas

Who models data

DM

Data Modeller

Designs conceptual through physical models and standards.

ERDStandards
DA

Data Architect

Owns enterprise data strategy, platforms and integration.

Strategy
AE

Analytics Engineer

Builds dbt transformation models and marts.

dbtSQL
DB

Database Administrator

Owns physical performance, indexing and availability.

Tuning
DE

Data Engineer

Builds the pipelines and ELT that feed the models.

Pipelines
BA

Business Analyst

Translates requirements into entities, relationships and metrics.

Requirements
SME

Domain SME

Validates business meaning and rules in model reviews.

Validation
DG

Governance Lead

Ensures models honour standards, naming and data contracts.

Contracts

06 Methodology

From requirement to physical table

01

Gather requirements

Capture the business questions and processes the data must support.

02

Conceptual model

Draw entities and relationships — no technology, just meaning.

03

Logical model

Add attributes, keys and normalisation; choose a surrogate-key strategy.

04

Choose technique

3NF, dimensional or Data Vault — and define the grain of every fact.

05

Physical design

Realise tables, types, indexes and partitioning for the target engine.

06

Document & evolve

Data dictionary, lineage, SME review, then version and evolve in Git.

07 Best practices

What good looks like

Define grain firstNail what one fact row means before anything else — everything follows from it.
Consistent namingOne convention across the estate; names are the cheapest documentation.
Surrogate keys for dimsSystem-generated keys for dimensions; keep natural keys as attributes.
Model for the questionDesign for real use cases, not speculative future ones.
Version models as codeTrack models in Git with tests and CI/CD, like any software artifact.
Pick an SCD strategyDecide Type 1 vs Type 2 per dimension; avoid over-normalising analytics layers.

09 In practice

Why the model is a business asset

A good model is the difference between data that answers questions in seconds and data no one trusts. Here's how enterprises apply it, what the analysts and platforms are doing, and how SCIKIQ delivers it.

Single source of truth

Conformed dimensions and governed entities give every team one agreed definition of customer, product and revenue.

Fast, consistent BI

Star schemas deliver low-latency, predictable analytics that non-experts can query.

Self-service analytics

A clean gold layer lets business users explore safely without pipeline engineering.

Regulatory & financial reporting

Auditable lineage and historised models (Data Vault satellites) support SOX, BCBS 239 and IFRS traceability.

Scalable lakehouse

Medallion (bronze/silver/gold) structures raw-to-curated flow so the platform grows without re-architecture.

ML features & efficiency

Well-modelled silver/gold tables feed feature stores and cut compute by removing redundant joins.

What the leaders are doing

The lakehouse has become the model's home, and open formats keep it portable — here's the signal from the standard, the analysts and the platforms.

DADAMAStandard · DMBOK

DMBOK2 makes Data Modelling & Design a core knowledge area — the standard reference for conceptual, logical and physical models and notation.

GGartnerAnalyst

Its Magic Quadrant for Cloud DBMS and the concepts of data fabric and the logical data warehouse frame modelling across warehouses, lakes and lakehouses.

FForresterAnalyst

Declared "the data lakehouse is the new data warehouse"; its Data Lakehouses and DMA Platforms Waves track how vendors automate modelling and governance.

MMcKinseyAdvisory

Its data-architecture research warns that modelling tech-debt slows delivery, and that the right archetype can roughly halve implementation time.

AAccentureAdvisory

Its Data Modernization services and Intelligent Data Foundation accelerate lakehouse and warehouse redesign and at-scale migration.

DDatabricksPlatform

Owns the medallion architecture narrative and publishes Data Vault-on-lakehouse guidance; Delta Lake + Unity Catalog is the governed model home.

How SCIKIQ helps

SCIKIQ lets you model once and run anywhere. Design conceptual-to-physical models on a unified fabric — governed, portable and free of engine lock-in.

  • Model once, materialise across engines without rewrites.
  • Open formats (Delta, Iceberg) keep models portable across clouds.
  • Governed by default — active metadata and lineage travel with the model.
  • Native medallion, dimensional and Data Vault support in one place.
  • Model, semantics and governance unified for consistent self-service.

10 Developer lab

Hands-on: build a real mart

Engineer track

Do it
  1. Design a star schema for a retail sales mart — fact plus date, product, store, customer dims.
  2. Build an SCD Type 2 dimension using dbt snapshots.
  3. Model a Data Vault hub, link and satellite set.
  4. Normalise to 3NF, then denormalise into a reporting table.
  5. Draw an ERD and implement dbt tests (unique, not_null, relationships).
-- Star schema: grain = one row per order line
create table fct_sales (
  sales_sk    bigint,   -- surrogate key
  date_sk     int,      -- FK -> dim_date
  product_sk  int,      -- FK -> dim_product
  store_sk    int,      -- FK -> dim_store
  quantity    int,
  net_amount  numeric(12,2)  -- additive fact
);

Skills you build

Outcome
  1. Designing a star schema at the right grain.
  2. Implementing slowly changing dimensions.
  3. Building an auditable Data Vault.
  4. Trading normalisation for read speed deliberately.
  5. Enforcing model integrity with tests in CI.

Reference implementation

three techniques, side by side
snapshots/dim_customer.sqldbt · SCD Type 2
-- Track history: a new row whenever a tracked column changes
{% snapshot dim_customer_snapshot %}
{{ config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='check',
    check_cols=['tier', 'region']
) }}
select customer_id, name, tier, region
from {{ source('crm', 'customers') }}
{% endsnapshot %}
data_vault.sqlData Vault 2.0
-- Hub: the immutable business key
create table hub_customer (
  customer_hk   binary,      -- hash of the business key
  customer_bk   varchar,     -- the business key itself
  load_ts       timestamp,   record_source varchar
);
-- Satellite: descriptive context, fully historised
create table sat_customer (
  customer_hk   binary,   load_ts timestamp,
  hash_diff     binary,   -- change detection
  name          varchar,  tier varchar
);
-- Link: a relationship between hubs
create table link_order (
  order_hk binary, customer_hk binary, product_hk binary, load_ts timestamp
);
star_schema.dbmlDBML · renders an ERD
// Paste into dbdiagram.io to see the star render as a diagram
Table fct_sales {
  sales_sk   bigint [pk]
  date_sk    int    [ref: > dim_date.date_sk]
  product_sk int    [ref: > dim_product.product_sk]
  store_sk   int    [ref: > dim_store.store_sk]
  net_amount decimal
}
Table dim_date    { date_sk int [pk]  full_date date  month int }
Table dim_product { product_sk int [pk]  sku varchar  category varchar }
Table dim_store   { store_sk int [pk]  name varchar  region varchar }

Same customer, three lenses: a Kimball SCD2 dimension for history, a Data Vault trio for auditable integration, and a DBML star you can paste into dbdiagram.io to see the ERD instantly.

11 Analyst lab

Hands-on: model the business first

Analyst track

Do it
  1. Build a conceptual ERD from written business requirements.
  2. Extract entities and relationships from a business process.
  3. Create a data dictionary — terms, definitions, owners.
  4. Define fact grain and KPIs for a subject area.
  5. Validate the model in a walkthrough with SMEs.

Deliverables

Outcome
  1. A conceptual ERD the business signs off.
  2. An entity/relationship catalogue for the process.
  3. A living data dictionary.
  4. A grain and KPI definition ready for engineering.
  5. A reviewed model with SME approval logged.

12 Career path

From analyst to enterprise architect

Modelling skill compounds into architecture. Bands are indicative US figures and vary by market and sector.

01
Data Analyst / Junior EngineerEntry
SQL, reads and extends existing models and ERDs.
~$75–100k
02
Data Modeller / Analytics EngineerPractitioner
Dimensional design, dbt, normalisation and SCDs.
~$95–142k
03
Senior Data ModellerSenior
Data Vault, conformed dimensions, performance and standards.
~$130–160k
04
Data ArchitectLeadership
Enterprise architecture, integration and governance strategy.
~$139–232k
05
Principal / Enterprise ArchitectExecutive
Estate-wide standards, platform strategy and technical vision.
$200k+

13 Skill matrix

Rate yourself, then level up

Find your current row and aim one column right.

SkillBeginnerIntermediateAdvanced
SQLSELECT and JOIN.Window functions and CTEs.Optimisation and execution plans.
Dimensional modellingReads a star schema.Designs facts, dims and SCDs.Conformed dimensions, bus matrix, bridge tables.
ERD / notationReads an ERD.Draws conceptual and logical ERDs.Sets modelling standards and patterns.
NormalisationKnows 1NF–3NF.Applies and denormalises with reason.Balances OLTP and analytics trade-offs.
Data VaultUnderstands hubs/links/sats.Builds a vault on a project.Designs vault-on-lakehouse at scale.
dbtRuns models and tests.Builds staged, tested models.Macros, contracts and CI/CD.
Performance tuningAdds an index.Partitions and clusters tables.Diagnoses and rewrites slow workloads.
Domain knowledgeLearns the subject area.Models a domain end to end.Aligns models to enterprise strategy.

14 Glossary

Terms worth knowing

Grain
The level of detail one fact row represents.
Fact
A measurable, usually numeric, business event.
Dimension
Descriptive context that surrounds a fact.
Bridge table
Resolves a many-to-many with an allocation factor.
SCD
Slowly changing dimension — Type 1 overwrite, Type 2 history.
Surrogate key
A system-generated, meaningless unique ID.
Normalisation
Removing redundancy via dependency rules.
Cardinality
The numeric ratio of a relationship.
Star schema
A central fact surrounded by denormalised dimensions.
Hub
A Data Vault table of business keys.
Satellite
A Data Vault table of descriptive, historical context.
Medallion
Bronze / Silver / Gold layering on the lakehouse.

15 Test yourself

Check your understanding

Four quick questions — instant feedback, nothing saved, no sign-up.

Q1In dimensional modelling, what should you decide first for every fact table?

Grain first — everything follows from it. Decide exactly what one row means before choosing keys, dimensions or measures.

Q2A Data Vault is built from which three constructs?

Hubs (business keys), links (relationships), satellites (context/history). Bronze/silver/gold is the medallion architecture, a different idea.

Q3How does a bridge table avoid double-counting a sale credited to two reps?

The allocation factor keeps sums honest. $25 split 50/50 credits $12.50 to each rep — the total still ties back to $25.

Q4In the medallion architecture, the "gold" layer is…

Bronze raw → silver cleansed → gold business-ready. Gold is what dashboards and models consume.