DataPartner365

Jouw partner voor datagedreven groei en inzichten

Medallion Architecture met Microsoft Fabric

Gepubliceerd: 26 maart 2026
Leestijd: 12 minuten
Data Engineering

Leer hoe je een schaalbare Medallion Architecture bouwt met Microsoft Fabric: van ruwe data naar betrouwbare business insights.

Wat is Medallion Architecture?

In de moderne datawereld worden organisaties overspoeld met enorme hoeveelheden ruwe data uit tientallen bronnen: ERP-systemen, API's, IoT-sensoren, SaaS-platformen en meer. Het ordenen, transformeren en beschikbaar stellen van al deze data op een betrouwbare, schaalbare manier is een van de grootste uitdagingen voor data engineers in 2026. De Medallion Architecture — ook wel bekend als het Bronze-Silver-Gold patroon — is dé referentiearchitectuur die hier een antwoord op biedt.

Oorspronkelijk gepopulariseerd door Databricks binnen het Lakehouse-concept, heeft het patroon inmiddels zijn weg gevonden naar Microsoft Fabric, het uniforme data-analyseplatform van Microsoft dat in 2023 werd gelanceerd en in 2025-2026 explosief is gegroeid in adoptie. Fabric combineert Data Factory, Synapse, Power BI en meer in één platform — met OneLake als de centrale opslag. Dat maakt het bij uitstek geschikt voor een Medallion-aanpak.

Definitie: Medallion Architecture

Medallion Architecture is een gelaagde data-architectuur waarbij ruwe data stapsgewijs wordt getransformeerd naar steeds hogere kwaliteitsniveaus. Elke laag heeft een duidelijke verantwoordelijkheid:

  • Bronze (Raw): Onbewerkte data, exact zoals die binnenkomt uit de bron
  • Silver (Cleansed): Gecleansde, gevalideerde en gestandaardiseerde data
  • Gold (Curated): Bedrijfsklare, geaggregeerde data voor rapportage en analyse

In 2026 is dit patroon relevanter dan ooit. Met de opkomst van AI-workloads, real-time streaming en steeds strengere datakwaliteitseisen van compliance-afdelingen, biedt een goed geïmplementeerde Medallion Architecture in Microsoft Fabric de fundering voor betrouwbare data producten — van dashboards tot ML-modellen.

De Drie Lagen in Detail

Bronze — Raw Layer

De bronze laag is de landing zone. Hier komt alle data direct vanuit de bron terecht, zonder transformaties. Het principe: nooit weggooien wat je ooit hebt ontvangen. Dit is je audit trail en recovery point.

  • Volledige historiek bewaren
  • Append-only schrijfpatroon
  • Partitioneren op ingest-datum
  • Opslagformaat: Delta of Parquet

Silver — Cleansed Layer

De silver laag bevat gecleansde, gestandaardiseerde data. Duplicaten zijn verwijderd, datatypes zijn gecorrigeerd, en schema's zijn geharmoniseerd. Dit is de laag waar data engineers het meeste werk doen.

  • Deduplicatie en validatie
  • Datatypeconversies
  • SCD Type 2 / historiek management
  • Basis business logic toepassen

Gold — Curated Layer

De gold laag is bedoeld voor eindgebruikers: analisten, Power BI-rapporten en ML-teams. Data is geaggregeerd, gemodelleerd als star schema en geoptimaliseerd voor query-performance.

  • Star/snowflake schema's
  • Pre-geaggregeerde metrics
  • Business semantiek verankerd
  • Row-level security toepasbaar

Dataflow door de Lagen

Eigenschap Bronze Silver Gold
Doelgroep Data Engineers Data Engineers / Analisten Business Analisten / BI
Datakwaliteit Rauw / onbewerkt Gecleansed / gevalideerd Bedrijfsklaar / gecureerd
Schrijfpatroon Append only Upsert (MERGE) Overwrite / Incremental
Retentie Lange termijn (jaren) Medium term Rolling window
Fabric component Lakehouse (Delta tables) Lakehouse / Warehouse Warehouse / Semantic Model
Toegang Beperkt Data team Breed beschikbaar

