Xenosystems Logo
Sascha Hess

Diplom-Biologe | Senior IT-Consultant

SH

Sascha Hess

xenosystems.de - IT-Consulting & Data Management

www.xenosystems.de

 

 

Strategische Wissens-Roadmap 2026

 

 

 

Datenmodellierung Grundlagen für BI

 

Star Schema, Data Vault, 3NF — das richtige Modell für Ihren Kontext

WAS SIE IN DIESEM KIT ERHALTEN:

 

1

3 Modellierungsansätze

Star Schema, Data Vault, 3NF — verglichen und bewertet

 

 

2

Praxismuster & SQL

Fertige DDL-Skripte und Abfragevorlagen für jeden Ansatz

 

 

3

Entscheidungsmatrix

Welches Modell passt zu welchem Projekt?

 

 

4

10 Modellierungsfehler

Die teuersten Fehler — erkannt und vermieden

 

 

5

30-Tage-Umsetzungsplan

Vom leeren Schema zum ersten produktiven BI-Modell

 


Rechtliche Hinweise und Haftungsausschluss

 

HAFTUNGSAUSSCHLUSS

 

Alle Modellierungsempfehlungen, SQL-Skripte und Architekturhinweise wurden sorgfältig erarbeitet. Da jede Datenlandschaft individuell ist, übernimmt der Autor keinerlei Haftung für Datenverlust, fehlerhafte Auswertungen, Systemausfälle oder sonstige Schäden. Testen Sie alle Skripte zunächst in einer Nicht-Produktivumgebung.

 

KEINE ERGEBNISGARANTIE

 

Die genannten Performance-Richtwerte und Projektaufwände basieren auf Erfahrungswerten aus realen KMU-Umgebungen. Tatsächliche Ergebnisse können je nach Datenvolumen, Hardware, ERP-System und Teamkompetenz erheblich abweichen.

 

VERSIONSHINWEIS

 

Die SQL-Beispiele beziehen sich auf Microsoft SQL Server 2022/2025 und sind weitgehend ANSI-SQL-kompatibel. Syntaktische Abweichungen bei anderen Datenbanksystemen (Oracle, PostgreSQL, MySQL) sind möglich.

 

URHEBERRECHT

 

Dieses Dokument ist für den persönlichen oder betriebsinternen Gebrauch des Käufers lizenziert. Weiterverkauf, Weitergabe an Dritte und öffentliche Veröffentlichung sind ohne schriftliche Genehmigung nicht gestattet.

 

KEINE VERBINDUNG ZU HERSTELLERN

 

Dieses Kit ist ein unabhängiges Werk ohne Verbindung zu Microsoft, Bissantz & Company oder anderen Softwareherstellern. SQL Server und Power BI sind eingetragene Marken der Microsoft Corporation.

 

Eine ausführliche Version dieses Haftungsausschlusses befindet sich am Ende dieses Dokuments.

 


 

 

Inhaltsverzeichnis

 

 

01  Einleitung

Warum Datenmodellierung über BI-Erfolg oder -Scheitern entscheidet

 

02  Die 10 Modellierungsfehler

Erkannt & vermieden — bevor das Projekt teuer wird

 

03  Star Schema

Das Arbeitspferd der BI-Modellierung

 

04  3NF — Relationales Modell

Wann normalisiert besser ist

 

05  Data Vault

Skalierbare Historisierung für komplexe Landschaften

 

06  Vergleich & Entscheidungsmatrix

Welches Modell für welchen Kontext?

 

07  Dimensionsmodellierung im Detail

SCDs, Surrogatschlüssel, Datumsdimenion

 

08  ETL-Architektur

Vom Quellsystem ins BI-Modell

 

09  Performance & Wartung

Indizes, Partitionierung, Aktualisierungsstrategien

 

10  30-Tage-Umsetzungsplan

Vom leeren Schema zum ersten produktiven BI-Modell

 


 

01

Einleitung

Warum Datenmodellierung über BI-Erfolg oder -Scheitern entscheidet

 

Business Intelligence steht und fällt mit der Qualität des zugrundeliegenden Datenmodells. Dashboards, KPIs und Reports sind nur die sichtbare Spitze — das Datenmodell darunter entscheidet, ob diese Spitze stabil oder brüchig ist.

 

Ein schlechtes Datenmodell lässt sich nicht durch bessere Tools retten.

 

In der Praxis mittelständischer Unternehmen sieht das häufig so aus: Power BI wird eingeführt, Reports werden gebaut — direkt auf den ERP-Tabellen. Erst nach Monaten zeigt sich das Problem: Abfragen dauern Minuten statt Sekunden. Zahlen stimmen nicht überein, weil Joins falsch gesetzt sind. Historische Vergleiche sind unmöglich, weil niemand Änderungen protokolliert hat. Das Vertrauen in die BI-Lösung ist weg — dabei lag das Problem nie in Power BI, sondern im fehlenden Datenmodell darunter.

 

  Direkte Anbindung von Reporting-Tools an ERP-Datenbanken ist der häufigste und teuerste Anfängerfehler in BI-Projekten.

 

  Star Schema, 3NF und Data Vault sind keine akademischen Konzepte — sie sind pragmatische Lösungen für konkrete Probleme, die in jedem BI-Projekt früher oder später auftreten.

 

  Die Wahl des falschen Modellierungsansatzes kostet bei einem mittelständischen Unternehmen typischerweise 3–12 Monate Nacharbeit und 50.000–200.000 EUR Mehraufwand.

 

  Kein Modellierungsansatz ist universell überlegen. Star Schema, 3NF und Data Vault haben je eigene Stärken — der Kontext entscheidet.

 

Dieses Kit richtet sich an IT-Leiter, BI-Entwickler und Projektverantwortliche, die ein solides Fundament für ihre BI-Architektur legen wollen. Es erklärt Konzepte verständlich — und liefert sofort einsetzbare SQL-Muster für die Praxis.

 

WAS SIE IN DIESEM KIT ERWARTEN DÜRFEN

  3 Modellierungsansätze — Star Schema, 3NF und Data Vault: Konzept, Aufbau, Stärken, Schwächen.

  SQL-Praxismuster — Fertige DDL-Skripte für Fakten- und Dimensionstabellen, Hub/Link/Satellite.

  Entscheidungsmatrix — Welches Modell für welches Projekt? 10 Kriterien, klar bewertet.

  SCD-Guide — Slowly Changing Dimensions: Typen 0, 1, 2, 3 erklärt und implementiert.

  30-Tage-Umsetzungsplan — Vom leeren Schema zum ersten produktiven Modell.

 

ZIEL DIESES KITS

Nach dem Lesen und Umsetzen dieses Kits kennen Sie die drei wichtigsten BI-Modellierungsansätze, können für Ihr Projekt den richtigen wählen — und haben konkrete SQL-Muster, mit denen Sie sofort beginnen können. Kein theoretisches Lehrbuch, sondern ein Praxishandbuch mit sofort kopierbarem Code.


 

02

Die 10 Modellierungsfehler

 

Erkannt & vermieden — bevor das Projekt teuer wird

 

Diese zehn Fehler sind die häufigsten Ursachen für gescheiterte oder unnötig teure BI-Projekte. Fast alle sind vermeidbar — wenn man sie kennt.

 

01 Direktanbindung ans ERP ohne Staging

 

Der teuerste Anfängerfehler überhaupt. Power BI, SSRS oder Excel greifen direkt auf die ERP-Produktivdatenbank zu. Im besten Fall: langsame Reports. Im schlechtesten Fall: ERP-Performance bricht ein, weil ein schlecht optimierter Report einen vollständigen Table Scan auf einer 50-Millionen-Zeilen-Tabelle auslöst.

 

GEGENMASNAHME:

 

  Immer eine Staging-Schicht einrichten — auch wenn es zunächst "nur" ein paar Tabellen sind.

  Read-only-Replikat oder separater Reporting-Server für Abfragen nutzen.

  Niemals produktive ERP-Verbindungen in Self-Service-BI-Tools (Power BI Desktop) freigeben.

 

-- Staging-Tabelle: Beispiel tägliche Auftragsschnappschuss

