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 |
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.
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
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
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.
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() ); |
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) ); |
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.
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.
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'); |
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.
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.
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.
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 ); |
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
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.
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.
|
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. |
|
-- ══════════════════════════════════════════════ -- 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); |
|
-- 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
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.
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.
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 |
|
-- 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) ); |
|
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 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.
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 |
|
-- ══════════════════════════════════════════════ -- 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) ); |
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
Kein Ansatz ist universell überlegen. Die Wahl hängt von Projektgröße, Teamkompetenz, Quellsystemlandschaft und Langzeitstrategie ab.
|
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 |
|
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. |
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
Die Qualität eines Star Schema steht und fällt mit der sorgfältigen Modellierung der Dimensionen. Dieser Abschnitt behandelt die drei kritischsten Themen.
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'; |
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
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.
→ 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.
|
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 |
|
-- 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); |
|
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
Ein gut modelliertes Data Warehouse kann trotzdem langsam sein — wenn Indizes fehlen, Tabellen nicht partitioniert sind oder Aktualisierungsstrategien suboptimal gewählt wurden.
|
-- 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 |
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 |
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 |
|
-- 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
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. |
■ 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?
■ 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)
■ 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?
■ 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. |
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.
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.
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.
Dieses Dokument und alle Inhalte sind urheberrechtlich geschützt. © 2026 Sascha Hess, xenosystems.de. Alle Rechte vorbehalten.
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.
Es gilt ausschließlich deutsches Recht. Gerichtsstand ist, soweit gesetzlich zulässig, Weimar, Thüringen, Deutschland.
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
Strategische Wissens-Roadmap · Checklisten · Praxisbeispiele
49,90 €
Sichere Zahlung über PayPal · Sofort-Download nach Zahlungseingang