Medallion Architecture in Microsoft Fabric

Microsoft Fabric biedt een unieke infrastructuur voor het implementeren van Medallion Architecture. Het platform bestaat uit meerdere workloads die naadloos samenwerken op OneLake — één gedistribueerde opslag voor de hele tenant. Je hoeft data niet meer te kopiëren tussen systemen: alle Fabric-componenten lezen en schrijven naar dezelfde Delta Parquet-bestanden.

OneLake als Fundament

OneLake is het equivalent van OneDrive, maar dan voor data. Het is automatisch aanwezig in elke Fabric-tenant en ondersteunt het Delta Lake-opslagformaat natively. Dit betekent dat je Bronze, Silver en Gold gewoon als aparte Lakehouses of mappen in dezelfde OneLake kunt organiseren — zonder data-movement overhead.

Aanbevolen Fabric-componenten per Laag

1

Bronze: Data Factory Pipelines + Lakehouse

Gebruik Data Factory in Fabric voor de initiële ingest. Verbind met bronnen via connectors (SQL Server, REST API, SharePoint, etc.) en schrijf onbewerkte data naar een Lakehouse als Delta-tabellen. Gebruik notebooks voor custom ingest-logica.

2

Silver: Spark Notebooks of Dataflows Gen2

Transformaties van Bronze naar Silver doe je met PySpark Notebooks (voor complexe logica) of Dataflows Gen2 (low-code, Power Query-gebaseerd). Delta MERGE-statements zorgen voor efficiënte upserts.

3

Gold: Warehouse of Direct Lake Semantic Model

Voor de Gold laag heb je twee opties: een Fabric Warehouse voor SQL-gebaseerde transformaties, of een Direct Lake Semantic Model in Power BI dat rechtstreeks Lakehouse-tabellen leest zonder import-overhead.

4

Orchestratie: Data Factory Pipelines

Combineer alles met Fabric Pipelines voor end-to-end orchestratie. Gebruik parameters, conditionele activiteiten en monitoring via de ingebouwde run history voor volledige controle over je dataflows.

Praktische Codevoorbeelden

Hieronder vind je realistische PySpark-notebooks die je direct kunt gebruiken in Microsoft Fabric. We werken met een fictief retailbedrijf dat verkooptransacties verwerkt.

Stap 1: Bronze Ingest — Raw data opslaan

# Notebook: 01_bronze_ingest_sales.py
# Microsoft Fabric - PySpark Notebook
# Doel: Ruwe verkoopdata inladen vanuit Azure SQL Database naar Bronze Lakehouse

from pyspark.sql import SparkSession
from pyspark.sql.functions import current_timestamp, lit
from datetime import datetime

spark = SparkSession.builder.appName("BronzeIngest_Sales").getOrCreate()

# Verbinding naar bronsysteem (SQL Server via linked service)
jdbc_url = "jdbc:sqlserver://prod-server.database.windows.net:1433;database=RetailDB"
connection_properties = {
    "user": mssparkutils.credentials.getSecret("kv-fabric", "sql-user"),
    "password": mssparkutils.credentials.getSecret("kv-fabric", "sql-password"),
    "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
}

# Watermark-gebaseerde incrementele load
last_load_date = "2024-01-01"  # In productie: ophalen uit metadata tabel

df_raw = spark.read.jdbc(
    url=jdbc_url,
    table=f"(SELECT * FROM dbo.SalesTransactions WHERE ModifiedDate > '{last_load_date}') AS src",
    properties=connection_properties
)

# Metadata kolommen toevoegen voor traceerbaarheid
df_bronze = df_raw.withColumn("_ingestion_timestamp", current_timestamp()) \
                  .withColumn("_source_system", lit("RetailDB_SQL")) \
                  .withColumn("_batch_date", lit(datetime.today().strftime("%Y-%m-%d")))