CREATE TABLE stg.Auftraege (

    AuftragNr        NVARCHAR(20)    NOT NULL,

    KundenNr         NVARCHAR(20)    NOT NULL,

    ArtikelNr        NVARCHAR(30)    NOT NULL,

    Auftragsdatum    DATE            NOT NULL,

    Lieferdatum_Soll DATE            NULL,

    Lieferdatum_Ist  DATE            NULL,

    Menge            DECIMAL(18,3)   NOT NULL,

    Preis_Netto      DECIMAL(18,2)   NOT NULL,

    Waehrung         CHAR(3)         NOT NULL DEFAULT 'EUR',

    Ladezeit         DATETIME2       NOT NULL DEFAULT SYSUTCDATETIME()

);

 

 

02 Keine Surrogatschlüssel — nur natürliche Schlüssel

 

ERP-Schlüssel (Kundennummer, Artikelnummer) als Primärschlüssel im Data Warehouse zu verwenden klingt vernünftig. Ist es nicht. Was passiert bei einer ERP-Migration? Wenn Nummernkreise geändert werden? Wenn ein Kunde in zwei Systemen unterschiedliche Nummern hat?

 

 

GEGENMASNAHME:

 

  Immer technische Surrogatschlüssel (INTEGER IDENTITY oder SEQUENCE) als PK im DWH.

  Natürliche Schlüssel als Business Key getrennt führen und mit UNIQUE-Constraint sichern.

  In Faktentabellen: Foreign Keys immer auf Surrogatschlüssel — nie auf natürliche Schlüssel.

 

-- Richtig: Surrogatschlüssel + Business Key getrennt

CREATE TABLE dim.Kunde (

    KundeKey     INT IDENTITY(1,1)  NOT NULL PRIMARY KEY,  -- Surrogatschlüssel

    KundenNr     NVARCHAR(20)       NOT NULL,               -- Business Key (ERP)

    Kundenname   NVARCHAR(200)      NOT NULL,

    -- weitere Attribute ...

    CONSTRAINT uq_Kunde_KundenNr UNIQUE (KundenNr)

);

 

 

03 Fehlende oder falsche Historisierung

 

Ein Kunde wechselt die Branchenzuordnung. Ein Artikel bekommt eine neue Produktgruppe. Ein Mitarbeiter wechselt die Abteilung. Ohne Historisierung zeigen alle historischen Fakten plötzlich die neue Zuordnung — Vorjahresvergleiche werden wertlos.

 

GEGENMASNAHME:

 

  Für jede Dimension festlegen: Wie soll eine Änderung behandelt werden? (SCD Typ 1, 2 oder 3)

  Zeitkritische Dimensionen (Kunde, Artikel, Mitarbeiter) immer als SCD Typ 2 implementieren.

  Gültigkeitszeitraum mit GueltigVon und GueltigBis in jeder historisierten Dimension.

 

04 Zu viele Faktentabellen — fehlende Granularität-Definition

 

Eine Faktentabelle ohne klar definierte Granularität ist wertlos. Granularität bedeutet: Was stellt eine Zeile in dieser Tabelle dar? Eine Auftragsposition? Ein Buchungsdatum? Eine Schichtproduktion? Ohne diese Definition entstehen fehlerhafte Aggregationen.

 

GEGENMASNAHME:

 

  Granularitätsdefinition als erste Frage vor jeder Faktentabelle: "Eine Zeile entspricht ..."

  Faktentabellen nach Granularität trennen: Transaktionsfakten ≠ periodische Schnappschüsse ≠ kumulierte Schnappschüsse.

  Niemals unterschiedliche Granularitäten in einer Faktentabelle mischen.

 

05 NULL in Dimensionsspalten

 

NULL-Werte in Dimensionstabellen machen Gruppenauswertungen unzuverlässig. WHERE-Klauseln und GROUP BY ignorieren NULLs oder behandeln sie inkonsistent — je nach SQL-Dialekt und BI-Tool.

GEGENMASNAHME:

 

  Keine NULLs in Dimensionstabellen — stattdessen definierte Platzhalterwerte.

  "Unbekannt", "Nicht zugeordnet", "Kein Wert" als explizite Dimensionseinträge anlegen.

  Spezialzeile mit Surrogatschlüssel = -1 oder 0 für fehlende Referenzen reservieren.

 

-- Platzhalterdatensatz für fehlende Kundenzuordnung

INSERT INTO dim.Kunde (KundeKey, KundenNr, Kundenname, Branche, Region)

VALUES (-1, 'UNBEKANNT', 'Kein Kunde zugeordnet', 'Unbekannt', 'Unbekannt');

 

 

06 Alle Dimensionen denormalisiert — auch bei 1:n-Kaskaden

 

Star Schema bedeutet flache, denormalisierte Dimensionstabellen. Aber manche Entwickler denormalisieren zu weit: Wenn eine Dimension 50+ Spalten hat und viele davon nur in 10 % der Fälle gefüllt sind, entstehen breite, schwer wartbare Tabellen.

 

GEGENMASNAHME:

 

  Denormalisierung mit Augenmaß: Häufig genutzte Attribute flach, selten genutzte in Outrigger-Tabellen oder separaten Dimensionen.

  Bei mehr als ~40 Spalten pro Dimension: Prüfen, ob eine Aufteilung in Subdimensionen sinnvoller ist.

  Snowflake-Schema (teilnormalisiert) ist kein Fehler — solange Performance und Wartbarkeit stimmen.

 

07 Keine einheitliche Datumsdimension

 

Jeder BI-Entwickler baut seine eigene Datumslogik — einer mit DATEPART, einer mit EOMONTH, einer mit einer eigenen Kalkulationstabelle. Das Ergebnis: drei verschiedene Definitionen von "Kalendermonat" im selben Unternehmen.

 

GEGENMASNAHME:

 

  Genau eine zentrale dim.Datum-Tabelle — für alle Fakten im gesamten Data Warehouse.

  Alle relevanten Kalenderattribute vorab berechnen und gespeichert halten: Kalenderwoche, Geschäftsjahr, Quartal, Feiertage, Arbeitstage.

  Datumsschlüssel als INTEGER im Format YYYYMMDD — kein JOIN auf DATETIME-Spalten.

 

08 ETL-Logik in der Datenbank statt im ETL-Werkzeug

 

Komplexe Transformationslogik direkt in Stored Procedures oder Views zu implementieren klingt effizient. Wird aber schnell zur Blackbox: Nicht dokumentiert, schwer testbar, nicht versioniert.

 

 

GEGENMASNAHME:

 

  Transformationslogik in dedizierte ETL-Schicht auslagern (SSIS, Azure Data Factory, dbt, Python).

  Stored Procedures nur für finale Ladeoperationen (MERGE, INSERT) — nicht für komplexe Businesslogik.

  ETL-Code in Versionskontrolle (Git) — wie Anwendungscode.

 

09 Kein Metadaten- und Ladeprotokoll

 

Der ETL-Job ist gestern Nacht fehlgeschlagen — aber niemand weiß es. Das Dashboard zeigt Daten vom Vortag, weil kein Monitoring vorhanden ist.

 

GEGENMASNAHME:

 

  Ladeprotokoll-Tabelle für jeden ETL-Lauf: Start, Ende, Status, Anzahl geladener Zeilen, Fehlermeldung.

  Automatische Alerts bei Fehlschlag (E-Mail oder Monitoring-System).

  Datenfrische im Dashboard sichtbar: "Stand: Heute 06:00 Uhr" — damit Nutzer wissen, wie aktuell die Daten sind.

 

-- ETL-Ladeprotokoll

CREATE TABLE meta.ETL_Protokoll (

    ProtokolID     INT IDENTITY(1,1) PRIMARY KEY,

    JobName        NVARCHAR(100)  NOT NULL,

    Startzeit      DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME(),

    Endzeit        DATETIME2      NULL,

    Status         NVARCHAR(20)   NOT NULL DEFAULT 'LÄUFT',  -- LÄUFT | OK | FEHLER

    ZeilenGeladen  INT            NULL,

    Fehlermeldung  NVARCHAR(MAX)  NULL

);

 

 

10 Data Warehouse ohne Schichtenmodell

 

Alles in einem Schema, keine Trennung zwischen Rohdaten, transformierten Daten und Präsentationsschicht. Wenn ein Fehler passiert, ist unklar, auf welcher Ebene er liegt — und eine Neuberechnung erfordert einen vollständigen Reload.

 

GEGENMASNAHME:

 

  Mindestens drei Schichten: Staging (Rohdaten) → Core (transformiert, historisiert) → Mart (aggregiert, denormalisiert für Reporting).

  Jede Schicht als eigenes SQL-Schema: stg, core, mart oder raw, dv, dm.

  Staging immer mit vollständigen Rohdaten — so kann jede Schicht neu berechnet werden, ohne erneut aus dem Quellsystem zu laden.

 


 

