DataPartner365

Jouw partner voor datagedreven groei en inzichten

dbt (data build tool): Complete Gids voor 2026

Gepubliceerd: 21 maart 2026
Leestijd: 12 minuten
Data Engineering

Ontdek hoe dbt jouw datatransformaties stroomlijnt met SQL, versiebeheer en testing. De essentiële tool voor moderne data engineers.

Wat is dbt en Waarom is het Relevant in 2026?

Als je de afgelopen jaren actief bent geweest in de wereld van data engineering of analytics, heb je de naam dbt (data build tool) ongetwijfeld voorbij zien komen. Ontwikkeld door Fishtown Analytics (nu dbt Labs), is dbt uitgegroeid tot het de facto standaard voor datatransformatie in moderne data stacks. Maar wat maakt dbt zo bijzonder, en waarom is het in 2026 relevanter dan ooit?

dbt is een open-source command-line tool die data teams in staat stelt om transformaties in hun datawarehouse te definiëren, testen en documenteren met behulp van gewone SQL. In plaats van complexe ETL-pipelines te bouwen in Python of proprietary tools, schrijf je met dbt simpelweg SELECT-statements. dbt zorgt vervolgens voor de rest: dependencies beheren, de juiste volgorde van uitvoering, documentatie genereren en data-kwaliteitstesten uitvoeren.

dbt in één zin

dbt (data build tool) is een transformatietool die analysts en engineers in staat stelt om ELT-pipelines (Extract, Load, Transform) te beheren via SQL-modellen, versiebeheer en geautomatiseerde tests — rechtstreeks in je datawarehouse.

In 2026 is dbt relevanter dan ooit om meerdere redenen. De opkomst van cloudgebaseerde datawarehouses zoals Snowflake, BigQuery, Databricks en Redshift heeft de ELT-aanpak mainstream gemaakt. Waar vroeger ETL-processen data transformeerden vóór het laden, draait ELT de zaken om: laad eerst de ruwe data, transformeer daarna in het warehouse. dbt is gebouwd voor precies dit paradigma.

Bovendien heeft de opkomst van de analytics engineer — een rol die het midden houdt tussen data analyst en data engineer — de vraag naar tools zoals dbt explosief laten groeien. dbt democratiseert datatransformatie: ook analisten zonder diepgaande software-engineeringervaring kunnen nu productie-waardige pipelines bouwen en onderhouden.

SQL-first aanpak

Schrijf transformaties in SQL die je al kent. Geen nieuwe taal leren, geen complexe configuraties.

Automatisch DAG-beheer

dbt herkent dependencies tussen modellen automatisch en voert alles in de juiste volgorde uit.

Ingebouwde tests & docs

Definieer datakwaliteitstesten en genereer automatisch documentatie voor je hele datamodel.

Hoe Werkt dbt? Architectuur en Kernconcepten

Om dbt goed te begrijpen, is het belangrijk de kernarchitectuur te doorgronden. dbt werkt als een transformatielaag bovenop je bestaande datawarehouse. Het verbindt zich met je warehouse via een adapter (bijv. voor Snowflake, BigQuery, Redshift of Databricks) en voert SQL-queries uit die jij hebt gedefinieerd.

De dbt Projectstructuur

Een typisch dbt-project heeft de volgende mappenstructuur:

my_dbt_project/
├── dbt_project.yml          # Projectconfiguratie
├── profiles.yml             # Verbindingsinstellingen (lokaal)
├── models/                  # SQL-transformatiemodellen
│   ├── staging/             # Ruwe data laag
│   │   ├── stg_orders.sql
│   │   └── stg_customers.sql
│   ├── intermediate/        # Tussenliggende transformaties
│   │   └── int_orders_enriched.sql
│   └── marts/               # Business-ready tabellen
│       ├── dim_customers.sql
│       └── fct_orders.sql
├── tests/                   # Aangepaste SQL-tests
├── macros/                  # Herbruikbare Jinja-functies
├── seeds/                   # Statische CSV-data
├── snapshots/               # Slowly Changing Dimensions
└── analyses/                # Ad-hoc analyses

Stap-voor-stap: Hoe dbt een Run Uitvoert

1

Parsing & Compilatie

dbt leest alle .sql- en .yml-bestanden in je project. Jinja-templating wordt verwerkt en SQL-queries worden gecompileerd naar pure SQL.

2

DAG-constructie