# Schrijven naar Bronze Lakehouse als Delta tabel
# Append-only: historiek bewaren!
df_bronze.write.format("delta") \
    .mode("append") \
    .partitionBy("_batch_date") \
    .save("abfss://bronze@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/sales_transactions_raw")

print(f"Bronze ingest voltooid: {df_bronze.count()} rijen geladen")

Stap 2: Silver Transformatie — Cleansing en Deduplicatie

# Notebook: 02_silver_transform_sales.py
# Microsoft Fabric - PySpark Notebook
# Doel: Bronze data cleansen, dedupliceren en laden naar Silver laag

from pyspark.sql import SparkSession
from pyspark.sql.functions import (
    col, trim, upper, to_date, when, row_number, current_timestamp
)
from pyspark.sql.window import Window
from delta.tables import DeltaTable

spark = SparkSession.builder.appName("SilverTransform_Sales").getOrCreate()

# Lees meest recente Bronze data
df_bronze = spark.read.format("delta").load(
    "abfss://bronze@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/sales_transactions_raw"
)

# 1. Basis cleaning
df_clean = df_bronze \
    .withColumn("customer_name", trim(upper(col("customer_name")))) \
    .withColumn("product_code", trim(col("product_code"))) \
    .withColumn("transaction_date", to_date(col("transaction_date_str"), "dd-MM-yyyy")) \
    .withColumn("amount", col("amount").cast("decimal(18,2)")) \
    .filter(col("transaction_id").isNotNull()) \
    .filter(col("amount") > 0)  # Negatieve bedragen uitsluiten

# 2. Deduplicatie: behoud meest recente record per transaction_id
window_spec = Window.partitionBy("transaction_id").orderBy(col("_ingestion_timestamp").desc())

df_deduped = df_clean \
    .withColumn("row_num", row_number().over(window_spec)) \
    .filter(col("row_num") == 1) \
    .drop("row_num", "_ingestion_timestamp", "_batch_date")

# 3. Kwaliteitscheck
total_records = df_deduped.count()
null_dates = df_deduped.filter(col("transaction_date").isNull()).count()
print(f"Totaal records: {total_records}")
print(f"Records met null datum (worden gemarkeerd): {null_dates}")

df_silver = df_deduped.withColumn(
    "dq_flag",
    when(col("transaction_date").isNull(), "INVALID_DATE")
    .when(col("customer_id").isNull(), "MISSING_CUSTOMER")
    .otherwise("VALID")
).withColumn("_silver_timestamp", current_timestamp())

# 4. MERGE naar Silver tabel (SCD Type 1 upsert)
silver_path = "abfss://silver@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/sales_transactions"

if DeltaTable.isDeltaTable(spark, silver_path):
    silver_table = DeltaTable.forPath(spark, silver_path)
    silver_table.alias("target").merge(
        df_silver.alias("source"),
        "target.transaction_id = source.transaction_id"
    ).whenMatchedUpdateAll() \
     .whenNotMatchedInsertAll() \
     .execute()
    print("Silver MERGE succesvol uitgevoerd")
else:
    # Eerste keer: volledige write
    df_silver.write.format("delta").mode("overwrite").save(silver_path)
    print("Silver tabel aangemaakt en gevuld")

Stap 3: Gold Aggregatie — Business-klare data

# Notebook: 03_gold_aggregate_sales.py
# Microsoft Fabric - PySpark Notebook
# Doel: Silver data aggregeren naar Gold laag voor Power BI rapportage

from pyspark.sql import SparkSession
from pyspark.sql.functions import (
    col, sum, count, avg, date_trunc, year, month
)

spark = SparkSession.builder.appName("GoldAggregate_Sales").getOrCreate()

# Lees Silver data (alleen VALID records)
df_silver = spark.read.format("delta").load(
    "abfss://silver@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/sales_transactions"
).filter(col("dq_flag") == "VALID")