03

Star Schema

 

Das Arbeitspferd der BI-Modellierung

 

Das Star Schema ist der am weitesten verbreitete Modellierungsansatz im BI-Umfeld — und das aus gutem Grund. Es ist intuitiv, performant und von nahezu jedem BI-Tool nativ unterstützt.

 

3.1 Grundprinzip

 

Ein Star Schema besteht aus genau zwei Tabellentypen: einer zentralen Faktentabelle und mehreren sie umgebenden Dimensionstabellen. Die Faktentabelle enthält messbare Geschäftsvorfälle (Umsatz, Menge, Kosten). Die Dimensionstabellen enthalten beschreibende Kontextinformationen (Wer? Was? Wann? Wo?).

 

  Faktentabelle: Enthält Foreign Keys zu allen Dimensionen sowie die numerischen Kennzahlen (Measures). Ist in der Regel sehr groß (Millionen bis Milliarden Zeilen).

 

  Dimensionstabellen: Enthalten beschreibende Attribute. Sind relativ klein. Werden bewusst denormalisiert — auch wenn das gegen die 3. Normalform verstößt.

 

  Der Name: Von oben betrachtet sieht das Modell wie ein Stern aus — Faktentabelle in der Mitte, Dimensionen als Zacken.

 

3.2 Faktentabellen-Typen

 

TYP 1 — TRANSAKTIONSFAKTEN:

  Eine Zeile pro Geschäftsvorfall.

  Beispiel: Eine Zeile pro Auftragsposition, pro Buchung, pro Produktionsauftrag.

  Vorteil: Maximale Flexibilität bei der Auswertung.

  Nachteil: Kein eingebauter Periodenvergleich — muss über Aggregation berechnet werden.

 

TYP 2 — PERIODISCHER SCHNAPPSCHUSS:

  Eine Zeile pro Objekt pro Periode (z.B. Lagerbestand je Artikel je Tag).

  Vorteil: Periodenvergleiche direkt aus der Tabelle.

  Nachteil: Großes Datenvolumen auch bei unverändertem Bestand.

 

TYP 3 — KUMULIERTER SCHNAPPSCHUSS:

  Eine Zeile pro Prozessinstanz mit mehreren Datumsspalten für Meilensteine.

  Beispiel: Auftrag → Produktion → Versand → Rechnung — je ein Datum in einer Zeile.

  Vorteil: Durchlaufzeiten und Prozessanalysen ohne komplexe Joins.

  Nachteil: Zeile wird mehrfach aktualisiert — aufwendiger im ETL.

 

 

3.3 Star Schema — Vollständiges Beispiel Auftrags-DWH

 

-- ══════════════════════════════════════════════

-- DIMENSIONSTABELLEN

-- ══════════════════════════════════════════════

 

CREATE TABLE dim.Datum (

    DatumKey       INT            NOT NULL PRIMARY KEY,  -- YYYYMMDD

    Datum          DATE           NOT NULL,

    Jahr           SMALLINT       NOT NULL,

    Quartal        TINYINT        NOT NULL,              -- 1–4

    Monat          TINYINT        NOT NULL,              -- 1–12

    MonatName      NVARCHAR(20)   NOT NULL,

    Kalenderwoche  TINYINT        NOT NULL,

    Wochentag      TINYINT        NOT NULL,              -- 1=Mo, 7=So

    IstArbeitstag  BIT            NOT NULL DEFAULT 1,

    IstFeiertag    BIT            NOT NULL DEFAULT 0,

    Geschaeftsjahr SMALLINT       NOT NULL,             -- bei abweich. GJ

    CONSTRAINT uq_Datum UNIQUE (Datum)

);

 

CREATE TABLE dim.Kunde (

    KundeKey       INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

    KundenNr       NVARCHAR(20)   NOT NULL,

    Kundenname     NVARCHAR(200)  NOT NULL,

    Branche        NVARCHAR(100)  NOT NULL DEFAULT 'Unbekannt',

    Region         NVARCHAR(100)  NOT NULL DEFAULT 'Unbekannt',

    Land           CHAR(2)        NOT NULL DEFAULT 'DE',

    Kundensegment  NVARCHAR(50)   NOT NULL DEFAULT 'Unbekannt',

    GueltigVon     DATE           NOT NULL,

    GueltigBis     DATE           NOT NULL DEFAULT '9999-12-31',

    IstAktuell     BIT            NOT NULL DEFAULT 1,

    CONSTRAINT uq_Kunde_BK UNIQUE (KundenNr, GueltigVon)

);

 

CREATE TABLE dim.Artikel (

    ArtikelKey     INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

    ArtikelNr      NVARCHAR(30)   NOT NULL,

    Artikelname    NVARCHAR(300)  NOT NULL,

    Produktgruppe  NVARCHAR(100)  NOT NULL DEFAULT 'Unbekannt',

    Produktlinie   NVARCHAR(100)  NOT NULL DEFAULT 'Unbekannt',

    Einheit        NVARCHAR(10)   NOT NULL,

    GueltigVon     DATE           NOT NULL,

    GueltigBis     DATE           NOT NULL DEFAULT '9999-12-31',

    IstAktuell     BIT            NOT NULL DEFAULT 1,

    CONSTRAINT uq_Artikel_BK UNIQUE (ArtikelNr, GueltigVon)

);

 

CREATE TABLE dim.Vertriebskanal (

    KanalKey       INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

    KanalCode      NVARCHAR(10)   NOT NULL UNIQUE,

    Kanalname      NVARCHAR(100)  NOT NULL,

    Kanaltyp       NVARCHAR(50)   NOT NULL  -- Direkt | Handel | Online | Partner

);

 

-- ══════════════════════════════════════════════

-- FAKTENTABELLE (Transaktionsfakten)

-- ══════════════════════════════════════════════

 

CREATE TABLE fakt.Auftragsposition (

    AuftragsPosKey  BIGINT IDENTITY(1,1) NOT NULL PRIMARY KEY,

    -- Dimensionsreferenzen

    DatumKey        INT            NOT NULL REFERENCES dim.Datum(DatumKey),

    KundeKey        INT            NOT NULL REFERENCES dim.Kunde(KundeKey),

    ArtikelKey      INT            NOT NULL REFERENCES dim.Artikel(ArtikelKey),

    KanalKey        INT            NOT NULL REFERENCES dim.Vertriebskanal(KanalKey),

    -- Business Keys (für Rückverfolgung ins Quellsystem)

    AuftragNr       NVARCHAR(20)   NOT NULL,

    PosNr           SMALLINT       NOT NULL,

    -- Kennzahlen (Measures)

    Menge           DECIMAL(18,3)  NOT NULL,

    Umsatz_Netto    DECIMAL(18,2)  NOT NULL,

    Wareneinsatz    DECIMAL(18,2)  NOT NULL,

    Deckungsbeitrag AS (Umsatz_Netto - Wareneinsatz) PERSISTED,

    Rabatt_Pct      DECIMAL(6,3)   NOT NULL DEFAULT 0,

    -- Metadaten

    Ladezeit        DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME()

);

 

-- Index für häufigste Abfragemuster

CREATE NONCLUSTERED INDEX ix_Fakt_Datum

    ON fakt.Auftragsposition (DatumKey) INCLUDE (Umsatz_Netto, Deckungsbeitrag);

CREATE NONCLUSTERED INDEX ix_Fakt_Kunde

    ON fakt.Auftragsposition (KundeKey) INCLUDE (DatumKey, Umsatz_Netto);

 

 

3.4 Typische Star-Schema-Abfrage

 

-- Umsatz und Deckungsbeitrag nach Monat, Produktgruppe und Region

SELECT

    d.Jahr,

    d.MonatName,

    a.Produktgruppe,

    k.Region,

    SUM(f.Umsatz_Netto)    AS Umsatz,

    SUM(f.Deckungsbeitrag) AS DB_I,

    SUM(f.Deckungsbeitrag) / NULLIF(SUM(f.Umsatz_Netto), 0) * 100 AS DB_Quote_Pct

FROM      fakt.Auftragsposition f

JOIN      dim.Datum             d ON f.DatumKey   = d.DatumKey

JOIN      dim.Kunde             k ON f.KundeKey   = k.KundeKey

