SCD vs Data Vault Satellites: Welke Historisering Kies Jij?

Gepubliceerd: 19 april 2026
Leestijd: 13 minuten
Data Warehousing, Data Vault, Dimensioneel Modelleren

Twee dominante methoden voor het opslaan van historische data: Kimball's SCD-typen en Data Vault Satellites. In deze blog vergelijken we beide patronen op structuur, flexibiliteit, performance en praktische toepasbaarheid.

Twee Scholen, Eén Probleem

Elke organisatie die serieus met data werkt, stuit op dezelfde uitdaging: hoe bewaar je de historie van veranderende gegevens? Een klant verhuist, een product krijgt een nieuwe prijs, een medewerker wisselt van afdeling. De data van gisteren is anders dan vandaag — en je wilt beiden bewaren.

Er zijn twee dominante methoden die dit probleem aanpakken, elk met een fundamenteel andere filosofie:

Kimball — SCD

Slowly Changing Dimensions. Historisering binnen de dimensietabel zelf. Focus op business-leesbare stermodellen met feit- en dimensietabellen.

Data Vault — Satellites

Historisering in aparte Satellite-tabellen rondom Hubs en Links. Focus op flexibiliteit, auditeerbaarheid en het scheiden van structuur en context.

Vergelijking SCD (Kimball) vs Data Vault Satellites: structuur, historisering en toepasbaarheid

Herhaling: Wat is SCD?

Slowly Changing Dimensions komen uit de Kimball-methodologie en beschrijven hoe je veranderingen in dimensietabellen opslaat. Het meest gebruikte type is SCD Type 2: bij elke wijziging wordt een nieuwe rij aangemaakt met geldigheidsperiodes.

-- SCD Type 2: Klant dimensietabel met historische rijen
SELECT * FROM dim_klant WHERE klant_id = 1001;

| klant_sk | klant_id | naam          | stad      | geldig_van | geldig_tot | is_actueel |
|----------|----------|---------------|-----------|------------|------------|------------|
| 101      | 1001     | Jan de Vries  | Amsterdam | 2024-01-15 | 2026-03-31 | FALSE      |
| 102      | 1001     | Jan de Vries  | Rotterdam | 2026-04-01 | 9999-12-31 | TRUE       |

Alles zit in één tabel: de business key, alle beschrijvende attributen, en de geldigheidsperiodes. De feitentabel verwijst via een surrogate key (klant_sk) naar de juiste versie. Lees voor alle details onze complete gids over de 7 SCD-typen.

Wat zijn Data Vault Satellites?

In Data Vault 2.0 wordt het datamodel opgebouwd uit drie bouwblokken: Hubs, Links en Satellites. De historisering zit volledig in de Satellites.

De drie bouwblokken van Data Vault

  • Hub — bevat de unieke business keys (bijv. klant_id). Geen beschrijvende attributen, geen historie. Eén rij per unieke entiteit.
  • Link — legt relaties vast tussen Hubs (bijv. klant-bestelling). Geen beschrijvende attributen.
  • Satellite — bevat alle beschrijvende attributen en hun volledige historie. Gekoppeld aan een Hub of Link.
-- Hub: alleen de business key
CREATE TABLE hub_klant (
    hub_klant_hk    CHAR(32) PRIMARY KEY,  -- Hash key van klant_id
    klant_id        INT NOT NULL,
    load_date       TIMESTAMP NOT NULL,
    record_source   VARCHAR(50) NOT NULL
);

-- Satellite: beschrijvende attributen + historie
CREATE TABLE sat_klant_adres (
    hub_klant_hk    CHAR(32) NOT NULL,
    load_date       TIMESTAMP NOT NULL,
    load_end_date   TIMESTAMP,
    record_source   VARCHAR(50),
    straat          VARCHAR(200),
    stad            VARCHAR(100),
    postcode        VARCHAR(10),
    land            VARCHAR(50),
    hash_diff       CHAR(32),              -- Hash van alle attributen (change detection)
    PRIMARY KEY (hub_klant_hk, load_date)
);