# Dimensie: klanten (voorbeeld - join met klantentabel)
df_customers = spark.read.format("delta").load(
    "abfss://silver@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/customers"
)

# Feitentabel: maandelijkse omzet per klant en productcategorie
df_gold = df_silver \
    .join(df_customers, "customer_id", "left") \
    .withColumn("year_month", date_trunc("month", col("transaction_date"))) \
    .groupBy(
        "year_month",
        col("customer_segment"),
        col("product_category"),
        col("region")
    ).agg(
        sum("amount").alias("total_revenue"),
        count("transaction_id").alias("transaction_count"),
        avg("amount").alias("avg_transaction_value"),
        count("customer_id").alias("unique_customers")
    ) \
    .withColumn("year", year(col("year_month"))) \
    .withColumn("month", month(col("year_month")))

# Schrijven naar Gold — overwrite per partitie (idempotent)
df_gold.write.format("delta") \
    .mode("overwrite") \
    .option("overwriteSchema", "true") \
    .partitionBy("year", "month") \
    .save("abfss://gold@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/fact_monthly_sales")

# Registreer als SQL tabel voor direct gebruik in Warehouse/Power BI
spark.sql("""
    CREATE TABLE IF NOT EXISTS gold_lakehouse.fact_monthly_sales
    USING DELTA
    LOCATION 'abfss://gold@onelake.dfs.fabric.microsoft.com/RetailLH.Lakehouse/Tables/fact_monthly_sales'
""")

print(f"Gold tabel bijgewerkt: {df_gold.count()} aggregatierijen")

Pro Tip: Gebruik Fabric Shortcuts

In Microsoft Fabric kun je Shortcuts aanmaken tussen Lakehouses. Zo kan je Gold Lakehouse een shortcut hebben naar Silver-tabellen zonder data te kopiëren. Dit bespaart opslag en zorgt dat je altijd met de meest actuele data werkt. Ga naar je Lakehouse > New Shortcut > Microsoft OneLake.

Medallion Architecture vs. Alternatieven

Architectuur Voordelen Nadelen Beste use case
Medallion (Bronze/Silver/Gold) Duidelijke lagen, herbruikbaar, auditeerbaar, native Fabric-support Meer opslag nodig, complexere orchestratie Enterprise data platforms, meerdere consumers
Data Vault 2.0 Zeer flexibel voor historiek, goed voor audit-zware omgevingen Hoge complexiteit, veel tabellen, steile leercurve Financiën, compliance-zware sectoren
Klassiek DWH (Kimball) Bekend patroon, uitstekend voor BI, sterke SQL-tooling Minder flexibel voor semi-gestructureerde data, ETL-overhead Pure BI & rapportage omgevingen
Lambda Architecture Ondersteunt batch én real-time Dubbele codebase (batch + streaming), hoge complexiteit Real-time + historische analyse gecombineerd
Data Mesh Schaalbaar bij grote organisaties, domain ownership Vereist mature organisatie en governance, niet plug-and-play Grote enterprise met meerdere data domeinen

In de Nederlandse markt zien we dat de combinatie Medallion + Fabric snel mainstream wordt bij mid-market en enterprise organisaties. Het biedt de juiste balans tussen structuur, flexibiliteit en time-to-value — zonder de extreme complexiteit van Data Vault of Data Mesh.

Best Practices voor Productie

Praktijkvoorbeeld: Nederlandse Retailer

Een Nederlandse retailer met 150 winkels implementeerde Medallion Architecture in Microsoft Fabric voor hun omnichannel data platform. Ze ingesten dagelijks 50M+ transactieregels uit POS-systemen, webshop-API's en ERP. De Bronze laag bewaart 3 jaar onbewerkte data (GDPR-compliant gepartitioneerd per winkel en datum), Silver bevat gecleansde transacties met klantprofielen, en Gold stelt data beschikbaar voor 200+ Power BI-gebruikers via Direct Lake. Resultaat: rapportage-refreshtijd daalde van 4 uur naar 8 minuten.