JOIN      dim.Artikel           a ON f.ArtikelKey = a.ArtikelKey

WHERE     d.Jahr = 2026

  AND     k.IstAktuell = 1   -- nur aktuelle Dimensionsversion

GROUP BY  d.Jahr, d.MonatName, d.Monat, a.Produktgruppe, k.Region

ORDER BY  d.Monat, a.Produktgruppe;

 

 

 

WANN STAR SCHEMA WÄHLEN

  Reporting und Dashboards sind der primäre Anwendungsfall.

  Das BI-Team ist klein — Einfachheit hat Vorrang vor Flexibilität.

  Performance bei großen Datenmengen ist kritisch.

  Power BI oder DeltaMaster ist das Frontend — beide sind für Star Schema optimiert.

  Quellsysteme sind stabil und ändern sich selten strukturell.

 


 

04

3NF — Relationales Modell

Wann normalisiert besser ist

 

Das relationale Modell in der dritten Normalform (3NF) ist der klassische Ansatz der Datenbankmodellierung — und in BI-Kontexten oft unterschätzt. Es ist nicht der Feind des Star Schema, sondern eine sinnvolle Alternative für spezifische Szenarien.

 

4.1 Was bedeutet Normalisierung?

 

Normalisierung ist der Prozess, Redundanzen in einem Datenbankschema zu eliminieren — durch Aufteilen von Daten in separate, verknüpfte Tabellen.

 

  1. Normalform (1NF): Jede Spalte enthält nur atomare (unteilbare) Werte. Keine wiederholenden Gruppen. Jede Zeile ist eindeutig identifizierbar.

 

  2. Normalform (2NF): 1NF erfüllt. Jedes Nicht-Schlüsselattribut ist vom gesamten Primärschlüssel funktional abhängig — nicht nur von einem Teil davon.

 

  3. Normalform (3NF): 2NF erfüllt. Kein Nicht-Schlüsselattribut ist transitiv von einem anderen Nicht-Schlüsselattribut abhängig.

 

4.2 3NF im BI-Kontext: Die Corporate Information Factory

 

Bill Inmon — der "Vater des Data Warehouse" — empfiehlt 3NF für den zentralen Unternehmens-Datenspeicher (Enterprise Data Warehouse, EDW). Das Argument: Ein normalisiertes Modell ist flexibler, wenn neue Quellsysteme angebunden werden — weil keine Denormalisierung rückgängig gemacht werden muss.

INMONS ARCHITEKTUR (3NF-zentriert):

  Quellsysteme

      ↓ ETL

  Staging (Rohdaten, unverändert)

      ↓ ETL

  Enterprise DWH (3NF — "Single Source of Truth")

      ↓ ETL

  Data Marts (Star Schema — je Fachbereich)

     

  BI-Tools / Reports

 

KIMBALLS ARCHITEKTUR (Star-Schema-zentriert):

  Quellsysteme

      ↓ ETL

  Staging

      ↓ ETL

  Dimensional Warehouse (Star Schema — Bus-Architektur)

     

  BI-Tools / Reports

 

4.3 3NF-Beispiel: Auftragsmodell

 

-- 3NF-Modell: Normalisiert, ohne Redundanzen

CREATE TABLE core.Kunden (

    KundenNr     NVARCHAR(20)  NOT NULL PRIMARY KEY,

    Kundenname   NVARCHAR(200) NOT NULL,

    BrancheID    INT           NOT NULL REFERENCES core.Branchen(BrancheID),

    RegionID     INT           NOT NULL REFERENCES core.Regionen(RegionID)

    -- Keine Redundanz: Branchenname nur einmal in core.Branchen

);

 

CREATE TABLE core.Branchen (

    BrancheID    INT IDENTITY(1,1) PRIMARY KEY,

    Branchename  NVARCHAR(100) NOT NULL UNIQUE

);

 

CREATE TABLE core.Regionen (

    RegionID     INT IDENTITY(1,1) PRIMARY KEY,

    Regionname   NVARCHAR(100) NOT NULL,

    Land         CHAR(2)       NOT NULL

);

 

CREATE TABLE core.Auftraege (

    AuftragNr    NVARCHAR(20)  NOT NULL PRIMARY KEY,

    KundenNr     NVARCHAR(20)  NOT NULL REFERENCES core.Kunden(KundenNr),

    Auftragsdatum DATE         NOT NULL,

    KanalCode    NVARCHAR(10)  NOT NULL REFERENCES core.Kanaele(KanalCode)

);

 

CREATE TABLE core.Auftragspositionen (

    AuftragNr    NVARCHAR(20)  NOT NULL REFERENCES core.Auftraege(AuftragNr),

    PosNr        SMALLINT      NOT NULL,

    ArtikelNr    NVARCHAR(30)  NOT NULL REFERENCES core.Artikel(ArtikelNr),

    Menge        DECIMAL(18,3) NOT NULL,

    Preis_Netto  DECIMAL(18,2) NOT NULL,

    PRIMARY KEY (AuftragNr, PosNr)

);

 

 

4.4 Stärken und Schwächen von 3NF im BI

 

STÄRKEN 3NF:

  ✓ Kein Redundanzproblem: Änderungen an einem Wert an genau einer Stelle

  ✓ Flexibel bei neuen Quellsystemen — kein Umbau des Gesamtmodells

  ✓ Geeignet als "Core Layer" zwischen Staging und Marts

  ✓ Historisierung sauber modellierbar ohne Denormalisierungs-Overhead

 

SCHWÄCHEN 3NF FÜR REPORTING:

  ✗ Komplexe Abfragen: Viele JOINs für einfache Reports

  ✗ Schlechtere Performance als Star Schema bei großen Aggregationen

  ✗ Für BI-Frontend-Entwickler schwerer verständlich

  ✗ Power BI und ähnliche Tools arbeiten schlechter mit stark normalis. Modellen

 

 

WANN 3NF WÄHLEN

  Als Core-Schicht zwischen Staging und Presentation Layer (Inmon-Architektur).

  Wenn sehr viele heterogene Quellsysteme integriert werden müssen.

  Wenn die Datenstruktur der Quellsysteme sich häufig ändert.

  Als Grundlage, aus der dann spezifische Star-Schema-Marts aufgebaut werden.

  Wenn operative Berichte (kein reines BI) aus derselben Datenbasis laufen sollen.

05

Data Vault

 

Skalierbare Historisierung für komplexe Landschaften

 

Data Vault ist der jüngste der drei Ansätze — entwickelt von Dan Linstedt in den 1990er Jahren, in der Praxis ab den 2010er Jahren verbreitet. Er löst spezifische Probleme, die weder Star Schema noch 3NF elegant adressieren: Agilität bei sich ändernden Quellsystemen und lückenlose Historisierung aller Änderungen.

 

5.1 Die drei Bausteine

 

Data Vault kennt genau drei Tabellentypen:

 

  Hub: Enthält den Business Key eines Geschäftsobjekts — und nichts weiter. Ein Hub je Geschäftsobjekt (Kunde, Artikel, Auftrag). Wird einmal angelegt und nie geändert.

 

  Link: Verbindet zwei oder mehr Hubs — repräsentiert eine Beziehung zwischen Geschäftsobjekten. Enthält nur Fremdschlüssel auf Hubs. Wird einmal angelegt und nie geändert.

 

  Satellite: Enthält alle beschreibenden Attribute und Kontextinformationen zu einem Hub oder Link — mit vollständiger Historisierung. Jede Änderung erzeugt einen neuen Datensatz.

 

DATA VAULT STRUKTUR (KONZEPT):

 

  HUB_Kunde ←─── LNK_KundeAuftrag ───→ HUB_Auftrag

                                           

  SAT_Kunde_Stamm                      SAT_Auftrag_Details

  SAT_Kunde_Segment                    SAT_Auftrag_Lieferstatus

  SAT_Kunde_Klassifikation

 

 

5.2 Data Vault — Vollständiges SQL-Beispiel

 

-- ══════════════════════════════════════════════

-- HUBS

-- ══════════════════════════════════════════════

 

CREATE TABLE dv.HUB_Kunde (

    HUB_KundeKey   BINARY(16)     NOT NULL PRIMARY KEY, -- HASHBYTES('SHA2_256', KundenNr)

    KundenNr       NVARCHAR(20)   NOT NULL UNIQUE,       -- Business Key

    Ladedatum      DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME(),

    Quelle         NVARCHAR(50)   NOT NULL               -- Quellsystem-Kennung

);

 