-- Aparte satellite voor contactgegevens
CREATE TABLE sat_klant_contact (
    hub_klant_hk    CHAR(32) NOT NULL,
    load_date       TIMESTAMP NOT NULL,
    load_end_date   TIMESTAMP,
    record_source   VARCHAR(50),
    email           VARCHAR(200),
    telefoon        VARCHAR(20),
    hash_diff       CHAR(32),
    PRIMARY KEY (hub_klant_hk, load_date)
);

Het kernidee: splitsing van context

Waar SCD alle attributen in één dimensietabel stopt, splitst Data Vault ze op in meerdere Satellites gegroepeerd per bron of per onderwerp. Adresgegevens in de ene Satellite, contactgegevens in een andere, demografische data in weer een andere. Elke Satellite heeft zijn eigen historiseringsritme.

Directe Vergelijking: SCD vs Satellites

Kenmerk SCD (Kimball) Satellites (Data Vault)
Structuur Eén brede dimensietabel met alle attributen Meerdere smalle Satellites per attribuutgroep
Historisering Nieuwe rij per wijziging (Type 2), of overschrijven (Type 1) Altijd volledige historie, elke Satellite onafhankelijk
Granulariteit Hele dimensierij wordt geversioned bij elke change Alleen de Satellite met de gewijzigde attributen krijgt een nieuwe rij
Bronregistratie Niet standaard (optioneel) Verplicht: record_source in elke Satellite
Meerdere bronnen Lastig: welke bron wint bij conflict? Makkelijk: aparte Satellite per bron
Change detection Vergelijking van individuele kolommen hash_diff over alle attributen in de Satellite
Query-complexiteit Eenvoudig: feitentabel JOIN dimensie Complex: Hub JOIN Satellite(s), vaak meerdere joins nodig
Tabelgroei Hoog bij veel attributen (hele rij gedupliceerd) Efficienter: alleen gewijzigde attribuutgroep groeit
Flexibiliteit Schema-wijzigingen breken bestaande ETL Nieuwe Satellite toevoegen zonder bestaande structuur aan te passen
Leesbaarheid Hoog: business-vriendelijke stermodellen Laag: technisch model, business-laag nodig erboven

Het Granulariteitsprobleem

Het grootste praktische verschil zit in granulariteit van historisering. Stel: een klant heeft 20 attributen verspreid over adres, contact, en demografische data. Bij SCD Type 2 levert elke wijziging — ook als alleen het telefoonnummer verandert — een complete nieuwe rij op met alle 20 attributen gedupliceerd.

Voorbeeld: Impact op Tabelgroei

Een klant wijzigt in 1 jaar: 2x adres, 3x telefoon, 1x email.

MethodeNieuwe rijenGedupliceerde data
SCD Type 2 6 rijen (1 per wijziging) Alle 20 attributen gekopieerd per rij
Data Vault Satellites 2 rijen in sat_adres, 3 in sat_contact, 1 in sat_email Alleen de gewijzigde attribuutgroep

Bij 10 miljoen klanten wordt dit verschil significant: SCD Type 2 kan 3-5x meer opslagruimte vereisen dan het equivalent in Satellites.

Multi-Source: Waar Data Vault Uitblinkt

In de praktijk komen klantgegevens uit meerdere bronnen: het CRM, de webshop, het ERP-systeem, een extern dataplatform. Bij SCD moet je vooraf beslissen welke bron leidend is (golden record). Bij Data Vault maak je simpelweg een Satellite per bron.

-- Data Vault: aparte Satellite per bron
-- CRM-gegevens
CREATE TABLE sat_klant_crm (
    hub_klant_hk    CHAR(32),
    load_date       TIMESTAMP,
    record_source   VARCHAR(50) DEFAULT 'CRM',
    naam            VARCHAR(100),
    email           VARCHAR(200),
    segment         VARCHAR(50),
    hash_diff       CHAR(32),
    PRIMARY KEY (hub_klant_hk, load_date)
);