Production Tips

1. Delta Lake Optimalisatie

Voer regelmatig OPTIMIZE en VACUUM uit op je Delta-tabellen. In Fabric kun je dit automatiseren via een nachtelijke pipeline. Gebruik Z-ordering op veelgebruikte filterkolommen.

-- In Fabric Notebook
OPTIMIZE silver_lakehouse.sales_transactions
ZORDER BY (transaction_date, customer_id);

VACUUM silver_lakehouse.sales_transactions
RETAIN 168 HOURS;

2. Data Governance

Koppel Microsoft Purview aan je Fabric workspace voor automatische data lineage. Definieer sensitivity labels op Bronze-tabellen met PII-data en propageer deze naar Silver en Gold via Purview-policies.

  • Column-level encryption voor BSN/IBAN
  • Row-level security in Gold
  • Audit logging via Fabric Admin Portal

3. Monitoring & Alerting

Implementeer data quality checks als aparte stap in je pipeline. Schrijf DQ-metrics naar een aparte observability-tabel en koppel alerts via Data Activator wanneer kwaliteitsdrempels worden overschreden.

# DQ Check voorbeeld
dq_results = {
    "null_rate": null_count / total,
    "duplicate_rate": dup_count / total,
    "pipeline_run": run_id
}
# Schrijf naar monitoring tabel

Veelgemaakte Fouten Vermijden

  • Te vroeg aggregeren: Bewaar granulaire data zo lang mogelijk. Aggregaties in Silver halen de flexibiliteit eruit.
  • Geen idempotentie: Zorg dat je notebooks meerdere keren kunnen draaien zonder dubbele data. Gebruik MERGE in plaats van INSERT.
  • Eén grote Lakehouse: Scheid Bronze, Silver en Gold in aparte Lakehouses voor correcte toegangsbeheer en lifecycle management.
  • Hardcoded credentials: Gebruik altijd Azure Key Vault via mssparkutils.credentials.getSecret().
  • Geen schema evolutie: Activeer .option("mergeSchema", "true") om schemawijzigingen in bronnen op te vangen zonder pipeline-crashes.

Conclusie: Wanneer Wel en Niet Gebruiken?

Medallion Architecture in Microsoft Fabric is een krachtige combinatie die voor veel Nederlandse organisaties de juiste keuze is. Maar het is geen one-size-fits-all oplossing. Hier is een eerlijk overzicht:

Situatie Medallion in Fabric: Aanbevolen? Reden
Enterprise met 10+ databronnen ✅ Ja, sterk aanbevolen Structuur en governance zijn essentieel bij scale
MKB met 1-2 databronnen ⚠️ Mogelijk overkill Overweeg een vereenvoudigde Raw/Refined aanpak
Al-in op Microsoft stack (Azure/M365) ✅ Ja, ideaal Naadloze integratie met Entra ID, Purview, Power BI
Mixed cloud (AWS + Azure) ⚠️ Evalueer zorgvuldig OneLake is Azure-native, externe data via shortcuts
Real-time streaming vereist ✅ Ja, met Eventstream Fabric Eventstream integreert in Bronze laag
Sterk gereguleerde omgeving (DORA, NIS2) ✅ Ja Audit trail in Bronze + Purview lineage = compliance-klaar

Voor de meeste Nederlandse organisaties die nu beginnen met of doorgroeien in datamaturiteit, is Medallion Architecture in Microsoft Fabric de meest pragmatische, schaalbare en toekomstvaste keuze. Het platform groeit snel, de community is actief, en de integratie met Power BI en AI Foundry (voor Copilot-workloads) maakt het een platform dat met je meegroeit.

Begin klein: implementeer eerst één domein (bijv. sales of finance) met een solide Bronze-Silver-Gold structuur. Bewijs de waarde, verfijn je patronen, en schaal daarna uit naar het hele platform. De

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.