CREATE TABLE dv.HUB_Artikel (

    HUB_ArtikelKey BINARY(16)     NOT NULL PRIMARY KEY,

    ArtikelNr      NVARCHAR(30)   NOT NULL UNIQUE,

    Ladedatum      DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME(),

    Quelle         NVARCHAR(50)   NOT NULL

);

 

-- ══════════════════════════════════════════════

-- LINK

-- ══════════════════════════════════════════════

 

CREATE TABLE dv.LNK_Auftragsposition (

    LNK_AuftrPosiKey BINARY(16)   NOT NULL PRIMARY KEY, -- Hash aus AuftragNr+PosNr

    HUB_KundeKey   BINARY(16)     NOT NULL REFERENCES dv.HUB_Kunde(HUB_KundeKey),

    HUB_ArtikelKey BINARY(16)     NOT NULL REFERENCES dv.HUB_Artikel(HUB_ArtikelKey),

    AuftragNr      NVARCHAR(20)   NOT NULL,

    PosNr          SMALLINT       NOT NULL,

    Ladedatum      DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME(),

    Quelle         NVARCHAR(50)   NOT NULL

);

 

-- ══════════════════════════════════════════════

-- SATELLITES

-- ══════════════════════════════════════════════

 

CREATE TABLE dv.SAT_Kunde_Stamm (

    HUB_KundeKey   BINARY(16)     NOT NULL REFERENCES dv.HUB_Kunde(HUB_KundeKey),

    Ladedatum      DATETIME2      NOT NULL DEFAULT SYSUTCDATETIME(),

    Enddatum       DATETIME2      NULL,       -- NULL = aktueller Datensatz

    HashDiff       BINARY(16)     NOT NULL,   -- Hash aller Attributwerte — für Änderungserkennung

    Kundenname     NVARCHAR(200)  NOT NULL,

    Strasse        NVARCHAR(200)  NULL,

    PLZ            NVARCHAR(10)   NULL,

    Ort            NVARCHAR(100)  NULL,

    Land           CHAR(2)        NULL,

    Quelle         NVARCHAR(50)   NOT NULL,

    PRIMARY KEY (HUB_KundeKey, Ladedatum)

);

 

CREATE TABLE dv.SAT_Auftragsposition_Kennzahlen (

    LNK_AuftrPosiKey BINARY(16)  NOT NULL REFERENCES dv.LNK_Auftragsposition(LNK_AuftrPosiKey),

    Ladedatum      DATETIME2     NOT NULL DEFAULT SYSUTCDATETIME(),

    Enddatum       DATETIME2     NULL,

    HashDiff       BINARY(16)    NOT NULL,

    Menge          DECIMAL(18,3) NOT NULL,

    Preis_Netto    DECIMAL(18,2) NOT NULL,

    Rabatt_Pct     DECIMAL(6,3)  NOT NULL DEFAULT 0,

    Waehrung       CHAR(3)       NOT NULL DEFAULT 'EUR',

    Quelle         NVARCHAR(50)  NOT NULL,

    PRIMARY KEY (LNK_AuftrPosiKey, Ladedatum)

);

 

 

 

 

 

 

 

 

 

 

 

 

5.3 Business Vault und Information Mart

 

Auf den Raw Vault (Hubs, Links, Satellites im Rohformat) wird typischerweise ein Business Vault aufgesetzt — mit berechneten Feldern, Geschäftsregeln und Bereinigungen. Darüber liegt der Information Mart: ein klassisches Star Schema, das aus dem Data Vault heraus befüllt wird.

 

SCHICHTENMODELL DATA VAULT:

 

  Quellsysteme → Raw Vault (Hub/Link/Satellite, roh)

                    

               Business Vault (Geschäftsregeln, berechnete Felder)

                    

               Information Mart (Star Schema für Reporting)

                    

               BI-Tools (Power BI, DeltaMaster, Excel)

 

 

 

WANN DATA VAULT WÄHLEN

  Viele heterogene Quellsysteme — und neue kommen regelmäßig dazu.

  Vollständige, lückenlose Historisierung aller Änderungen ist Pflicht (Audit, Compliance).

  Das Datenmodell der Quellsysteme ändert sich häufig — Agilität ist wichtiger als Einfachheit.

  Großes, erfahrenes BI-Team — Data Vault erfordert mehr Disziplin und Lernkurve.

  Langfristiger Aufbau eines unternehmensweiten Data Warehouse über viele Jahre.

 


 

06

Vergleich & Entscheidungsmatrix

Welches Modell für welchen Kontext?

Kein Ansatz ist universell überlegen. Die Wahl hängt von Projektgröße, Teamkompetenz, Quellsystemlandschaft und Langzeitstrategie ab.

 

6.1 Direktvergleich der drei Ansätze

 

KRITERIUM                | STAR SCHEMA | 3NF (CORE) | DATA VAULT

─────────────────────────|─────────────|────────────|───────────

Einstiegshürde           |     ★★★     |    ★★      |    

Query-Komplexität        |     ★★★     |    ★★      |    

Abfrage-Performance      |     ★★★     |    ★★      |    ★★

Historisierung           |    ★★       |    ★★      |    ★★★

Flexibilität bei Änder.  |            |    ★★      |    ★★★

Mehrquellen-Integration  |    ★★       |    ★★      |    ★★★

Redundanzfreiheit        |            |    ★★★     |    ★★★

Tool-Kompatibilität BI   |    ★★★      |    ★★      |    

Teamkompetenz benötigt   |     ★★★     |    ★★      |    

Projektgröße KMU         |    ★★★      |    ★★      |    

 

★★★ = sehr gut geeignet / einfach

★★  = geeignet mit Einschränkungen

   = eher ungeeignet / aufwendig

 

6.2 Entscheidungsmatrix nach Projektkontext

 

SZENARIO 1 — KLEINES KMU, ERSTES BI-PROJEKT:

  → Star Schema

  Begründung: Schnellster Einstieg, beste Tool-Unterstützung,

  überschaubare Komplexität, kleines Team beherrschbar.

 

SZENARIO 2 — MITTELSTÄNDLER, 2–4 QUELLSYSTEME, ERFAHRENES TEAM:

  → Staging → 3NF Core → Star-Schema-Marts

  Begründung: 3NF als stabile Mitte, Star Schema für Reporting,

  gute Balance aus Flexibilität und Performance.

 

SZENARIO 3 — GROSSUNTERNEHMEN / KONZERN, VIELE QUELLSYSTEME:

  → Data Vault als Raw+Business Vault → Information Mart (Star Schema)

  Begründung: Maximale Agilität bei Quellsystemänderungen,

  lückenlose Historisierung, parallele Entwicklung möglich.

 

SZENARIO 4 — COMPLIANCE-KRITISCHE UMGEBUNG (Revision, Banken):

  → Data Vault (Raw Vault als unveränderliches Archiv)

  Begründung: Jede Änderung nachvollziehbar, kein Löschen,

  vollständige Auditierbarkeit aller Datenflüsse.

 

SZENARIO 5 — AGILES PROJEKT MIT SICH ÄNDERNDEN ANFORDERUNGEN:

  → Data Vault oder Staging → Star Schema (iterativ ausgebaut)

  Begründung: Neue Quellen können ohne Umbau des Bestandsmodells

  angebunden werden.

6.3 Hybridansätze in der Praxis

 

In der Praxis werden die Ansätze häufig kombiniert. Die verbreiteste Architektur im Mittelstand:

 

  Staging-Schicht: Rohe Kopie der Quellsysteme, unverändert, tabellarisch (ähnlich 3NF).

 

  Core-Schicht: Integriert und historisiert — entweder als 3NF oder als vereinfachter Data Vault (ohne vollständige Hub/Link/Satellite-Strenge).

 

  Presentation-Schicht: Star Schema, optimiert für das jeweilige BI-Frontend.

 

EMPFOHLENE SCHICHTENARCHITEKTUR FÜR KMU:

 

  Schema stg  → Rohdaten (1:1 aus Quellsystem, mit Ladezeitstempel)

  Schema core → Integriert, historisiert, bereinigt (3NF oder vereinfacht DV)

  Schema mart → Star Schema je Fachbereich (Vertrieb, Finanzen, Produktion)

  Schema meta → ETL-Protokoll, Konfiguration, Datenqualitäts-Logs

 

 


 

07

Dimensionsmodellierung im Detail

 