Op basis van ref()- en source()-functies bouwt dbt een Directed Acyclic Graph (DAG) van alle modelafhankelijkheden.

3

Uitvoering in het Warehouse

dbt voert de gecompileerde SQL uit in je datawarehouse in de correcte volgorde. Modellen worden als views of tabellen gematerialiseerd.

4

Tests Uitvoeren

Na transformatie voert dbt datakwaliteitstests uit: uniekheid, null-checks, referentiële integriteit en aangepaste SQL-tests.

5

Documentatie Genereren

dbt genereert automatisch een interactieve website met lineage-grafieken, modelbeschrijvingen en testresultaten.

Materialisatietypes

Type Beschrijving Wanneer gebruiken
view Maakt een SQL-view aan in het warehouse Lichtgewicht staging-modellen
table Maakt een fysieke tabel aan, herbouwt elke run Kleine tot middelgrote datasets
incremental Voegt alleen nieuwe/gewijzigde rijen toe Grote fact-tabellen, event data
ephemeral Bestaat alleen als CTE, geen opslag in warehouse Tussenliggende berekeningen
snapshot Bijhouden van historische wijzigingen (SCD Type 2) Slowly Changing Dimensions

Praktische Codevoorbeelden

Theorie is mooi, maar dbt leer je het beste door het te zien in de praktijk. Hieronder een realistisch scenario: een e-commerce bedrijf dat order- en klantdata transformeert naar een analytics-ready datamodel.

1. Source-definitie (sources.yml)

# models/staging/sources.yml
version: 2

sources:
  - name: raw_ecommerce
    database: production_db
    schema: raw
    tables:
      - name: orders
        description: "Ruwe ordertabel vanuit het transactiesysteem"
        columns:
          - name: order_id
            description: "Uniek order-ID"
            tests:
              - unique
              - not_null
          - name: customer_id
            tests:
              - not_null
          - name: order_date
            tests:
              - not_null
      - name: customers
        description: "Klantgegevens"
        columns:
          - name: customer_id
            tests:
              - unique
              - not_null

2. Staging Model (stg_orders.sql)

-- models/staging/stg_orders.sql
{{ config(materialized='view') }}

WITH source AS (
    SELECT * FROM {{ source('raw_ecommerce', 'orders') }}
),

renamed AS (
    SELECT
        order_id,
        customer_id,
        CAST(order_date AS DATE)        AS order_date,
        UPPER(status)                   AS order_status,
        amount_cents / 100.0            AS order_amount_eur,
        created_at,
        updated_at
    FROM source
    WHERE order_id IS NOT NULL
)

SELECT * FROM renamed

3. Incrementeel Model (fct_orders.sql)

-- models/marts/fct_orders.sql
{{
    config(
        materialized='incremental',
        unique_key='order_id',
        on_schema_change='fail'
    )
}}

WITH orders AS (
    SELECT * FROM {{ ref('stg_orders') }}
),

customers AS (
    SELECT * FROM {{ ref('stg_customers') }}
),

enriched AS (
    SELECT
        o.order_id,
        o.order_date,
        o.order_status,
        o.order_amount_eur,
        c.customer_id,
        c.customer_segment,
        c.country_code,
        -- Berekende velden
        DATEDIFF('day', c.first_order_date, o.order_date) AS days_since_first_order,
        CASE
            WHEN o.order_amount_eur >= 500 THEN 'high_value'
            WHEN o.order_amount_eur >= 100 THEN 'mid_value'
            ELSE 'low_value'
        END AS order_value_segment
    FROM orders o
    LEFT JOIN customers c ON o.customer_id = c.customer_id
)

SELECT * FROM enriched

{% if is_incremental() %}
    WHERE order_date > (SELECT MAX(order_date) FROM {{ this }})
{% endif %}

4. Macro voor Herbruikbare Logica

-- macros/cents_to_euros.sql
{% macro cents_to_euros(column_name) %}
    {{ column_name }} / 100.0
{% endmacro %}

-- Gebruik in een model:
-- SELECT {{ cents_to_euros('amount_cents') }} AS amount_eur

5. Model-tests (schema.yml)

# models/marts/schema.yml
version: 2

models:
  - name: fct_orders
    description: "Fact-tabel met alle orders, verrijkt met klantdata"
    columns:
      - name: order_id
        description: "Primaire sleutel"
        tests:
          - unique
          - not_null
      - name: order_status
        tests:
          - accepted_values:
              values: ['PENDING', 'COMPLETED', 'CANCELLED', 'REFUNDED']
      - name: customer_id
        tests:
          - not_null
          - relationships:
              to: ref('dim_customers')
              field: customer_id
      - name: order_amount_eur
        tests:
          - not_null
          - dbt_utils.expression_is_true:
              expression: ">= 0"