-- Webshop-gegevens
CREATE TABLE sat_klant_webshop (
    hub_klant_hk    CHAR(32),
    load_date       TIMESTAMP,
    record_source   VARCHAR(50) DEFAULT 'WEBSHOP',
    laatste_login   TIMESTAMP,
    voorkeurstaal   VARCHAR(10),
    nieuwsbrief     BOOLEAN,
    hash_diff       CHAR(32),
    PRIMARY KEY (hub_klant_hk, load_date)
);

-- Query: combineer beide bronnen voor actuele klantdata
SELECT
    h.klant_id,
    crm.naam,
    crm.email,
    crm.segment,
    ws.laatste_login,
    ws.voorkeurstaal
FROM hub_klant h
JOIN sat_klant_crm crm
    ON h.hub_klant_hk = crm.hub_klant_hk
    AND crm.load_end_date IS NULL
JOIN sat_klant_webshop ws
    ON h.hub_klant_hk = ws.hub_klant_hk
    AND ws.load_end_date IS NULL;

Voordeel in de praktijk

Als een nieuwe bron wordt aangesloten (bijv. een extern dataverrijkingsplatform), voeg je simpelweg een nieuwe Satellite toe. De Hub, de Links, en alle bestaande Satellites blijven onaangetast. Bij SCD zou je kolommen moeten toevoegen aan de dimensietabel en de ETL-logica aanpassen.

Performance en Query-Patronen

Hier scoort Kimball/SCD traditioneel beter. Een stermodel met SCD Type 2 vereist simpele joins:

-- Kimball: eenvoudige query
SELECT
    d.stad,
    SUM(f.omzet) AS totale_omzet
FROM feit_orders f
JOIN dim_klant d ON f.klant_sk = d.klant_sk
WHERE d.is_actueel = TRUE
GROUP BY d.stad;

Dezelfde query in Data Vault vereist meerdere joins:

-- Data Vault: meerdere joins nodig
SELECT
    sa.stad,
    SUM(f.omzet) AS totale_omzet
FROM feit_orders f
JOIN hub_klant h ON f.hub_klant_hk = h.hub_klant_hk
JOIN sat_klant_adres sa ON h.hub_klant_hk = sa.hub_klant_hk
    AND sa.load_end_date IS NULL
GROUP BY sa.stad;

In de praktijk lossen Data Vault-architecturen dit op door een Business Vault of Information Mart laag bovenop het Raw Vault te bouwen. Deze laag bevat gedenormaliseerde views of tabellen die vergelijkbaar zijn met Kimball-dimensies — het beste van beide werelden.

De lagen van een Data Vault architectuur

  • Staging — ruwe data uit bronnen, ongewijzigd
  • Raw Vault — Hubs, Links, Satellites (historisering)
  • Business Vault — afgeleide berekeningen, business rules
  • Information Mart — gedenormaliseerde stermodellen voor eindgebruikers (vergelijkbaar met Kimball-dimensies)

Implementatie in Moderne Platforms

dbt: SCD via Snapshots, Data Vault via Packages

-- dbt snapshot voor SCD Type 2 (ingebouwd)
{% snapshot snap_klant %}
{{
    config(
      target_schema='snapshots',
      unique_key='klant_id',
      strategy='check',
      check_cols=['naam', 'stad', 'email']
    )
}}
SELECT * FROM {{ source('crm', 'klanten') }}
{% endsnapshot %}

-- Data Vault via dbt package (dbtvault / automate-dv)
-- pip install dbt-databricks && dbt deps
-- packages.yml:
-- packages:
--   - package: Datavault-UK/automate-dv
--     version: 0.10.x

Databricks: Delta Lake voor beide patronen

Delta Lake's MERGE INTO werkt uitstekend voor zowel SCD als Satellite-loads. Het verschil zit puur in het tabelontwerp, niet in de techniek.