SCDs, Surrogatschlüssel, Datumsdimension

 

Die Qualität eines Star Schema steht und fällt mit der sorgfältigen Modellierung der Dimensionen. Dieser Abschnitt behandelt die drei kritischsten Themen.

 

7.1 Slowly Changing Dimensions (SCDs)

 

SCDs beschreiben, wie mit Änderungen an Dimensionsattributen umgegangen wird. Die Wahl des SCD-Typs hat direkte Auswirkung auf historische Vergleichbarkeit.

 

SCD Typ 0 — Eingefroren (Retain Original)

Beschreibung: Attribut wird nie aktualisiert — ursprünglicher Wert bleibt.

Verwendung:   Geburtstag, Erstbestelldatum, unveränderliche Klassifikationen.

SQL:          Kein Update nötig — Wert wird nur einmalig beim INSERT gesetzt.

 

SCD Typ 1 — Überschreiben (Overwrite)

Beschreibung: Aktueller Wert überschreibt alten Wert — keine Historie.

Verwendung:   Tippfehler-Korrekturen, technische Attribute ohne historische Relevanz.

Vorteil:      Einfach. Kein Platzbedarf für Historisierung.

Nachteil:     Historische Auswertungen zeigen immer den aktuellen Wert.

 

-- SCD Typ 1: Einfaches UPDATE

UPDATE dim.Kunde

SET    Kundenname = 'Mustermann GmbH & Co. KG',

       Branche    = 'Maschinenbau'

WHERE  KundenNr   = 'K-10042'

  AND  IstAktuell = 1;

 

 

SCD Typ 2 — Neue Zeile (Add New Row)

Beschreibung: Jede Änderung erzeugt eine neue Zeile. Alte Zeile bleibt erhalten

              mit Enddatum. Vollständige Historie aller Zustände.

Verwendung:   Alle historisch relevanten Dimensionsattribute (Region, Segment,

              Produktgruppe, Abteilung, Preis).

Vorteil:      Vollständige historische Korrektheit — Fakten zeigen immer den

              zum Zeitpunkt gültigen Dimensionswert.

Nachteil:     Größere Tabellen. Komplexerer ETL. JOIN-Logik beachten.

 

 

-- SCD Typ 2: Alte Zeile schließen, neue Zeile einfügen

BEGIN TRANSACTION;

 

-- 1. Alte Zeile schließen

UPDATE dim.Kunde

SET    GueltigBis = CAST(GETDATE() AS DATE),

       IstAktuell = 0

WHERE  KundenNr   = 'K-10042'

  AND  IstAktuell = 1;

 

-- 2. Neue Zeile einfügen (neues Segment)

INSERT INTO dim.Kunde

    (KundenNr, Kundenname, Branche, Region, Kundensegment, GueltigVon, GueltigBis, IstAktuell)

VALUES

    ('K-10042', 'Mustermann GmbH', 'Maschinenbau', 'Bayern', 'KEY ACCOUNT',

     CAST(GETDATE() AS DATE), '9999-12-31', 1);

 

COMMIT;

 

 

SCD Typ 3 — Zusatzspalte (Add New Attribute)

Beschreibung: Aktuelle und exakt ein vorheriger Wert werden in separaten Spalten

              gespeichert. Nur begrenzte Historisierung.

Verwendung:   Wenn nur "aktuell vs. direkt davor" relevant ist (z. B. letzter Verkaufspreis).

Nachteil:     Nur ein historischer Wert — ältere Zustände gehen verloren.

 

-- SCD Typ 3: Vorherigen Wert in Extra-Spalte sichern

ALTER TABLE dim.Artikel ADD Produktgruppe_Vorher NVARCHAR(100) NULL;

 

UPDATE dim.Artikel

SET    Produktgruppe_Vorher = Produktgruppe,

       Produktgruppe        = 'Präzisionswerkzeuge'

WHERE  ArtikelNr = 'A-2089';

 

7.2 Die Datumsdimension — vollständig und einmalig

 

Die Datumsdimension ist die meistgenutzte Dimension im gesamten Data Warehouse — und muss einmalig, zentral und vollständig befüllt sein.

-- Datumsdimension befüllen (SQL Server — für 10 Jahre)

WITH Dates AS (

    SELECT CAST('2020-01-01' AS DATE) AS Datum

    UNION ALL

    SELECT DATEADD(DAY, 1, Datum) FROM Dates WHERE Datum < '2030-12-31'

)

INSERT INTO dim.Datum

    (DatumKey, Datum, Jahr, Quartal, Monat, MonatName, Kalenderwoche,

     Wochentag, IstArbeitstag, Geschaeftsjahr)

SELECT

    CAST(FORMAT(Datum, 'yyyyMMdd') AS INT),

    Datum,

    YEAR(Datum),

    DATEPART(QUARTER, Datum),

    MONTH(Datum),

    FORMAT(Datum, 'MMMM', 'de-DE'),

    DATEPART(ISO_WEEK, Datum),

    DATEPART(WEEKDAY, Datum),                          -- 1=So (SQL Server Standard)

    CASE WHEN DATEPART(WEEKDAY, Datum) IN (1,7) THEN 0 ELSE 1 END,

    YEAR(Datum)                                        -- ggf. abweichendes GJ anpassen

FROM  Dates

OPTION (MAXRECURSION 4000);

08

ETL-Architektur

 

Vom Quellsystem ins BI-Modell

 

Das beste Datenmodell nützt nichts ohne eine zuverlässige ETL-Architektur, die es befüllt. ETL steht für Extract, Transform, Load — und ist oft der aufwendigste Teil eines BI-Projekts.

 

8.1 ETL-Phasen im Überblick

 

  Extract: Daten aus Quellsystemen lesen — möglichst schonend (Delta-Load statt Full-Load, außerhalb der Spitzenzeiten, Read-only-Verbindungen).

 

  Transform: Bereinigen, vereinheitlichen, anreichern, historisieren — nach den Regeln des Zielmodells.

 

  Load: In die Zieltabellen schreiben — mit MERGE (Upsert) statt blindem INSERT für Idempotenz.

 

8.2 Delta-Load vs. Full-Load

 

FULL LOAD:

  Beschreibung: Alle Daten werden jedes Mal vollständig neu geladen.

  Vorteil:      Einfach zu implementieren. Keine Deltalogik notwendig.

  Nachteil:     Langsam bei großen Tabellen. Hohe Last auf Quellsystem.

  Geeignet:     Kleine Tabellen (< 100.000 Zeilen), Stammdaten, Konfiguration.

 

DELTA LOAD:

  Beschreibung: Nur neue oder geänderte Datensätze seit dem letzten Lauf laden.

  Vorteil:      Schnell, schonend für Quellsystem, skalierbar.

  Nachteil:     Erfordert zuverlässiges Änderungsmerkmal im Quellsystem.

  Geeignet:     Große Transaktions- und Bewegungsdatentabellen.

 

ÄNDERUNGSMERKMALE IM QUELLSYSTEM (DELTA-ERKENNUNG):

  ✓ Änderungstimestamp (UpdDatum, ModifiedAt) — am zuverlässigsten

  ✓ SQL Server Change Data Capture (CDC) — automatisch, ohne Quelleingriff

  ✓ Sequenznummern oder Auto-Increment-IDs — nur für neue Zeilen (keine Updates)

  ✗ Trigger auf Quelltabellen — vermeiden: Performance-Risiko im Quellsystem

 

 

 

 

 

 

 

8.3 MERGE-Muster für idempotente Loads

 

-- MERGE: Upsert für Dimensionstabellen (SCD Typ 1)

-- Kann beliebig oft ausgeführt werden — gleiches Ergebnis (Idempotenz)

MERGE dim.Vertriebskanal AS Ziel

USING (

    SELECT KanalCode, Kanalname, Kanaltyp

    FROM   stg.Vertriebskanaele              -- Staging-Quelle

) AS Quelle ON Ziel.KanalCode = Quelle.KanalCode

WHEN MATCHED AND (

    Ziel.Kanalname <> Quelle.Kanalname OR

    Ziel.Kanaltyp  <> Quelle.Kanaltyp

) THEN

    UPDATE SET

        Ziel.Kanalname = Quelle.Kanalname,

        Ziel.Kanaltyp  = Quelle.Kanaltyp

WHEN NOT MATCHED BY TARGET THEN

    INSERT (KanalCode, Kanalname, Kanaltyp)

    VALUES (Quelle.KanalCode, Quelle.Kanalname, Quelle.Kanaltyp);

 

 

