Relational / 3NF (Codd)
Normalised, redundancy-free. Best for transactional OLTP systems where writes dominate.
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.
Learning outcomes for this track
01 What it is
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
03 Approaches
There is no one true model — there are techniques, each strong for a purpose. Know when to reach for each.
Normalised, redundancy-free. Best for transactional OLTP systems where writes dominate.
Star and snowflake schemas — facts, dimensions and SCDs. The default for BI and analytics marts.
Hubs, links and satellites. Auditable, agile enterprise integration built for history and change.
Top-down, 3NF enterprise warehouse feeding downstream marts. For governed, integrated EDWs.
Flattened, denormalised tables. Fast analytics in columnar warehouses.
Highly normalised and temporal — schema-evolution-friendly for high-change domains.
Aggregate- and access-pattern-driven. For flexible, high-scale applications.
Nodes and edges. For relationship-heavy queries: fraud, networks, recommendations.
04 Worked examples
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.
Rule: be in 1NF, and every non-key column must depend on the whole composite key — no partial dependencies.
| order_id | product_id | product_name | unit_price | qty |
|---|---|---|---|---|
| 1001 | P9 | Widget | 12.50 | 2 |
| 1001 | P7 | Gasket | 3.20 | 5 |
| 1002 | P9 | Widget | 12.50 | 1 |
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.
| product_id | product_name | unit_price |
|---|---|---|
| P9 | Widget | 12.50 |
| P7 | Gasket | 3.20 |
| order_id | product_id | qty |
|---|---|---|
| 1001 | P9 | 2 |
| 1001 | P7 | 5 |
| 1002 | P9 | 1 |
Rule: be in 2NF, and no non-key column may depend on another non-key column — no transitive dependencies.
| order_id | customer_id | customer_name | region | order_date |
|---|---|---|---|---|
| 1001 | C1 | Acme | West | 2026-02-03 |
| 1002 | C1 | Acme | West | 2026-02-05 |
| 1003 | C2 | Globex | East | 2026-02-06 |
Transitive dependency: order_id → customer_id → region. Rename Acme in one row and the data contradicts itself.
| customer_id | customer_name | region |
|---|---|---|
| C1 | Acme | West |
| C2 | Globex | East |
| order_id | customer_id | order_date |
|---|---|---|
| 1001 | C1 | 2026-02-03 |
| 1002 | C1 | 2026-02-05 |
| 1003 | C2 | 2026-02-06 |
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.
-- 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 );
-- 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
| product_sk | product_id | product_name | category |
|---|---|---|---|
| 101 | P9 | Widget | Hardware |
| 102 | P7 | Gasket | Seals |
| sales_sk | date_sk | product_sk | qty | net_amount |
|---|---|---|---|---|
| 1 | 20260203 | 101 | 2 | 25.00 |
| 2 | 20260203 | 102 | 5 | 16.00 |
-- "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;
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.
-- 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) );
| rep_sk | rep_name |
|---|---|
| 201 | Dana |
| 202 | Ravi |
| credit_group_sk | rep_sk | allocation |
|---|---|---|
| 900 | 201 | 0.5 |
| 900 | 202 | 0.5 |
| 901 | 201 | 1.0 |
-- 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.
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.
| customer_hk | customer_bk | load_ts |
|---|---|---|
| a1f3… | C1 | 2026-02-03 |
| b7e2… | C2 | 2026-02-03 |
| customer_hk | load_ts | customer_name | region |
|---|---|---|---|
| a1f3… | 2026-02-03 | Acme | West |
| a1f3… | 2026-05-01 | Acme | Central |
| order_line_hk | customer_hk | product_hk | load_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
Designs conceptual through physical models and standards.
Owns enterprise data strategy, platforms and integration.
Builds dbt transformation models and marts.
Owns physical performance, indexing and availability.
Builds the pipelines and ELT that feed the models.
Translates requirements into entities, relationships and metrics.
Validates business meaning and rules in model reviews.
Ensures models honour standards, naming and data contracts.
06 Methodology
Capture the business questions and processes the data must support.
Draw entities and relationships — no technology, just meaning.
Add attributes, keys and normalisation; choose a surrogate-key strategy.
3NF, dimensional or Data Vault — and define the grain of every fact.
Realise tables, types, indexes and partitioning for the target engine.
Data dictionary, lineage, SME review, then version and evolve in Git.
07 Best practices
08 2026 trends
↻ Refreshed 2026-07-16 by the AI desk
Graph neural networks are increasingly being adopted for complex data relationships in enterprise applications.
Automation tools for data preparation and transformation are streamlining data modeling processes and reducing manual effort.
The data mesh approach is gaining traction as organizations decentralize data ownership and promote domain-oriented data management.
There is a growing emphasis on explainability in AI models, leading to the establishment of industry standards for transparency.
Real-time data processing frameworks are essential for enterprises to make timely decisions based on live data streams.
Federated learning is becoming popular for training models across decentralized data sources while ensuring privacy and compliance.
Data fabric technologies are being implemented to unify data management across hybrid and multi-cloud environments.
No-code platforms for data modeling are empowering non-technical users to create and modify data models without programming skills.
Synthetic data generation techniques are being utilized to enhance model training while mitigating privacy concerns.
09 In practice
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.
Conformed dimensions and governed entities give every team one agreed definition of customer, product and revenue.
Star schemas deliver low-latency, predictable analytics that non-experts can query.
A clean gold layer lets business users explore safely without pipeline engineering.
Auditable lineage and historised models (Data Vault satellites) support SOX, BCBS 239 and IFRS traceability.
Medallion (bronze/silver/gold) structures raw-to-curated flow so the platform grows without re-architecture.
Well-modelled silver/gold tables feed feature stores and cut compute by removing redundant joins.
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.
DMBOK2 makes Data Modelling & Design a core knowledge area — the standard reference for conceptual, logical and physical models and notation.
Its Magic Quadrant for Cloud DBMS and the concepts of data fabric and the logical data warehouse frame modelling across warehouses, lakes and lakehouses.
Declared "the data lakehouse is the new data warehouse"; its Data Lakehouses and DMA Platforms Waves track how vendors automate modelling and governance.
Its data-architecture research warns that modelling tech-debt slows delivery, and that the right archetype can roughly halve implementation time.
Its Data Modernization services and Intelligent Data Foundation accelerate lakehouse and warehouse redesign and at-scale migration.
Owns the medallion architecture narrative and publishes Data Vault-on-lakehouse guidance; Delta Lake + Unity Catalog is the governed model home.
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.
10 Developer lab
-- 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 );
-- 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 %}
-- 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 );
// 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
12 Career path
Modelling skill compounds into architecture. Bands are indicative US figures and vary by market and sector.
13 Skill matrix
Find your current row and aim one column right.
| Skill | Beginner | Intermediate | Advanced |
|---|---|---|---|
| SQL | SELECT and JOIN. | Window functions and CTEs. | Optimisation and execution plans. |
| Dimensional modelling | Reads a star schema. | Designs facts, dims and SCDs. | Conformed dimensions, bus matrix, bridge tables. |
| ERD / notation | Reads an ERD. | Draws conceptual and logical ERDs. | Sets modelling standards and patterns. |
| Normalisation | Knows 1NF–3NF. | Applies and denormalises with reason. | Balances OLTP and analytics trade-offs. |
| Data Vault | Understands hubs/links/sats. | Builds a vault on a project. | Designs vault-on-lakehouse at scale. |
| dbt | Runs models and tests. | Builds staged, tested models. | Macros, contracts and CI/CD. |
| Performance tuning | Adds an index. | Partitions and clusters tables. | Diagnoses and rewrites slow workloads. |
| Domain knowledge | Learns the subject area. | Models a domain end to end. | Aligns models to enterprise strategy. |
14 Glossary
15 Test yourself
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.
16 Keep learning
Models need clean data flowing in and shared meaning on top. Continue the path:
Model once, run anywhere with SCIKIQ
Design, govern and deploy models across a unified data fabric — no engine lock-in.