-- Satellite laden in Databricks met MERGE
MERGE INTO sat_klant_adres AS target
USING (
    SELECT
        md5(cast(klant_id as string)) AS hub_klant_hk,
        current_timestamp() AS load_date,
        'CRM' AS record_source,
        straat, stad, postcode, land,
        md5(concat_ws('|', straat, stad, postcode, land)) AS hash_diff
    FROM staging_klanten
) AS source
ON target.hub_klant_hk = source.hub_klant_hk
   AND target.load_end_date IS NULL
   AND target.hash_diff = source.hash_diff
WHEN NOT MATCHED THEN
    INSERT (hub_klant_hk, load_date, record_source, straat, stad, postcode, land, hash_diff)
    VALUES (source.hub_klant_hk, source.load_date, source.record_source,
            source.straat, source.stad, source.postcode, source.land, source.hash_diff);

Wanneer Kies Je Wat?

Kies SCD (Kimball) als... Kies Data Vault Satellites als...
Je team klein is en snelle time-to-value wil Je meerdere bronnen moet integreren
Business users directe toegang tot data nodig hebben Auditeerbaarheid en traceerbaarheid cruciaal zijn
Het datamodel relatief stabiel is Het datamodel regelmatig verandert of uitbreidt
Performance op rapportages de hoogste prioriteit is Flexibiliteit en schaalbaarheid belangrijker zijn dan query-snelheid
Je 1-3 databronnen hebt Je 5+ databronnen hebt die continu groeien
Je BI-tool direct op het warehouse draait Je een aparte presentatielaag kunt bouwen (Information Mart)
MKB met beperkt data engineering team Enterprise met dedicated data platform team

De Hybride Aanpak: Het Beste van Beide

In de praktijk kiezen steeds meer organisaties voor een hybride architectuur: Data Vault als integratielaag (Raw Vault) met Kimball-achtige stermodellen als presentatielaag (Information Mart). Dit patroon werkt bijzonder goed met het Medallion Architecture (Bronze-Silver-Gold) principe:

Bronze = Staging

Ruwe data uit alle bronnen, ongewijzigd opgeslagen. Vergelijkbaar met de staging area in Data Vault.

Silver = Raw Vault

Hubs, Links en Satellites. Volledige historisering, bronregistratie, hash-based change detection.

Gold = Information Mart

Kimball-stermodellen met SCD Type 2 dimensies. Geoptimaliseerd voor BI-tools en eindgebruikers.

-- Gold laag: Kimball-dimensie gebouwd vanuit Data Vault
CREATE OR REPLACE VIEW gold.dim_klant AS
SELECT
    h.hub_klant_hk AS klant_sk,
    h.klant_id,
    sa.stad,
    sa.postcode,
    sc.email,
    sc.telefoon,
    sa.load_date AS geldig_van,
    COALESCE(sa.load_end_date, '9999-12-31') AS geldig_tot,
    CASE WHEN sa.load_end_date IS NULL THEN TRUE ELSE FALSE END AS is_actueel
FROM hub_klant h
JOIN sat_klant_adres sa ON h.hub_klant_hk = sa.hub_klant_hk
LEFT JOIN sat_klant_contact sc ON h.hub_klant_hk = sc.hub_klant_hk
    AND sc.load_end_date IS NULL;

Conclusie

SCD en Data Vault Satellites lossen hetzelfde probleem op — historisering van veranderende data — maar vanuit een fundamenteel ander perspectief. SCD is eenvoudiger en direct bruikbaar voor rapportages. Data Vault is flexibeler en schaalbaarder, maar vereist een extra presentatielaag.

De keuze hangt af van je organisatie:

  • Klein team, weinig bronnen, snelle rapportages → Kimball met SCD
  • Groot team, veel bronnen, auditverplichtingen → Data Vault met Satellites
  • Het beste van beide → Data Vault als integratie + Kimball als presentatie

Ongeacht je keuze: begin met het begrijpen van wat je wilt historiseren en waarom. De techniek volgt vanzelf.

Hulp Nodig bij Implementatie?

Zoek je een Data Engineer of advies over dit onderwerp?