8.4 Ladereihenfolge im Star Schema

 

ZWINGEND EINZUHALTENDE LADEREIHENFOLGE:

 

  1. Staging (aus allen Quellsystemen parallel ladbar)

      

  2. Dimensionstabellen (parallel ladbar, keine Abhängigkeiten untereinander)

      

  3. Faktentabellen (erst nach allen Dimensionen — wegen Foreign Keys)

      

  4. Aggregations- und Hilfstabellen (optional, nach Fakten)

 

WICHTIG: Faktentabellen dürfen erst geladen werden, wenn alle referenzierten

Dimensionszeilen bereits existieren — sonst Foreign-Key-Verletzungen.

Unbekannte Dimensionswerte → Platzhalterdatensatz (Surrogatschlüssel = -1).

 

 


 

09

Performance & Wartung

 

Indizes, Partitionierung, Aktualisierungsstrategien

 

Ein gut modelliertes Data Warehouse kann trotzdem langsam sein — wenn Indizes fehlen, Tabellen nicht partitioniert sind oder Aktualisierungsstrategien suboptimal gewählt wurden.

 

9.1 Indexstrategie für Star Schema

 

-- FAKTENTABELLE: Clustered Index auf häufigste Filterspalte

-- (meist DatumKey — da zeitbasierte Abfragen dominieren)

CREATE CLUSTERED INDEX cix_Fakt_Datum

    ON fakt.Auftragsposition (DatumKey);

 

-- Non-Clustered Indizes für weitere häufige Filterkombinationen

CREATE NONCLUSTERED INDEX ix_Fakt_KundeArtikel

    ON fakt.Auftragsposition (KundeKey, ArtikelKey)

    INCLUDE (Umsatz_Netto, Deckungsbeitrag, Menge);

 

-- COLUMNSTORE INDEX für Aggregationsabfragen (BI-typisch)

-- Massive Performance-Gewinne bei GROUP BY über Millionen Zeilen

CREATE NONCLUSTERED COLUMNSTORE INDEX csi_Fakt_Auftrag

    ON fakt.Auftragsposition

    (DatumKey, KundeKey, ArtikelKey, KanalKey,

     Umsatz_Netto, Deckungsbeitrag, Menge, Rabatt_Pct);

 

-- DIMENSIONSTABELLEN: Index auf Business Key (für ETL-Lookups)

CREATE NONCLUSTERED INDEX ix_Dim_Kunde_BK

    ON dim.Kunde (KundenNr) INCLUDE (KundeKey)

    WHERE IstAktuell = 1;    -- Gefilterter Index: nur aktuelle Zeilen

 

 

9.2 Tabellenpartitionierung für große Faktentabellen

 

Ab ca. 50–100 Millionen Zeilen lohnt Partitionierung — sie ermöglicht "Partition Elimination": Abfragen lesen nur die relevanten Partitionen.

 

-- Partitionierungsfunktion: nach Jahr (für Faktentabellen mit DatumKey YYYYMMDD)

CREATE PARTITION FUNCTION pf_JahrDatum (INT)

AS RANGE RIGHT FOR VALUES (

    20220101, 20230101, 20240101, 20250101, 20260101, 20270101

);

 

-- Partitionsschema auf Filegroups verteilen

CREATE PARTITION SCHEME ps_JahrDatum

AS PARTITION pf_JahrDatum

ALL TO ([PRIMARY]);   -- Produktiv: je Partition eigene Filegroup auf separater SSD

 

-- Faktentabelle mit Partitionierung erstellen

CREATE TABLE fakt.Auftragsposition_Part (

    -- gleiche Spalten wie oben ...

    DatumKey     INT NOT NULL

) ON ps_JahrDatum (DatumKey);   -- Partitionierungsspalte

 

 

9.3 Inkrementelle Aktualisierung in Power BI

 

Für Power BI Datasets mit großen Faktentabellen ist inkrementelle Aktualisierung entscheidend — statt täglich alles neu zu laden.

 

POWER BI INKREMENTELLE AKTUALISIERUNG (KONZEPT):

  ■ Parameterpaar RangeStart / RangeEnd in Power Query definieren

  ■ Tabelle nach diesen Parametern filtern

  ■ Im Dataset-Dialog: "Inkrementelle Aktualisierung" aktivieren

  ■ Historische Daten (z.B. > 2 Jahre): Nur einmalig laden, dann eingefroren

  ■ Aktueller Rollierende Zeitraum (z.B. 30 Tage): Täglich neu geladen

  Ergebnis: Tägliches Refresh dauert Minuten statt Stunden

 

 

9.4 Wartungsjobs für das Data Warehouse

 

-- Statistiken aktualisieren (täglich, nach ETL-Abschluss)

-- Für alle Tabellen im mart-Schema

DECLARE @sql NVARCHAR(MAX) = '';

SELECT @sql += 'UPDATE STATISTICS ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)

               + ' WITH FULLSCAN;' + CHAR(13)

FROM   sys.tables t

JOIN   sys.schemas s ON t.schema_id = s.schema_id

WHERE  s.name IN ('fakt', 'dim', 'mart');

EXEC sp_executesql @sql;

 

-- Columnstore-Index-Reorganisation (wöchentlich)

-- Schließt offene Delta-Stores und komprimiert Rowgroups

ALTER INDEX csi_Fakt_Auftrag ON fakt.Auftragsposition REORGANIZE

WITH (COMPRESS_ALL_ROW_GROUPS = ON);

 

 


 

10

30-Tage-Umsetzungsplan

 

Vom leeren Schema zum ersten produktiven BI-Modell

 

In 30 Tagen vom ersten Konzeptgespräch zum produktiv laufenden BI-Datenmodell mit erstem befülltem Star Schema.

 

 

VOR DEM START

Klären Sie vor dem ersten Tag zwei Voraussetzungen: (1) Read-only-Zugang zum ERP-Quellsystem ist vorhanden und genehmigt. (2) Ein dedizierter SQL-Server oder eine Datenbankinstanz für das DWH ist bereitgestellt. Ohne diese beiden Punkte verzögert sich jedes Projekt um Wochen.

 

WOCHE 1: ANFORDERUNGEN & QUELLANALYSE

 

■ TAG 1-2: ANFORDERUNGS-WORKSHOP

  Mit Controlling und Fachbereich: Welche 3–5 Kernfragen muss das BI beantworten?

  Welche KPIs sind bereits definiert (aus Kit "BI-KPIs für Geschäftsführung")?

  Welche Quellsysteme liefern diese Daten? — Liste aller relevanten Systeme

  Welche Berichtsperioden werden benötigt? Tagesaktuelle Daten oder reicht tägliches Laden?

  Ergebnis: Priorisierte Liste von 3–5 Fachthemen für den ersten Mart

 

■ TAG 3-4: QUELLSYSTEM-ANALYSE

  Für jedes Quellsystem: Tabellenstruktur der relevanten Objekte dokumentieren

  Primärschlüssel, Fremdschlüssel, Timestamps — vorhanden und zuverlässig?

  Datenvolumen schätzen: Wie viele Zeilen, wie viel Wachstum pro Tag?

  Datenqualitätscheck: NULLs, Duplikate, inkonsistente Werte in Schlüsselspalten

 

■ TAG 5-7: MODELLENTSCHEIDUNG & SCHEMAENTWURF

  Anhand Kapitel 6 Entscheidungsmatrix: Star Schema, 3NF oder Hybrid?

  Für KMU-Erstprojekt fast immer: Staging → Star Schema

  Dimensionen identifizieren: Datum, Kunde, Artikel, Kanal, Kostenstelle, ...

  Faktentabellen skizzieren: Granularität definieren ("Eine Zeile = ...")

  SCD-Typen je Dimension festlegen: Was muss historisiert werden?

 

 

 

 

WOCHE 2: AUFBAU STAGING & DIMENSIONEN

 

■ TAG 8-10: STAGING-SCHICHT AUFBAUEN

  SQL-Schemas anlegen: stg, dim, fakt, meta

  Staging-Tabellen je Quellobjekt anlegen (1:1-Abbild mit Ladezeitstempel)

  Ersten manuellen Datenextract durchführen und Datenqualität prüfen

  ETL-Protokolltabelle anlegen (Kapitel 2, Fehler 09)

 