Essentiële dbt Commando's

# Project initialiseren
dbt init my_project

# Alle modellen uitvoeren
dbt run

# Specifiek model uitvoeren
dbt run --select fct_orders

# Alleen downstream modellen uitvoeren
dbt run --select +fct_orders

# Tests uitvoeren
dbt test

# Documentatie genereren en openen
dbt docs generate
dbt docs serve

# Incrementeel model volledig herbouwen
dbt run --select fct_orders --full-refresh

# Debug verbinding
dbt debug

dbt vs. Alternatieven: Vergelijking

dbt is niet de enige speler in het datatransformatielandschap. Hieronder vergelijken we dbt met de meest relevante alternatieven in 2026.

Eigenschap dbt Core/Cloud Apache Spark / PySpark SQLMesh Dataform
Primaire taal SQL + Jinja Python / Scala / SQL SQL + Python SQLX + JavaScript
Transformatielaag In-warehouse (ELT) Buiten warehouse (ETL/ELT) In-warehouse (ELT) In-warehouse (ELT)
Leercurve Laag (SQL-kennis voldoende) Hoog (Python/Scala nodig) Gemiddeld Gemiddeld
Testing Ingebouwd & uitgebreid Handmatig / Great Expectations Ingebouwd Ingebouwd
Documentatie Automatisch gegenereerd Handmatig Automatisch Automatisch
Open Source ✅ (Core) ❌ (Google-product)
CI/CD integratie Uitstekend Goed Uitstekend Goed (Google Cloud)
Community & Ecosysteem Zeer groot Zeer groot Groeiend Beperkt
Beste voor Analytics engineers, SQL-gedreven teams Grote volumes, ML-pipelines Teams die dbt willen vervangen Google Cloud-ecosysteem

dbt vs. SQLMesh in 2026

SQLMesh is in 2025-2026 sterk opkomend als serieus alternatief voor dbt. Het biedt vergelijkbare functionaliteit maar met een aantal voordelen: native Python-modellen, betere state management (geen volledige rebuilds), en ingebouwde virtual environments per model. Voor nieuwe projecten is SQLMesh zeker het overwegen waard, maar dbt heeft een onmiskenbaar grotere community en een rijker ecosysteem van packages (zoals dbt-utils, dbt-expectations).

Praktijkcase: E-commerce Bedrijf Migreert naar dbt

Een Nederlandse e-commerce speler met 50M+ orders per jaar had een spaghetti van stored procedures in hun SQL Server-database en Python-scripts in meerdere cron-jobs. Het data team van 4 analytics engineers migreerde in 3 maanden naar dbt op Snowflake.

Resultaat: Transformatietijd daalde van 6 uur naar 45 minuten door parallelisatie. Elke pipeline heeft nu documentatie en tests. Nieuwe modellen worden gemiddeld 3× sneller gebouwd doordat de codebase herbruikbare macros en staging-lagen bevat.

Best Practices en Productiontips voor dbt

dbt is krachtig, maar zoals elke tool is de effectiviteit sterk afhankelijk van hoe je het gebruikt. Hieronder de meest waardevolle best practices voor productieomgevingen.

1. Houd de Laagindeling Strikt aan

De Staging → Intermediate → Marts structuur (ook wel het "dbt Datagladiator"-patroon) is essentieel voor onderhoudbaarheid:

  • Staging: 1-op-1 met bronsystemen, alleen renaming en type-casting
  • Intermediate: Business-logica en joins, herbruikbare bouwblokken
  • Marts: Business-ready tabellen voor BI-tools (facts & dimensions)

2. Gebruik Always ref() en source()

-- ❌ Verkeerd: hardcoded tabelnamen
SELECT * FROM production_db.raw.orders

-- ✅ Correct: gebruik source() voor bronsystemen
SELECT * FROM {{ source('raw_ecommerce', 'orders') }}

-- ✅ Correct: gebruik ref() voor andere modellen
SELECT * FROM {{ ref('stg_orders') }}

3. Incrementele Modellen Verstandig Inzetten

-- Gebruik een betrouwbare unique_key voor upserts
{{
    config(
        materialized='incremental',
        unique_key='order_id',
        incremental_strategy='merge'  -- of 'delete+insert' voor Redshift
    )
}}