■ TAG 11-12: DATUMSDIMENSION

  dim.Datum anlegen und für 10 Jahre befüllen (SQL aus Kapitel 7.2)

  Feiertage für relevante Bundesländer eintragen

  Abweichendes Geschäftsjahr konfigurieren falls nötig

 

■ TAG 13-14: STAMMDATENDIMENSIONEN

  dim.Kunde mit SCD Typ 2 aufbauen (SQL aus Kapitel 3.3 / 7.1)

  dim.Artikel mit SCD Typ 2 aufbauen

  Weitere Dimensionen je nach Anforderung (Kanal, Region, Kostenstelle)

  Platzhalterdatensätze für fehlende Referenzen einfügen (Surrogatschlüssel = -1)

 

WOCHE 3: FAKTENTABELLEN & ETL

 

■ TAG 15-17: ERSTE FAKTENTABELLE

  fakt.Auftragsposition (oder erstes priorisiertes Fachthema) anlegen

  Indizes anlegen: Clustered auf DatumKey, Non-Clustered auf Dimensionskeys

  Columnstore-Index für Aggregationsabfragen prüfen (ab ~1 Mio. Zeilen empfohlen)

  Ersten manuellen Load aus Staging durchführen

 

■ TAG 18-19: ETL-AUTOMATISIERUNG

  SQL Agent Job für nächtlichen ETL einrichten:

  Schritt 1: Staging laden (Delta aus Quellsystem)

  Schritt 2: Dimensionen aktualisieren (MERGE mit SCD-Logik)

  Schritt 3: Faktentabelle laden (MERGE oder INSERT)

  Schritt 4: ETL-Protokoll abschließen (Status, Zeilenzahl)

  Schritt 5: Statistiken aktualisieren

 

■ TAG 20-21: QUALITÄTSSICHERUNG

  Mindestens 3 Kennzahlen manuell gegen ERP-Auswertungen verifizieren

  Historische Werte für 3 Monate prüfen — stimmen Trends?

  SCD Typ 2: Testfall durchführen — Dimensionsänderung und historische Korrektheit prüfen

  ETL-Fehlerfall simulieren: Was passiert, wenn der Job abbricht?

 

 

 

WOCHE 4: BI-ANBINDUNG & ABSCHLUSS

 

■ TAG 22-24: BI-TOOL ANBINDEN

  Verbindung vom BI-Tool (Power BI / DeltaMaster / Excel) zur Präsentationsschicht

  Nur mart- oder dim/fakt-Schema freigeben — nie stg oder core direkt

  Beziehungen im BI-Tool definieren (Primary Key → Foreign Key je Dimension)

  Ersten Report / Dashboard mit 3–5 KPIs aufbauen

 

■ TAG 25-27: PERFORMANCE-TEST

  Typische GF-Abfragen im BI-Tool messen: Ladezeit unter 3 Sekunden?

  Bei Performance-Problemen: Execution Plan im SQL Server prüfen, fehlende Indizes ergänzen

  Columnstore-Index-Effekt messen: Vor/nach Anlegen vergleichen

 

■ TAG 28-30: DOKUMENTATION & ÜBERGABE

  Datenmodell dokumentieren: Entity-Relationship-Diagramm (ERD) erstellen

  KPI-Datenblätte für alle im DWH berechneten Kennzahlen vervollständigen

  ETL-Architektur-Dokument: Welche Quelle → welche Staging-Tabelle → welche DWH-Tabelle?

  Übergabe-Meeting mit IT-Betrieb: Monitoring, Fehlerbehandlung, Eskalation

  Erweiterungsroadmap planen: Welche Dimensionen und Fakten kommen als nächstes? ■

 

 

ERGEBNIS NACH 30 TAGEN

Sie haben ein produktives BI-Datenmodell: eine Staging-Schicht, ein befülltes Star Schema mit Datums- und Stammdatendimensionen, eine erste Faktentabelle, automatisierten ETL-Job mit Monitoring — und ein angebundenes BI-Tool mit ersten validierten KPIs. Das Fundament für alle weiteren Ausbaustufen ist gelegt.

 


 

Ausführlicher Haftungsausschluss und Lizenzbestimmungen

 

1. Allgemeiner Haftungsausschluss

Die in diesem Dokument enthaltenen SQL-Skripte, Architekturempfehlungen und Modellierungshinweise wurden nach bestem Wissen und Gewissen auf der Grundlage langjähriger praktischer Erfahrung erarbeitet. Dennoch kann keine Gewähr für Vollständigkeit, Richtigkeit oder Aktualität übernommen werden.

Der Autor übernimmt ausdrücklich keinerlei Haftung für unmittelbare oder mittelbare Schäden, einschließlich, aber nicht beschränkt auf: Datenverlust oder -korruption, fehlerhafte Auswertungen, Systemausfälle, Produktionsunterbrechungen, entgangenen Gewinn sowie Kosten für Korrekturen oder Neuimplementierungen.

 

2. Haftung für SQL-Skripte

Alle SQL-Skripte wurden in realen Umgebungen erprobt. Dennoch können aufgrund unterschiedlicher Datenbankversionen, Systemkonfigurationen und Datenstrukturen unerwartete Verhaltensweisen auftreten. Testen Sie alle Skripte ausnahmslos zunächst in einer Nicht-Produktivumgebung. Erstellen Sie vor jedem Eingriff in Produktivsysteme ein vollständiges Backup.

 

3. Versionsabhängigkeit

Die SQL-Skripte beziehen sich primär auf Microsoft SQL Server 2022 (16.x) und 2025 (17.x), Stand März 2026. Syntaktische Anpassungen für andere Datenbanksysteme (PostgreSQL, Oracle, MySQL, Azure SQL) können erforderlich sein.

 

4. Urheberrecht und Nutzungsrechte

Dieses Dokument und alle Inhalte sind urheberrechtlich geschützt. © 2026 Sascha Hess, xenosystems.de. Alle Rechte vorbehalten.

 

5. Markenrechte

Microsoft SQL Server, Power BI und Azure sind eingetragene Marken der Microsoft Corporation. DeltaMaster ist eine eingetragene Marke der Bissantz & Company GmbH. Data Vault ist eine Methodik nach Dan Linstedt. Alle weiteren Produktnamen sind Eigentum ihrer jeweiligen Inhaber.

 

6. Anwendbares Recht und Gerichtsstand

Es gilt ausschließlich deutsches Recht. Gerichtsstand ist, soweit gesetzlich zulässig, Weimar, Thüringen, Deutschland.

 


 

Über den Autor

 

Sascha Hess ist Diplom-Biologe und IT-Professional mit über 20 Jahren Erfahrung in der Administration von ERP-, BI- und Datenbanksystemen. Er hat Data-Warehouse-Projekte, KPI-Frameworks und BI-Datenmodelle für mittelständische Unternehmen, Universitäten und Energieversorger konzipiert und umgesetzt — auf Basis von SQL Server, Oracle, Power BI und DeltaMaster.

 

Sein Ansatz verbindet naturwissenschaftliche Präzision mit pragmatischer IT-Erfahrung: saubere Architektur, die im Alltag funktioniert — ohne akademischen Overhead.

 

Web: www.xenosystems.de | E-Mail: info@xenosystems.de | Standort: Weimar, Thüringen / Remote

 

Service

Beschreibung

Data-Warehouse-Aufbau

Konzeption und Implementierung von DWH-Architekturen (Star Schema, Data Vault, Hybrid) — inkl. ETL, Staging und Präsentationsschicht. Ab 5 Tage.

BI-Dashboard-Aufbau

Power BI / DeltaMaster GF-Dashboards inkl. KPI-Definition, Datenmodell und ETL-Strecken — für KMU ab 1 Woche Projektumfang.

SQL Server DB Health Check

Professioneller Audit Ihres SQL Servers — Managementreport, Risikobewertung und Maßnahmenplan. Scope: 3–5 Tage.

ERP-Einführungsberatung

Begleitung von ERP-Projekten (MACH, Dynamics NAV/BC, APplus) — Datenmigration, Schulung, Go-Live-Support.

Interim IT-Management

Übernahme der IT-Steuerung auf Zeit — Budgetplanung, Dienstleister-Management, strategische IT-Ausrichtung.

 

Vollständiges Dokument

Datenmodellierung Grundlagen 2026

Strategische Wissens-Roadmap · Checklisten · Praxisbeispiele

49,90 €

Sichere Zahlung über PayPal · Sofort-Download nach Zahlungseingang