-- Voeg altijd een buffer toe aan je incrementele filter
-- om late-arriving data op te vangen
{% if is_incremental() %}
    WHERE updated_at > (
        SELECT DATEADD('hour', -6, MAX(updated_at)) 
        FROM {{ this }}
    )
{% endif %}

4. CI/CD Pipeline Opzetten

# .github/workflows/dbt_ci.yml
name: dbt CI

on:
  pull_request:
    branches: [main]

jobs:
  dbt-ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      
      - name: Install dbt
        run: pip install dbt-snowflake==1.7.0
      
      - name: dbt debug
        run: dbt debug
        env:
          DBT_SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
          DBT_SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
      
      # Run alleen gewijzigde modellen + downstream
      - name: dbt run (changed models)
        run: dbt run --select state:modified+
        
      - name: dbt test
        run: dbt test --select state:modified+

Productie-checklist voor dbt

  • Profiles.yml buiten versiebeheer — gebruik omgevingsvariabelen voor credentials
  • Elke model heeft een beschrijving in de bijbehorende .yml
  • Minimaal unique + not_null test op elke primaire sleutel
  • Gebruik dbt-expectations package voor geavanceerde datakwaliteitstests
  • Slim gebruik van tags voor selectieve runs (--select tag:daily)
  • Stel query-comment in zodat je in je warehouse kunt zien welk dbt-model een query heeft gegenereerd
  • Monitor job-duur per model via dbt Cloud of je orchestratietool
  • Gebruik dbt-metricflow voor consistente bedrijfsmetrieken (GA in dbt 1.6+)

5. Packages Gebruiken

Het dbt-ecosysteem heeft een rijke verzameling packages. Voeg ze toe via packages.yml:

# packages.yml
packages:
  - package: dbt-labs/dbt_utils
    version: [">=1.1.0", "<2.0.0"]
  
  - package: calogica/dbt_expectations
    version: [">=0.9.0", "<1.0.0"]
  
  - package: dbt-labs/audit_helper
    version: [">=0.9.0", "<1.0.0"]

# Installeren via:
# dbt deps

Conclusie: Wanneer Wel en Niet dbt Gebruiken

dbt heeft de manier waarop data teams werken fundamenteel veranderd. Het heeft analytics engineering volwassen gemaakt door software-engineeringprincipes (versiebeheer, testen, documentatie, modulaire code) naar de wereld van datatransformatie te brengen.

Gebruik dbt wanneer:

  • Je werkt met een cloudwarehouse zoals Snowflake, BigQuery, Databricks of Redshift
  • Je team SQL-vaardig is maar niet per se software-engineer
  • Je transformatielogica centraliseren wilt vanuit meerdere bronnen
  • Datakwaliteit en documentatie topprioriteiten zijn
  • Je CI/CD-workflows wilt toepassen op je datamodellen
  • Je ELT-aanpak hanteert en transformatie in het warehouse uitvoert

Overweeg alternatieven wanneer:

  • Zware Python- of ML-transformaties nodig zijn (dan is PySpark/Databricks beter)
  • Je warehouse niet door dbt ondersteund wordt (hoewel het ecosysteem inmiddels zeer breed is)
  • Je complexe state management nodig hebt buiten wat dbt biedt (kijk dan naar SQLMesh)
  • Real-time streaming transformaties vereist zijn (dbt is batch-georiënteerd; combineer dan met Flink of dbt + Kafka)

Eindoordeel

In 2026 is dbt onmisbaar voor elk data team dat serieus werk maakt van een schaalbare, onderhoudbare en gedocumenteerde datatransformatielaag. Of je nu kiest voor dbt Core (open source, zelf te hosten) of dbt Cloud (managed platform met IDE, scheduling en CI/CD), de investering in het leren van dbt betaalt zich terug in de vorm van betere datakwaliteit, snellere ontwikkelcycli en een team dat effectiever samenwerkt.

Hulp Nodig bij Implementatie?

Zoek je een Data Engineer of advies over dit onderwerp?

Abdullah Özisik - AI Data Engineer

👨‍💻 Over de auteur

Abdullah Özisik — Data Engineer met specialisatie in AI-integratie en MLOps. Expert in het bouwen van intelligente data pipelines die gebruik maken van machine learning en generative AI voor geautomatiseerde data processing en optimalisatie.

Alle blogs