Diplom-Biologe | Senior IT-Consultant
|
SH |
Sascha Hess xenosystems.de - IT-Consulting & Data Management |
www.xenosystems.de |
|
|
NOTFALL-KIT – SQL SERVER 2026 |
|
|
SQL Server |
|
|
Datenarchitektur |
|
|
Master Data Management |
|
|
MDM-Strategien, Architekturmodelle und Umsetzung für den Mittelstand |
WAS SIE IN DIESEM KIT ERHALTEN:
|
|
1 |
4 MDM-Architekturmodelle Registry, Consolidation, Coexistence, Centralized — mit Entscheidungsmatrix |
|
|
2 |
10 MDM-Fallen Typische Fehler bei MDM-Einführungen — mit Gegenstrategien |
|
|
3 |
Golden Record Framework Survivorship Rules, Matching und Merging — fertig implementiert in SQL |
|
|
4 |
MDM ohne MDM-Tool Pragmatische Umsetzung mit SQL Server, dbt und Power BI |
|
|
5 |
30-Tage-MDM-Bootstrapplan Vom konzeptlosen Datenchaos zum ersten produktiven Master Record |
HAFTUNGSAUSSCHLUSS
Alle Skripte, Konzepte und Architekturempfehlungen wurden sorgfältig erarbeitet. Da jede Daten- und Systemlandschaft individuell ist, übernimmt der Autor keinerlei Haftung für Datenverlust, Systemausfälle, fehlerhafte Datenkonsolidierungen oder Compliance-Verstöße. Testen Sie alle Matching- und Merge-Operationen auf Kopien der Produktivdaten, bevor Sie sie produktiv einsetzen.
KEINE ERGEBNISGARANTIE
MDM-Projekte sind komplexe organisatorische und technische Vorhaben. Genannte Zeitrahmen und Qualitätsverbesserungen sind Erfahrungswerte aus realen KMU-Umgebungen — tatsächliche Ergebnisse hängen von Datenqualität, Systemlandschaft, Teamkompetenz und organisatorischem Commitment ab.
DSGVO-HINWEIS
Master Data Management verarbeitet regelmäßig personenbezogene Daten (Kunden, Mitarbeiter, Kontaktpersonen). Alle MDM-Prozesse müssen DSGVO-konform gestaltet sein. Klären Sie insbesondere Aufbewahrungsfristen, Löschkonzepte und die Rechtsgrundlage für die Datenzusammenführung mit Ihrem Datenschutzbeauftragten.
VERSIONSHINWEIS
Die Inhalte beziehen sich auf SQL Server 2022/2025, Azure Purview, dbt Core 1.8+ und Power BI, Stand März 2026.
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.
Eine ausführliche Version dieses Haftungsausschlusses befindet sich am Ende dieses Dokuments.
01 Einleitung
Warum MDM der fehlende Baustein in fast jeder KMU-Datenarchitektur ist
02 Grundkonzepte
Domains, Master Records, Lineage und der MDM-Lifecycle
03 Die 4 Architekturmodelle
Registry, Consolidation, Coexistence und Centralized im Vergleich
04 Die 10 MDM-Fallen
Typische Fehler bei MDM-Einführungen — mit sofortigen Gegenstrategien
05 Matching & Deduplication
Algorithmen, Schwellenwerte und Matching-Pipelines in SQL
06 Golden Record Framework
Survivorship Rules, Konfidenz-Scoring und Merge-Strategien
07 MDM ohne MDM-Tool
Pragmatische Umsetzung mit SQL Server, dbt und Power BI
08 Governance & Stewardship
Rollen, Workflows, Änderungsprozesse und Qualitäts-KPIs
09 Integration & Verteilung
MDM-Hub an ERP, CRM, BI und externe Systeme anbinden
10 30-Tage-MDM-Bootstrapplan
Vom Datenchaos zum ersten produktiven Golden Record
01
Ein mittelständisches Unternehmen führt ein neues CRM ein. Zwei Jahre später hat es denselben Kunden im CRM, im ERP, im Newsletter-Tool und im Webshop — viermal angelegt, mit vier leicht verschiedenen Schreibweisen, drei verschiedenen Adressen und zwei verschiedenen Umsatzzahlen. Power BI zeigt je nach gewählter Datenquelle andere Kundenzahlen. Das Vertriebsteam vertraut den Daten nicht mehr. Der Jahresbericht wird manuell korrigiert.
Das ist kein Datenqualitätsproblem. Das ist ein fehlendes MDM-Fundament.
Master Data Management ist die Disziplin, die sicherstellt, dass ein Unternehmen zu jedem Zeitpunkt eine einzige, autoritative, konsistente Version seiner Kernentitäten hat — Kunden, Lieferanten, Artikel, Mitarbeiter, Kostenstellen. Nicht vier Versionen. Eine.
MDM ist im Mittelstand aus drei Gründen chronisch unterbesetzt:
→ Der Begriff klingt nach Großkonzern und teurer Software. Gartner, Informatica, SAP MDG — alles weit jenseits des KMU-Budgets. Dabei ist das Konzept unabhängig von der Toolwahl.
→ Der Schmerz ist diffus verteilt. Der Buchhalter wundert sich über doppelte Kundennummern. Der Controller kämpft mit inkonsistenten Umsatzzahlen. Der IT-Leiter pflegt manuelle Mappingtabellen. Niemand sieht das Gesamtbild.
→ Die Verantwortung ist unklar. Wer ist für den Kundenstamm zuständig — Vertrieb, IT, oder "eigentlich jeder und damit niemand"?
Dieses Kit zeigt, dass MDM im KMU ohne dedizierte MDM-Suite umsetzbar ist — mit SQL Server, dbt und klaren Governance-Strukturen. Es liefert die konzeptionellen Grundlagen, pragmatische Architekturentscheidungen und sofort einsetzbare SQL-Implementierungen für die häufigsten MDM-Domänen.
|
|
DIE FÜNF KERN-DOMAINS IM KMU-MDM ■ Kundenstamm — die umsatzrelevanteste Domain: Dubletten kosten direkt Vertriebseffizienz und Reporting-Qualität. ■ Lieferantenstamm — sicherheitsrelevant: Zahlungsrisiken, Dubletten, veraltete Bankverbindungen. ■ Artikelstamm — der Dreh- und Angelpunkt von Einkauf, Lager, Vertrieb und BI. ■ Mitarbeiterstamm — HR-relevant, DSGVO-sensitiv, oft zwischen HR-System und ERP geteilt. ■ Kostenstellenstruktur — das stille Fundament jedes Controllings, oft jahrelang unbereinigt gewachsen. |
02
Master Data Domain — eine Kategorie von Kernobjekten, die unternehmensübergreifend konsistent sein müssen. Kunden, Artikel und Lieferanten sind klassische Domains. Eine Domain hat immer eine definierende Frage: "Was ist ein Kunde für unser Unternehmen?" Die Antwort auf diese Frage muss einheitlich sein, bevor Technik sinnvoll eingesetzt werden kann.
Master Record (Golden Record) — die eine, autoritative Version eines Objekts. Ein Kunde mit Kundennummer M-0042 existiert genau einmal als Master Record. Alle anderen Systeme referenzieren diesen Record — sie erstellen keine eigene Version.
Source Record — der Datensatz in einem Quellsystem, der dem Master Record zugrunde liegt oder referenziert. CRM-Kundensatz, ERP-Kundenstamm und Webshop-Account sind Source Records. Der Master Record konsolidiert sie.
Lineage — die Nachverfolgbarkeit: Welches Quellsystem hat welches Feld des Master Records befüllt? Ohne Lineage ist MDM nicht auditierbar und nicht reparierbar wenn Fehler auftreten.
Stewardship — die menschliche Komponente des MDM: wer ist verantwortlich für die Qualität und Korrektheit einer Domain? Ohne benannte Stewards ist jede technische MDM-Implementierung zum Scheitern verurteilt.
Jeder Master Record durchläuft denselben Lebenszyklus — unabhängig von Domain und Architekturmodell:
→ Erfassung: Ein neuer Record entsteht in einem Quellsystem oder direkt im MDM-Hub.
→ Matching: Ist dieser Record bereits vorhanden? Matching-Algorithmen prüfen auf Dubletten.
→ Merge-Entscheidung: Handelt es sich um einen Duplikat? Survivorship Rules bestimmen den Golden Record.
→ Anreicherung: Fehlende Attribute werden aus anderen Quellen ergänzt.
→ Validierung: Pflichtfelder, Formatregeln, Konsistenz-Checks.
→ Publikation: Der Golden Record wird an alle Zielsysteme verteilt.
→ Überwachung: Qualitäts-KPIs werden kontinuierlich gemessen.
→ Archivierung: Inaktive Records werden nicht gelöscht, sondern historisiert.
|
-- MDM-Lifecycle-Status für jeden Master Record CREATE TABLE mdm.Master_Kunden ( MasterID INT IDENTITY PRIMARY KEY, GlobaleKundenID UNIQUEIDENTIFIER DEFAULT NEWID() NOT NULL, -- systemübergreifende ID -- Kerndaten (Golden Record) Name NVARCHAR(200), Name_Normalisiert NVARCHAR(200), -- UPPER + TRIM für Matching Strasse NVARCHAR(200), PLZ NVARCHAR(10), Ort NVARCHAR(100), Land NCHAR(2), -- ISO 3166-1 alpha-2 Email NVARCHAR(200), -- Lifecycle-Felder Status NVARCHAR(20) DEFAULT 'KANDIDAT', -- KANDIDAT → MATCHING → AKTIV → ARCHIVIERT KonfidenzScore DECIMAL(5,4), -- 0.0000 bis 1.0000 Vollstaendigkeit DECIMAL(5,4), -- Anteil gefüllter Pflichtfelder -- Provenienz HauptQuelle NVARCHAR(50), -- 'ERP', 'CRM', 'WEBSHOP', 'MANUELL' AnlageDatum DATETIME2 DEFAULT SYSUTCDATETIME(), LetzteAenderung DATETIME2 DEFAULT SYSUTCDATETIME(), GeaendertVon NVARCHAR(100), -- Lineage ErpKundenNr NVARCHAR(50), -- Referenz zum ERP-Quellsystem CrmKontaktID NVARCHAR(50), -- Referenz zum CRM WebshopKundenID NVARCHAR(50) -- Referenz zum Webshop );
-- Lineage-Tabelle: welches Feld kommt aus welcher Quelle CREATE TABLE mdm.Lineage_Felder ( LineageID INT IDENTITY PRIMARY KEY, MasterID INT REFERENCES mdm.Master_Kunden(MasterID), Feldname NVARCHAR(100), Quellsystem NVARCHAR(50), QuellID NVARCHAR(100), QuellWert NVARCHAR(MAX), UebernahmeZeitpunkt DATETIME2 DEFAULT SYSUTCDATETIME(), SurvivorshipRegel NVARCHAR(200) -- welche Regel hat diesen Wert gewählt? ); |
Bevor eine Architekturentscheidung getroffen wird, ist eine ehrliche Einschätzung des eigenen Reifegrads notwendig:
|
Reifegrad |
Merkmale |
Typische KMU-Situation |
Empfohlener nächster Schritt |
|
0 — Chaos |
Keine Regeln, keine Verantwortung, keine Dokumentation |
ERP-Einführung vor 5+ Jahren ohne Datenkonzept |
Inventar erstellen, Steward benennen |
|
1 — Bewusst |
Problem erkannt, erste manuelle Bereinigungen |
Regelmäßige Excel-Bereinigungen vor Reportings |
Dubletten-Skripte automatisieren |
|
2 — Definiert |
Regeln dokumentiert, erste automatische Prüfungen |
DQ-Ampel läuft, Pflichtfelder geprüft |
Golden Record Modell implementieren |
|
3 — Gesteuert |
Golden Records vorhanden, KPIs gemessen, Stewards aktiv |
MDM-Hub in SQL Server, wöchentliche Reports |
Verteilung an alle Zielsysteme |
|
4 — Optimiert |
Automatisches Matching, proaktive Qualitätssicherung |
MDM als Unternehmensstandard |
Continuous Improvement, KI-gestütztes Matching |
03
Das Registry-Modell verwaltet nur Identifikatoren und Referenzen — die eigentlichen Daten bleiben in den Quellsystemen. Der MDM-Hub ist ein Index, kein Datenspeicher.
→ Was der Hub enthält: Globale ID, Mapping auf Quellsystem-IDs, Basis-Matching-Attribute.
→ Was in den Quellsystemen bleibt: Alle inhaltlichen Daten.
→ Wie Abfragen funktionieren: Anwendung fragt Hub nach globaler ID, holt Daten dann direkt aus Quellsystem.
|
-- Registry-Modell: nur Identifikatoren und Mapping CREATE TABLE mdm.Registry_Kunden ( GlobaleID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, -- Quellsystem-Referenzen ERP_KundenNr NVARCHAR(50), CRM_KontaktID NVARCHAR(50), Webshop_ID NVARCHAR(50), EDI_PartnerID NVARCHAR(50), -- Minimale Matching-Felder (für Dublettenprüfung) Name_Key NVARCHAR(200), -- normalisiert für Matching PLZ NVARCHAR(10), Land NCHAR(2), -- Konfidenz dieser Zusammenführung Match_Score DECIMAL(5,4), Match_Methode NVARCHAR(100), Erstellt DATETIME2 DEFAULT SYSUTCDATETIME() );
-- Cross-Reference-Abfrage: alle Quell-IDs zu einem Kunden SELECT r.GlobaleID, r.ERP_KundenNr, r.CRM_KontaktID, r.Webshop_ID, r.Match_Score FROM mdm.Registry_Kunden r WHERE r.GlobaleID = '3FA85F64-5717-4562-B3FC-2C963F66AFA6'; |
Geeignet wenn: 1–3 Quellsysteme, Daten dürfen aus Compliance-Gründen nicht dupliziert werden, minimaler Implementierungsaufwand gewünscht, Einstiegsmodell für KMU.
Der MDM-Hub liest periodisch aus allen Quellsystemen, bereinigt und konsolidiert die Daten zu Golden Records — schreibt aber nicht zurück. Die Quellsysteme bleiben unverändert.
→ Idealerweise kombiniert mit: Datenbank-Schicht (SQL Server) als Hub, ETL/ELT für die Extraktion.
→ Stärke: Quellsysteme werden nicht verändert, kein Risiko für Produktivbetrieb.
→ Schwäche: Quellsysteme bleiben inkonsistent — nur der Hub ist sauber.
|
-- Consolidation: periodische Zusammenführung aller Quellen CREATE OR ALTER PROCEDURE mdm.SP_Konsolidiere_Kunden AS BEGIN SET NOCOUNT ON;
-- Schritt 1: Alle Quell-Records in Staging laden TRUNCATE TABLE mdm.Staging_Kunden;
INSERT INTO mdm.Staging_Kunden (Quelle, QuellID, Name, PLZ, Ort, Email, LadeDatum) SELECT 'ERP', CAST(KundenNr AS NVARCHAR), Name, PLZ, Ort, Email, SYSUTCDATETIME() FROM dbo.Kunden;
INSERT INTO mdm.Staging_Kunden (Quelle, QuellID, Name, PLZ, Ort, Email, LadeDatum) SELECT 'CRM', KontaktID, Firma, Postleitzahl, Stadt, EMail, SYSUTCDATETIME() FROM crm.Kontakte WHERE Typ = 'KUNDE';
-- Schritt 2: Normalisierung UPDATE mdm.Staging_Kunden SET Name_Norm = UPPER(TRIM( REPLACE(REPLACE(REPLACE(Name, 'GmbH', ''), 'AG', ''), ' ', ' ') )), PLZ_Norm = TRIM(PLZ);
-- Schritt 3: Matching und Golden Record Bestimmung (→ Kapitel 5 & 6) EXEC mdm.SP_Matching_Kunden; EXEC mdm.SP_Golden_Record_Bestimmen;
-- Protokoll INSERT INTO mdm.Konsolidierungs_Log (Zeitpunkt, Zeilen_Staging, Status) SELECT SYSUTCDATETIME(), COUNT(*), 'ERFOLG' FROM mdm.Staging_Kunden; END |
Geeignet wenn: 3–10 Quellsysteme, BI und Reporting als primärer Anwendungsfall, Quellsysteme dürfen nicht verändert werden, KMU-Standardfall.
Golden Records werden im Hub gepflegt und aktiv an alle Quellsysteme zurückverteilt. Hub und Quellsysteme koexistieren mit definierten führenden Feldern je Attribut.
→ Stärke: Quellsysteme werden sukzessive bereinigt, Konsistenz wächst über Zeit.
→ Schwäche: Bidirektionale Synchronisation ist komplex — Konfliktlösung bei gleichzeitigen Änderungen erforderlich.
|
-- Coexistence: Änderungs-Tracking mit Konfliktbewertung CREATE TABLE mdm.Aenderungs_Queue ( QueueID INT IDENTITY PRIMARY KEY, MasterID INT, Quellsystem NVARCHAR(50), Feldname NVARCHAR(100), AlterWert NVARCHAR(MAX), NeuerWert NVARCHAR(MAX), AenderungsZeit DATETIME2, -- Führendes System für dieses Feld FuehrendesSystem NVARCHAR(50), Konflikt BIT DEFAULT 0, -- 1 wenn zwei Systeme gleichzeitig änderten Status NVARCHAR(20) DEFAULT 'OFFEN', -- OFFEN → AUTOMATISCH_GELOEST → MANUELL_GEPRUEFT → VERTEILT BearbeitetVon NVARCHAR(100), BearbeitetAm DATETIME2 );
-- Attribut-Führung: welches System ist für welches Feld autoritativ? CREATE TABLE mdm.Attribut_Fuehrung ( Domain NVARCHAR(50), -- 'KUNDEN' Feldname NVARCHAR(100), FuehrendesSystem NVARCHAR(50), Fallback1 NVARCHAR(50), Fallback2 NVARCHAR(50), Begruendung NVARCHAR(500) );
-- Beispiel-Konfiguration: welches System führt welches Feld INSERT INTO mdm.Attribut_Fuehrung VALUES ('KUNDEN', 'Name', 'ERP', 'CRM', NULL, 'ERP ist Abrechnungssystem'), ('KUNDEN', 'Lieferadresse', 'ERP', 'WEBSHOP', NULL, 'ERP hat validierte Adressen'), ('KUNDEN', 'Email', 'CRM', 'WEBSHOP', 'ERP', 'CRM pflegt Kundenkontakte'), ('KUNDEN', 'Telefon', 'CRM', 'ERP', NULL, 'CRM hat aktuellere Kontakte'), ('KUNDEN', 'Umsatzklasse', 'ERP', NULL, NULL, 'Nur ERP hat Umsatzdaten'), ('KUNDEN', 'Marketingpraeferenz','CRM', NULL, NULL, 'Nur CRM pflegt Marketing'); |
Geeignet wenn: Quellsysteme sollen bereinigt werden, mittlerer Implementierungsaufwand akzeptiert, 2–5 eng integrierte Systeme, wachsende MDM-Reife.
Der MDM-Hub ist das einzige System, in dem Stammdaten angelegt und geändert werden. Alle anderen Systeme sind Konsumenten — sie schreiben nie direkt Stammdaten.
→ Stärke: Maximale Konsistenz, keine Synchronisationskonflikte, klare Verantwortung.
→ Schwäche: Höchste Implementierungskomplexität, Quellsysteme müssen angepasst werden, Single Point of Failure.
Geeignet wenn: Greenfield-Projekte, neue ERP-Einführung als Anlass, strikte Compliance-Anforderungen, ausreichend IT-Ressourcen vorhanden.
|
Kriterium |
Registry |
Consolidation |
Coexistence |
Centralized |
|
Anzahl Quellsysteme |
1–3 |
3–10 |
2–5 |
beliebig |
|
Implementierungs-Aufwand |
Niedrig |
Mittel |
Hoch |
Sehr hoch |
|
Quellsysteme bereinigen? |
Nein |
Nein |
Ja, sukzessive |
Nicht nötig |
|
Bidirektionale Sync? |
Nein |
Nein |
Ja |
Nein (Hub = Quelle) |
|
BI-Qualität |
Mittel |
Hoch |
Sehr hoch |
Maximal |
|
Risiko bei Einführung |
Niedrig |
Niedrig |
Mittel |
Hoch |
|
Empfehlung KMU Einstieg |
✓ |
✓✓ |
— |
— |
|
Empfehlung KMU fortgeschritten |
— |
✓ |
✓✓ |
— |
|
|
DIE KMU-EMPFEHLUNG ■ Einstieg (Reifegrad 0–1): Registry-Modell — in zwei Wochen implementierbar, sofortiger Nutzen durch Cross-Reference. ■ Standard (Reifegrad 2–3): Consolidation-Modell mit SQL Server Hub — der pragmatischste Ansatz für den deutschen Mittelstand. ■ Fortgeschritten (Reifegrad 3–4): Coexistence mit definierten führenden Systemen — wenn Quellsysteme bereinigt werden sollen. ■ Centralized nur bei Greenfield oder vollständiger ERP-Neueinführung. |
04
Das MDM-Projekt soll Kunden, Lieferanten, Artikel, Mitarbeiter und Kostenstellen gleichzeitig in Angriff nehmen. Nach sechs Monaten ist für keine Domain etwas produktiv. Das Team ist erschöpft, das Management verliert das Vertrauen.
LÖSUNG:
✓ Eine Domain zum Start — die mit dem höchsten geschäftlichen Schmerz.
✓ Bewertungskriterien: Anzahl Systeme, in denen die Domain vorkommt × monatliche Fehlerkosten × Strategische Relevanz.
✓ Erst wenn die erste Domain stabil läuft, beginnt die zweite.
Das technische Team baut einen Matching-Algorithmus auf Basis von String-Ähnlichkeit. Er findet 94 % Dubletten — und produziert 12 % falsche Treffer. "Müller GmbH Stuttgart" und "Müller GmbH Hamburg" sind zwei verschiedene Unternehmen, die der Algorithmus zusammenführt.
LÖSUNG:
✓ Matching-Regeln immer gemeinsam mit dem Fachbereich entwickeln — der Buchhalter weiß, welche Felder wirklich eindeutig sind.
✓ Kombination aus mehreren schwachen Signalen ist robuster als ein starkes Signal: Name + PLZ + Rechtsform + Branche.
✓ Unsichere Matches immer manuell prüfen lassen — kein automatisches Merge ohne Schwellenwert-Kalibrierung.
Der Hub konsolidiert Daten aus ERP und CRM — aber niemand hat definiert, welches System für welches Feld führend ist. Im Zweifel "gewinnt" das System, das zuletzt geschrieben hat. Das Ergebnis: die Email-Adresse vom letzten Update, die Adresse aus der letzten Importdatei, der Name aus dem System mit dem jüngsten Timestamp.
LÖSUNG:
✓ Survivorship Rules vor der Implementierung dokumentieren — nicht als Code-Kommentar, sondern als fachliche Vereinbarung.
✓ Für jedes Attribut: Welches System ist führend? Welcher Fallback gilt? Was gilt bei Nullwerten?
✓ Survivorship-Entscheidungen in der Lineage-Tabelle protokollieren (Kapitel 6).
Das Unternehmen bereinigt einmalig alle Dubletten — und nennt das "MDM-Einführung". Drei Monate später sind neue Dubletten entstanden, weil die Geschäftsprozesse und Systemintegrationen unverändert geblieben sind.
LÖSUNG:
✓ MDM ist kein Projekt, das endet — es ist ein dauerhafter Betriebsprozess.
✓ Präventive Maßnahmen gehören zum MDM: Dublettenprüfung bei Neuanlage, Validierung bei Importen, regelmäßige Monitoring-Läufe.
✓ MDM-KPIs werden dauerhaft gemessen und berichtet (Kapitel 8).
Ein perfekter MDM-Hub läuft in SQL Server. Aber wer entscheidet, wenn ein Match unsicher ist? Wer genehmigt das Zusammenführen zweier Kundenrekords? Wer pflegt die Survivorship Rules, wenn sich Geschäftsregeln ändern? Niemand ist benannt — also bleibt die Entscheidungs-Queue wochenlang unbearbeitet.
LÖSUNG:
✓ Für jede MDM-Domain einen Data Steward benennen — namentlich, mit Zeitbudget, mit Eskalationsweg.
✓ Steward-Aufgaben in die Stellenbeschreibung aufnehmen — nicht als Nebentätigkeit behandeln.
✓ SLA für die Bearbeitung unsicherer Matches: maximal fünf Werktage bis zur Entscheidung.
Der Matching-Score-Schwellenwert für automatisches Merge ist auf 0.75 gesetzt. 30 % der Zusammenführungen sind falsch — aber da der Prozess vollautomatisch läuft, bemerkt es niemand bis zum nächsten Kundenbesuch, bei dem ein Außendienstmitarbeiter merkt, dass sein Großkunde mit einem Kleinstunternehmen zusammengeführt wurde.
LÖSUNG:
✓ Drei Zonen statt einem Schwellenwert: Automatisch Zusammenführen (> 0.92), Manuelle Prüfung (0.75–0.92), Kein Match (< 0.75).
✓ Schwellenwerte empirisch kalibrieren: 200 manuelle Prüfungen → Precision/Recall messen → Schwellenwert anpassen.
✓ Regelmäßige Stichproben aus automatischen Merges prüfen (10 % monatlich).
Wenn Dubletten zusammengeführt werden, werden die "verlierer"-Records gelöscht. Drei Monate später fragt ein Auditor nach dem Buchungsbeleg zu Kundennummer 4711 — die gibt es nicht mehr, weil sie mit 4712 zusammengeführt wurde. GoBD-Verstoß.
LÖSUNG:
✓ Zusammengeführte Records werden nie gelöscht — sie werden als "ZUSAMMENGEFUEHRT" markiert und auf den Golden Record verwiesen.
✓ Cross-Reference-Tabelle hält alle historischen IDs dauerhaft.
✓ Löschkonzept separat und DSGVO-konform implementieren — das ist eine andere Dimension als Dubletten-Management.
|
-- Sicheres Merge: kein Löschen, nur Markieren und Verweisen CREATE OR ALTER PROCEDURE mdm.SP_Merge_Kunden @BehaltenID INT, -- der Golden Record @AufloesenID INT, -- der zusammenzuführende Record @Steward NVARCHAR(100), @Begruendung NVARCHAR(500) AS BEGIN SET NOCOUNT ON; BEGIN TRANSACTION; BEGIN TRY
-- Alle Referenzen auf aufgelösten Record umlenken UPDATE dbo.Auftraege SET KundenNr = @BehaltenID WHERE KundenNr = @AufloesenID; UPDATE dbo.Rechnungen SET KundenNr = @BehaltenID WHERE KundenNr = @AufloesenID; UPDATE dbo.Kontakte SET KundenNr = @BehaltenID WHERE KundenNr = @AufloesenID;
-- Aufgelösten Record markieren — NIE löschen UPDATE mdm.Master_Kunden SET Status = 'ZUSAMMENGEFUEHRT', MergeZielID = @BehaltenID, LetzteAenderung = SYSUTCDATETIME(), GeaendertVon = @Steward WHERE MasterID = @AufloesenID;
-- Merge-Protokoll INSERT INTO mdm.Merge_Protokoll (BehaltenID, AufloesenID, Steward, Begruendung, MergeZeitpunkt) VALUES (@BehaltenID, @AufloesenID, @Steward, @Begruendung, SYSUTCDATETIME());
COMMIT TRANSACTION; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; THROW; END CATCH END |
Der MDM-Hub läuft — aber die Quellsysteme wissen nichts davon. ERP und CRM legen weiterhin Kunden an, ohne zu prüfen, ob der Kunde bereits im Hub existiert. Neue Dubletten entstehen genauso schnell wie alte beseitigt werden.
LÖSUNG:
✓ MDM-Prüfung bei Neuanlage als Pflichtschritt in allen Quellsystemen (API-Call oder Trigger).
✓ "Existiert bereits im Hub?" als erste Frage im Neuanlage-Prozess — nicht nach der Anlage.
✓ Wenn direkte Integration nicht möglich: täglicher Dubletten-Alert für frisch angelegte Records.
Nicht alle Duplikate sind ungewollt. Ein Konzern mit zwei Tochtergesellschaften ist im ERP zweimal angelegt — zurecht. Ein Franchise-Nehmer hat eine eigene Kundennummer und ist gleichzeitig Endkunde. MDM-Algorithmen erkennen das als Duplikat und wollen zusammenführen.
LÖSUNG:
✓ "Legitimate Duplicate" als expliziter Status in der Matching-Pipeline.
✓ Steward kann Match-Vorschläge mit Begründung als "kein Merge" kennzeichnen — dieser Eintrag bleibt dauerhaft.
✓ Unternehmenshierarchie als eigenes Konzept: Konzernmutter, Tochtergesellschaften, verbundene Unternehmen.
|
-- Legitimate Duplicates explizit erfassen CREATE TABLE mdm.Keine_Merge_Liste ( EintragID INT IDENTITY PRIMARY KEY, MasterID_A INT, MasterID_B INT, Begruendung NVARCHAR(500), ErfasstVon NVARCHAR(100), ErfasstAm DATETIME2 DEFAULT SYSUTCDATETIME(), -- Verhindert dass Matching-Job diese Paare erneut vorschlägt CONSTRAINT UQ_NichtMerge UNIQUE (MasterID_A, MasterID_B) ); |
Der MDM-Hub führt eine neue "Globale Kunden-ID" ein. Alle Berichte und Schnittstellen verwenden aber noch die alten ERP-Nummern. Niemand hat einen Migrationspfad für bestehende Datenbankabfragen, BI-Berichte und API-Calls definiert.
LÖSUNG:
✓ Cross-Reference-View als Kompatibilitätsschicht: alte IDs bleiben gültig und werden transparent auf die neue Globale ID gemappt.
✓ Deprecation-Timeline: alte IDs funktionieren 12 Monate nach MDM-Einführung, dann schrittweise abschalten.
✓ API-Versionierung: alte ID-Formate werden in einer Übergangsversion weiter unterstützt.
05
Matching wird in drei Stufen aufgebaut — von deterministisch (exakt) bis probabilistisch (ähnlich):
Stufe 1 — Deterministisches Matching (Exakt-Match): Identische Werte in eindeutigen Feldern. Handelregisternummer, USt-IdNr., DUNS-Nummer. Wenn diese übereinstimmen: automatisches Merge ohne menschliche Prüfung.
Stufe 2 — Semi-Deterministisches Matching: Normalisierte Werte in mehreren Feldern stimmen überein. Name (normalisiert) + PLZ + Land. Wenn alle drei übereinstimmen: sehr hohe Konfidenz, automatisches Merge möglich.
Stufe 3 — Probabilistisches Matching: Ähnlichkeitswerte über mehrere Felder kombiniert. SOUNDEX-Ähnlichkeit des Namens + PLZ-Präfix + Branche. Wahrscheinlichkeit berechnen, ab Schwellenwert manuelle Prüfung.
|
-- Vollständige Matching-Pipeline: alle drei Stufen CREATE OR ALTER PROCEDURE mdm.SP_Matching_Kunden AS BEGIN SET NOCOUNT ON;
-- ── STUFE 1: Deterministisches Matching ────────────────────────────── -- USt-IdNr. ist global eindeutig — sofortiges Merge INSERT INTO mdm.Match_Kandidaten (MasterID_A, MasterID_B, Match_Score, Match_Methode, Auto_Merge) SELECT a.MasterID, b.MasterID, 1.0, 'DETERMINISTISCH_UStId', 1 -- automatisches Merge FROM mdm.Master_Kunden a JOIN mdm.Master_Kunden b ON a.UStIdNr = b.UStIdNr AND a.UStIdNr IS NOT NULL AND a.MasterID < b.MasterID -- jedes Paar nur einmal AND a.Status = 'AKTIV' AND b.Status = 'AKTIV';
-- ── STUFE 2: Semi-Deterministisch ──────────────────────────────────── -- Normalisierter Name + PLZ + Land INSERT INTO mdm.Match_Kandidaten (MasterID_A, MasterID_B, Match_Score, Match_Methode, Auto_Merge) SELECT a.MasterID, b.MasterID, 0.95, 'SEMI_Name_PLZ_Land', 1 FROM mdm.Master_Kunden a JOIN mdm.Master_Kunden b ON a.Name_Normalisiert = b.Name_Normalisiert AND a.PLZ = b.PLZ AND a.Land = b.Land AND a.MasterID < b.MasterID AND a.Status = 'AKTIV' AND b.Status = 'AKTIV' -- Bereits in Stufe 1 gefundene Paare ausschließen WHERE NOT EXISTS ( SELECT 1 FROM mdm.Match_Kandidaten m WHERE m.MasterID_A = a.MasterID AND m.MasterID_B = b.MasterID );
-- ── STUFE 3: Probabilistisches Matching ────────────────────────────── -- Gewichteter Score aus mehreren Teilähnlichkeiten INSERT INTO mdm.Match_Kandidaten (MasterID_A, MasterID_B, Match_Score, Match_Methode, Auto_Merge) SELECT a.MasterID, b.MasterID, -- Gewichteter Score: Name 50%, PLZ 25%, Branche 15%, Email-Domain 10% ROUND( 0.50 * CASE WHEN DIFFERENCE(a.Name_Normalisiert, b.Name_Normalisiert) = 4 THEN 1.0 WHEN DIFFERENCE(a.Name_Normalisiert, b.Name_Normalisiert) = 3 THEN 0.7 ELSE 0.0 END + 0.25 * CASE WHEN LEFT(a.PLZ,3) = LEFT(b.PLZ,3) THEN 1.0 ELSE 0.0 END + 0.15 * CASE WHEN a.Branche = b.Branche AND a.Branche IS NOT NULL THEN 1.0 ELSE 0.0 END + 0.10 * CASE WHEN a.Email_Domain = b.Email_Domain AND a.Email_Domain IS NOT NULL THEN 1.0 ELSE 0.0 END , 4) AS Score, 'PROBABILISTISCH_Gewichtet', 0 -- immer manuelle Prüfung FROM mdm.Master_Kunden a JOIN mdm.Master_Kunden b ON a.MasterID < b.MasterID AND a.Status = 'AKTIV' AND b.Status = 'AKTIV' -- Blocking: nur Kandidaten mit demselben PLZ-Präfix prüfen (Performance!) AND LEFT(a.PLZ, 2) = LEFT(b.PLZ, 2) WHERE NOT EXISTS ( SELECT 1 FROM mdm.Match_Kandidaten m WHERE m.MasterID_A = a.MasterID AND m.MasterID_B = b.MasterID ) HAVING ROUND( 0.50 * CASE WHEN DIFFERENCE(a.Name_Normalisiert, b.Name_Normalisiert) = 4 THEN 1.0 WHEN DIFFERENCE(a.Name_Normalisiert, b.Name_Normalisiert) = 3 THEN 0.7 ELSE 0.0 END + 0.25 * CASE WHEN LEFT(a.PLZ,3) = LEFT(b.PLZ,3) THEN 1.0 ELSE 0.0 END + 0.15 * CASE WHEN a.Branche = b.Branche THEN 1.0 ELSE 0.0 END + 0.10 * CASE WHEN a.Email_Domain = b.Email_Domain THEN 1.0 ELSE 0.0 END , 4) >= 0.75; -- Mindest-Score für Kandidaten-Queue END |
Matching aller Records gegen alle anderen ist O(n²) — bei 100.000 Kunden sind das 5 Milliarden Vergleiche. Blocking reduziert den Suchraum drastisch:
|
-- Blocking-Schlüssel vorbereiten: nur Records mit gleichem Key werden verglichen ALTER TABLE mdm.Master_Kunden ADD Block_PLZ2 AS LEFT(ISNULL(PLZ,'00'), 2) PERSISTED, Block_NameKey AS LEFT(ISNULL(Name_Normalisiert,'X'), 3) PERSISTED, Block_SoundexN AS SOUNDEX(ISNULL(Name_Normalisiert,'X')) PERSISTED, Email_Domain AS CASE WHEN CHARINDEX('@', ISNULL(Email,'')) > 0 THEN LOWER(SUBSTRING(Email, CHARINDEX('@',Email)+1, 100)) ELSE NULL END PERSISTED;
-- Index auf Blocking-Schlüssel CREATE INDEX IDX_MDM_Block ON mdm.Master_Kunden (Block_PLZ2, Block_SoundexN) INCLUDE (MasterID, Name_Normalisiert, PLZ, Land, Branche); |
06
Survivorship Rules definieren, wie aus mehreren Source Records ein Golden Record entsteht. Für jedes Attribut gibt es genau eine Regel.
|
-- Survivorship Rule Engine: konfigurierbar, nicht hardcodiert CREATE TABLE mdm.Survivorship_Regeln ( RegelID INT IDENTITY PRIMARY KEY, Domain NVARCHAR(50), Feldname NVARCHAR(100), Regel NVARCHAR(50), -- Regeln: -- FUEHRENDES_SYSTEM → Wert aus definiertem Quellsystem -- AKTUELLSTER → Wert mit jüngstem Änderungsdatum -- VOLLSTAENDIGSTER → Wert der nicht NULL ist (erste Nicht-NULL) -- LAENGSTER → längster nicht-leerer String -- HAEUFIGSTER → häufigster Wert über alle Quellen -- MANUELL → immer manuell entscheiden FuehrendesSystem NVARCHAR(50), -- bei Regel = FUEHRENDES_SYSTEM Prioritaet INT, Aktiv BIT DEFAULT 1 );
-- Standardkonfiguration Kundenstamm INSERT INTO mdm.Survivorship_Regeln (Domain, Feldname, Regel, FuehrendesSystem, Prioritaet) VALUES ('KUNDEN', 'Name', 'FUEHRENDES_SYSTEM', 'ERP', 1), ('KUNDEN', 'Rechtsform', 'FUEHRENDES_SYSTEM', 'ERP', 1), ('KUNDEN', 'Strasse', 'AKTUELLSTER', NULL, 2), ('KUNDEN', 'PLZ', 'AKTUELLSTER', NULL, 2), ('KUNDEN', 'Ort', 'AKTUELLSTER', NULL, 2), ('KUNDEN', 'Email', 'FUEHRENDES_SYSTEM', 'CRM', 1), ('KUNDEN', 'Telefon', 'AKTUELLSTER', NULL, 2), ('KUNDEN', 'Branche', 'HAEUFIGSTER', NULL, 3), ('KUNDEN', 'Zahlungsziel', 'FUEHRENDES_SYSTEM', 'ERP', 1), ('KUNDEN', 'Kreditlimit', 'FUEHRENDES_SYSTEM', 'ERP', 1), ('KUNDEN', 'Umsatzklasse', 'FUEHRENDES_SYSTEM', 'ERP', 1), ('KUNDEN', 'Marketingeinwilligung','FUEHRENDES_SYSTEM','CRM', 1);
-- Survivorship anwenden: Golden Record aus Staging-Quellen berechnen CREATE OR ALTER PROCEDURE mdm.SP_Golden_Record_Bestimmen @MasterID INT AS BEGIN SET NOCOUNT ON;
-- Name: führendes System ERP UPDATE mdm.Master_Kunden SET Name = (SELECT TOP 1 Name FROM mdm.Staging_Kunden WHERE MasterID = @MasterID AND Quelle = 'ERP' ORDER BY LadeDatum DESC), GeaendertVon = 'SURVIVORSHIP_ENGINE', LetzteAenderung = SYSUTCDATETIME() WHERE MasterID = @MasterID;
-- Email: führendes System CRM, Fallback ERP UPDATE mdm.Master_Kunden SET Email = COALESCE( (SELECT TOP 1 Email FROM mdm.Staging_Kunden WHERE MasterID = @MasterID AND Quelle = 'CRM' AND Email IS NOT NULL AND Email LIKE '%@%.%' ORDER BY LadeDatum DESC), (SELECT TOP 1 Email FROM mdm.Staging_Kunden WHERE MasterID = @MasterID AND Quelle = 'ERP' AND Email IS NOT NULL AND Email LIKE '%@%.%' ORDER BY LadeDatum DESC) ) WHERE MasterID = @MasterID;
-- Lineage protokollieren INSERT INTO mdm.Lineage_Felder (MasterID, Feldname, Quellsystem, SurvivorshipRegel) SELECT @MasterID, 'Name', 'ERP', 'FUEHRENDES_SYSTEM:ERP' UNION ALL SELECT @MasterID, 'Email', 'CRM', 'FUEHRENDES_SYSTEM:CRM mit ERP-Fallback'; END |
|
-- Konfidenz-Score: wie vollständig und vertrauenswürdig ist der Golden Record? CREATE OR ALTER FUNCTION mdm.FN_Konfidenz_Kunden (@MasterID INT) RETURNS DECIMAL(5,4) AS BEGIN DECLARE @Score DECIMAL(5,4) = 0.0; DECLARE @Quellen INT;
SELECT @Score = -- Vollständigkeit der Pflichtfelder (40%) 0.40 * ( CASE WHEN Name IS NOT NULL AND Name <> '' THEN 0.25 ELSE 0 END + CASE WHEN PLZ IS NOT NULL AND PLZ <> '' THEN 0.25 ELSE 0 END + CASE WHEN Ort IS NOT NULL AND Ort <> '' THEN 0.25 ELSE 0 END + CASE WHEN Email IS NOT NULL AND Email LIKE '%@%.%' THEN 0.25 ELSE 0 END ) -- Anzahl bestätigender Quellsysteme (30%) + 0.30 * CASE WHEN (CASE WHEN ErpKundenNr IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN CrmKontaktID IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN WebshopKundenID IS NOT NULL THEN 1 ELSE 0 END) >= 3 THEN 1.0 WHEN (CASE WHEN ErpKundenNr IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN CrmKontaktID IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN WebshopKundenID IS NOT NULL THEN 1 ELSE 0 END) = 2 THEN 0.7 ELSE 0.3 END -- Aktualität: letztes Update < 1 Jahr (20%) + 0.20 * CASE WHEN DATEDIFF(DAY, LetzteAenderung, GETDATE()) < 30 THEN 1.0 WHEN DATEDIFF(DAY, LetzteAenderung, GETDATE()) < 180 THEN 0.7 WHEN DATEDIFF(DAY, LetzteAenderung, GETDATE()) < 365 THEN 0.4 ELSE 0.1 END -- Validierungsstatus (10%) + 0.10 * CASE WHEN Vollstaendigkeit >= 0.9 THEN 1.0 WHEN Vollstaendigkeit >= 0.7 THEN 0.6 ELSE 0.2 END FROM mdm.Master_Kunden WHERE MasterID = @MasterID;
RETURN ROUND(ISNULL(@Score, 0), 4); END |
07
|
-- Vollständiges MDM-Schema in SQL Server — kein externes Tool nötig CREATE SCHEMA mdm; -- MDM-Kernlogik CREATE SCHEMA staging; -- Rohdaten aus Quellsystemen CREATE SCHEMA xref; -- Cross-Reference und ID-Mapping CREATE SCHEMA steward; -- Stewardship-Queues und Entscheidungshistorie CREATE SCHEMA monitor; -- KPIs und Qualitäts-Monitoring
-- Cross-Reference: alle historischen IDs dauerhaft aufbewahren CREATE TABLE xref.Kunden_IDs ( XRefID INT IDENTITY PRIMARY KEY, GlobaleID UNIQUEIDENTIFIER NOT NULL, Quellsystem NVARCHAR(50) NOT NULL, QuellID NVARCHAR(100) NOT NULL, GueltigVon DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(), GueltigBis DATETIME2, -- NULL = aktuell gültig Status NVARCHAR(20) DEFAULT 'AKTIV', CONSTRAINT UQ_XRef UNIQUE (Quellsystem, QuellID, GueltigVon) );
-- Stewardship-Queue: manuelle Entscheidungen CREATE TABLE steward.Match_Queue ( QueueID INT IDENTITY PRIMARY KEY, MasterID_A INT NOT NULL, MasterID_B INT NOT NULL, Match_Score DECIMAL(5,4), Match_Methode NVARCHAR(100), Eingestellt DATETIME2 DEFAULT SYSUTCDATETIME(), SLA_Bis DATETIME2 AS DATEADD(DAY, 5, Eingestellt) PERSISTED, Status NVARCHAR(20) DEFAULT 'OFFEN', Steward NVARCHAR(100), Entscheidung NVARCHAR(20), -- 'MERGE', 'KEIN_MERGE', 'ZURUECKGESTELLT' Begruendung NVARCHAR(500), EntschiedenAm DATETIME2, -- SLA-Warnung SLA_Verletzt AS CASE WHEN EntschiedenAm IS NULL AND GETDATE() > DATEADD(DAY, 5, Eingestellt) THEN 1 ELSE 0 END PERSISTED ); |
|
-- dbt-Modell: staging/stg_kunden_erp.sql -- Normalisierung der ERP-Kundendaten für MDM-Matching SELECT KundenNr AS quell_id, 'ERP' AS quellsystem, TRIM(Name) AS name_roh, -- Normalisierung für Matching UPPER(TRIM( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( Name, ' GmbH & Co. KG', ''), ' GmbH', ''), ' AG', ''), ' e.K.', ''), ' KG', '') )) AS name_norm, SOUNDEX(UPPER(TRIM(Name))) AS name_soundex, TRIM(PLZ) AS plz, LEFT(TRIM(PLZ), 3) AS plz_prefix, UPPER(TRIM(Ort)) AS ort_norm, LOWER(TRIM(Email)) AS email_norm, CASE WHEN CHARINDEX('@', ISNULL(Email,'')) > 0 THEN LOWER(SUBSTRING(Email, CHARINDEX('@',Email)+1, 100)) ELSE NULL END AS email_domain, UStIdNr, Handelsregister, AnlageDatum, GeaendertAm, SYSUTCDATETIME() AS _geladen_am FROM {{ source('erp_raw', 'Kunden') }} WHERE Gesperrt = 0 AND Name IS NOT NULL AND TRIM(Name) <> ''
-- dbt-Modell: marts/mdm_kunden_golden.sql -- Finaler Golden Record View für alle Downstream-Konsumenten SELECT gk.GlobaleKundenID, gk.MasterID, gk.Name, gk.PLZ, gk.Ort, gk.Land, gk.Email, gk.Branche, gk.Zahlungsziel, gk.KonfidenzScore, gk.Vollstaendigkeit, gk.Status, -- Cross-Reference für alle Quellsysteme x_erp.QuellID AS ERP_KundenNr, x_crm.QuellID AS CRM_KontaktID, x_web.QuellID AS Webshop_ID, gk.HauptQuelle, gk.LetzteAenderung FROM {{ ref('mdm_master_kunden') }} gk LEFT JOIN {{ ref('xref_kunden') }} x_erp ON gk.GlobaleKundenID = x_erp.GlobaleID AND x_erp.Quellsystem = 'ERP' LEFT JOIN {{ ref('xref_kunden') }} x_crm ON gk.GlobaleKundenID = x_crm.GlobaleID AND x_crm.Quellsystem = 'CRM' LEFT JOIN {{ ref('xref_kunden') }} x_web ON gk.GlobaleKundenID = x_web.GlobaleID AND x_web.Quellsystem = 'WEBSHOP' WHERE gk.Status = 'AKTIV' |
Das MDM-Dashboard hat vier Seiten:
→ Übersicht: Anzahl Golden Records je Domain, Konfidenz-Verteilung, Vollständigkeits-Score, Trend über 90 Tage.
→ Stewardship-Queue: Offene Match-Kandidaten, SLA-Ampel, Entscheidungshistorie des Stewards.
→ Qualitäts-Heatmap: Welche Attribute welcher Domain haben die schlechteste Qualität — direkt klickbar auf fehlerhafte Records.
→ Lineage-Explorer: Für ausgewählten Golden Record: welches Feld kommt aus welchem Quellsystem — als Flussdiagramm.
|
-- Power BI Basis-View: MDM-Dashboard Übersicht CREATE OR ALTER VIEW monitor.V_MDM_Dashboard AS SELECT 'KUNDEN' AS Domain, COUNT(*) AS Gesamt_Records, SUM(CASE WHEN Status = 'AKTIV' THEN 1 ELSE 0 END) AS Aktiv, SUM(CASE WHEN Status = 'KANDIDAT' THEN 1 ELSE 0 END) AS In_Prüfung, SUM(CASE WHEN Status = 'ZUSAMMENGEFUEHRT' THEN 1 ELSE 0 END) AS Zusammengefuehrt, ROUND(AVG(KonfidenzScore), 4) AS Avg_Konfidenz, ROUND(AVG(Vollstaendigkeit), 4) AS Avg_Vollstaendigkeit, SUM(CASE WHEN KonfidenzScore >= 0.9 THEN 1 ELSE 0 END) AS Konfidenz_Hoch, SUM(CASE WHEN KonfidenzScore BETWEEN 0.7 AND 0.9 THEN 1 ELSE 0 END) AS Konfidenz_Mittel, SUM(CASE WHEN KonfidenzScore < 0.7 THEN 1 ELSE 0 END) AS Konfidenz_Niedrig, -- Stewardship-SLA (SELECT COUNT(*) FROM steward.Match_Queue WHERE Status = 'OFFEN' AND SLA_Verletzt = 1) AS SLA_Verletzungen, (SELECT COUNT(*) FROM steward.Match_Queue WHERE Status = 'OFFEN') AS Offene_Matches, CAST(GETDATE() AS DATE) AS Stand FROM mdm.Master_Kunden; |
08
|
Rolle |
Verantwortung |
Zeitbudget |
Entscheidungsbefugnis |
|
MDM-Sponsor |
Budget, Eskalation, strategische Richtung |
1h/Monat |
Architekturentscheidungen |
|
Data Domain Owner |
Qualitätsziel für die Domain verantworten, Regeln genehmigen |
2h/Woche |
Survivorship Rules, SLA |
|
Data Steward |
Tägliche Match-Queue bearbeiten, Ausnahmen dokumentieren |
1h/Tag |
Merge / Kein Merge |
|
Data Engineer |
Pipeline bauen, Monitoring einrichten, Fehler beheben |
nach Bedarf |
Technische Implementierung |
|
Quellsystem-Owner |
Datenqualität im Quellsystem verantworten |
1h/Woche |
Neuanlage-Prozesse |
|
-- Vier-Augen-Prinzip für kritische MDM-Änderungen CREATE TABLE steward.Aenderungs_Antraege ( AntragID INT IDENTITY PRIMARY KEY, MasterID INT NOT NULL, Domain NVARCHAR(50), Feldname NVARCHAR(100), AlterWert NVARCHAR(MAX), NeuerWert NVARCHAR(MAX), Begruendung NVARCHAR(500), Antragsteller NVARCHAR(100), AntragsDatum DATETIME2 DEFAULT SYSUTCDATETIME(), -- Genehmigung Genehmiger NVARCHAR(100), GenehmigtAm DATETIME2, Status NVARCHAR(20) DEFAULT 'BEANTRAGT', -- BEANTRAGT → GENEHMIGT / ABGELEHNT → UMGESETZT Ablehnungsgrund NVARCHAR(500), -- Kritische Felder brauchen Genehmigung — normale nicht IstKritisch BIT, -- Bankverbindung, Steuer-ID, Kreditlimit = kritisch UmgesetztAm DATETIME2 );
-- Prüfung ob Feld kritisch ist CREATE OR ALTER FUNCTION steward.FN_IstFeldKritisch (@Domain NVARCHAR(50), @Feldname NVARCHAR(100)) RETURNS BIT AS BEGIN RETURN CASE WHEN EXISTS ( SELECT 1 FROM steward.Kritische_Felder WHERE Domain = @Domain AND Feldname = @Feldname ) THEN 1 ELSE 0 END END |
|
-- Tägliches KPI-Logging für alle MDM-Domains INSERT INTO monitor.MDM_KPI_Log (Datum, Domain, KPI_Name, KPI_Wert, Einheit) SELECT CAST(GETDATE() AS DATE), 'KUNDEN', 'Vollstaendigkeit_Avg', ROUND(AVG(Vollstaendigkeit)*100, 1), 'Prozent' FROM mdm.Master_Kunden WHERE Status = 'AKTIV' UNION ALL SELECT CAST(GETDATE() AS DATE), 'KUNDEN', 'Konfidenz_Avg', ROUND(AVG(KonfidenzScore)*100, 1), 'Prozent' FROM mdm.Master_Kunden WHERE Status = 'AKTIV' UNION ALL SELECT CAST(GETDATE() AS DATE), 'KUNDEN', 'Offene_Match_Queue', COUNT(*), 'Anzahl' FROM steward.Match_Queue WHERE Status = 'OFFEN' UNION ALL SELECT CAST(GETDATE() AS DATE), 'KUNDEN', 'SLA_Verletzungen', SUM(SLA_Verletzt), 'Anzahl' FROM steward.Match_Queue WHERE Status = 'OFFEN' UNION ALL SELECT CAST(GETDATE() AS DATE), 'KUNDEN', 'Neue_Duplikat_Kandidaten', COUNT(*), 'Anzahl' FROM mdm.Match_Kandidaten WHERE CAST(Erstellt AS DATE) = CAST(GETDATE() AS DATE) AND Auto_Merge = 0; |
09
|
-- Änderungs-Notification: welche Golden Records haben sich geändert? CREATE TABLE mdm.Aenderungs_Events ( EventID INT IDENTITY PRIMARY KEY, GlobaleID UNIQUEIDENTIFIER NOT NULL, Domain NVARCHAR(50), AenderungsTyp NVARCHAR(20), -- 'NEU', 'AKTUALISIERT', 'ZUSAMMENGEFUEHRT', 'ARCHIVIERT' GeaenderteFeldr NVARCHAR(MAX), -- JSON: Liste der geänderten Felder EventZeitpunkt DATETIME2 DEFAULT SYSUTCDATETIME(), -- Verarbeitungsstatus je Zielsystem ERP_Verarbeitet BIT DEFAULT 0, CRM_Verarbeitet BIT DEFAULT 0, BI_Verarbeitet BIT DEFAULT 0, Newsletter_Verarbeitet BIT DEFAULT 0 );
-- Trigger: automatisch Event erzeugen wenn Golden Record sich ändert CREATE OR ALTER TRIGGER mdm.TR_Master_Kunden_Aenderung ON mdm.Master_Kunden AFTER UPDATE AS BEGIN SET NOCOUNT ON; INSERT INTO mdm.Aenderungs_Events (GlobaleID, Domain, AenderungsTyp) SELECT i.GlobaleKundenID, 'KUNDEN', 'AKTUALISIERT' FROM inserted i JOIN deleted d ON i.MasterID = d.MasterID WHERE i.Name <> d.Name OR i.PLZ <> d.PLZ OR i.Email <> d.Email OR i.Status <> d.Status; END
-- Ausstehende Events je Zielsystem abrufen (Polling-Interface) CREATE OR ALTER VIEW mdm.V_Pending_ERP AS SELECT e.EventID, e.GlobaleID, e.AenderungsTyp, e.EventZeitpunkt, k.Name, k.PLZ, k.Ort, k.Email, x.QuellID AS ERP_KundenNr FROM mdm.Aenderungs_Events e JOIN mdm.Master_Kunden k ON e.GlobaleID = k.GlobaleKundenID LEFT JOIN xref.Kunden_IDs x ON e.GlobaleID = x.GlobaleID AND x.Quellsystem = 'ERP' AND x.GueltigBis IS NULL WHERE e.ERP_Verarbeitet = 0 ORDER BY e.EventZeitpunkt; |
|
-- MDM-API: Kunde suchen (für Neuanlage-Prüfung in Quellsystemen) CREATE OR ALTER PROCEDURE mdm.API_Kunden_Suchen @Suchbegriff NVARCHAR(200), @PLZ NVARCHAR(10) = NULL, @MaxErgebnisse INT = 10 AS BEGIN SET NOCOUNT ON; SELECT TOP (@MaxErgebnisse) k.GlobaleKundenID, k.MasterID, k.Name, k.PLZ, k.Ort, k.Email, k.KonfidenzScore, -- Matching-Score gegen Suchanfrage ROUND( 0.6 * CASE WHEN DIFFERENCE(k.Name_Normalisiert, UPPER(TRIM(@Suchbegriff))) = 4 THEN 1.0 WHEN k.Name_Normalisiert LIKE '%' + UPPER(TRIM(@Suchbegriff)) + '%' THEN 0.8 ELSE 0.3 END + 0.4 * CASE WHEN @PLZ IS NULL THEN 1.0 WHEN k.PLZ = @PLZ THEN 1.0 WHEN LEFT(k.PLZ,3) = LEFT(@PLZ,3) THEN 0.6 ELSE 0.0 END , 4) AS Such_Score, x_erp.QuellID AS ERP_KundenNr, x_crm.QuellID AS CRM_ID FROM mdm.Master_Kunden k LEFT JOIN xref.Kunden_IDs x_erp ON k.GlobaleKundenID = x_erp.GlobaleID AND x_erp.Quellsystem = 'ERP' AND x_erp.GueltigBis IS NULL LEFT JOIN xref.Kunden_IDs x_crm ON k.GlobaleKundenID = x_crm.GlobaleID AND x_crm.Quellsystem = 'CRM' AND x_crm.GueltigBis IS NULL WHERE k.Status = 'AKTIV' AND (k.Name_Normalisiert LIKE '%' + UPPER(TRIM(@Suchbegriff)) + '%' OR DIFFERENCE(k.Name_Normalisiert, UPPER(TRIM(@Suchbegriff))) >= 3) ORDER BY Such_Score DESC; END |
10
|
|
VOR DEM START Wählen Sie eine einzige Domain für den Einstieg — fast immer ist das der Kundenstamm. Benennen Sie einen Data Steward (1 Stunde täglich) und einen Domain Owner (2 Stunden wöchentlich). Sichern Sie alle betroffenen Produktivtabellen vollständig. Führen Sie den Datenqualitäts-Check aus dem Stammdaten-Kit (Serie Band 2) als Baseline aus. |
■ TAG 1-2: REIFEGRADBESTIMMUNG UND SCOPE
■ MDM-Reifegradmodell aus Kapitel 2.3 ehrlich bewerten — mit Domain Owner gemeinsam
■ Alle Quellsysteme inventarisieren: wo leben Kundendaten heute — mit Anzahl Records je System
■ Überschneidungsanalyse: welche Kunden kommen in mehr als einem System vor (Schätzung)
■ Architekturmodell aus Kapitel 3 entscheiden — für KMU-Einstieg fast immer Consolidation
■ TAG 3-4: MDM-SCHEMA ANLEGEN
■ Schemas mdm, staging, xref, steward, monitor in der Zieldatenbank anlegen (Kapitel 7.1)
■ Kerntabellen anlegen: Master_Kunden, Lineage_Felder, Aenderungs_Events, Match_Queue
■ Keine_Merge_Liste anlegen — von Anfang an, nicht nachträglich
■ Survivorship_Regeln befüllen — gemeinsam mit Domain Owner, nicht alleine (Kapitel 6.1)
■ TAG 5-7: ERSTE QUELLEXTRAKTION
■ Staging-Extraktion für ERP-Kundenstamm implementieren und testen
■ Normalisierung: Name_Norm, PLZ_Norm, Email_Domain als Computed Columns anlegen
■ Blocking-Indizes anlegen (Kapitel 5.2) — Performance-Fundament für Matching
■ Erste Qualitätsanalyse: wie hoch ist Vollständigkeit der Pflichtfelder im ERP-Stamm?
■ TAG 8-10: MATCHING-PIPELINE IMPLEMENTIEREN
■ Deterministisches Matching (Stufe 1) implementieren und auf Produktivdaten testen
■ Falsch-Positiv-Rate messen: 50 Ergebnisse stichprobenartig manuell prüfen
■ Semi-deterministisches Matching (Stufe 2) implementieren
■ Schwellenwerte kalibrieren: Precision und Recall messen, Ziel Precision > 95 %
■ TAG 11-13: STEWARDSHIP-QUEUE AKTIVIEREN
■ Probabilistisches Matching (Stufe 3) implementieren — niedrigerer Schwellenwert, Queue statt Auto-Merge
■ Steward-Queue in Power BI als einfache Tabelle visualisieren
■ Ersten Steward einweisen: wie funktioniert die Queue, wie wird entschieden, was wird dokumentiert
■ SLA von 5 Werktagen kommunizieren und im Dashboard sichtbar machen
■ TAG 14: ERSTE GOLDEN RECORDS PRODUKTIV
■ Deterministisch und semi-deterministisch gematchte Records als erste Golden Records aktivieren
■ Cross-Reference-Tabelle befüllen: ERP-KundenNr → GlobaleID Mapping
■ Konfidenz-Score für alle aktiven Golden Records berechnen (Kapitel 6.2)
■ Erstes Qualitäts-KPI-Log einrichten (Kapitel 8.3)
■ TAG 15-17: ZWEITES QUELLSYSTEM INTEGRIEREN
■ CRM-Extraktion in Staging-Pipeline einbauen
■ Cross-System-Matching: CRM-Kontakte gegen bestehende Golden Records matchen
■ Coexistence-Attribut-Führung konfigurieren (Kapitel 3.3): welches System führt welches Feld?
■ Email aus CRM als führend setzen und erste Survivorship-Anwendung testen
■ TAG 18-20: POWER BI DASHBOARD AUFBAUEN
■ Monitor-Views aus Kapitel 7.3 anlegen
■ MDM-Dashboard mit vier Seiten aufbauen: Übersicht, Queue, Qualitäts-Heatmap, Lineage
■ Automatische tägliche Aktualisierung des Dashboards einrichten
■ Domain Owner und Steward einweisen — Dashboard ist ihr tägliches Arbeitsinstrument
■ TAG 21: GOVERNANCE FORMALISIEREN
■ Änderungsworkflow für kritische Attribute aktivieren (Kapitel 8.2)
■ Kritische Felder definieren: Steuer-ID, Kreditlimit → Vier-Augen-Pflicht
■ Onboarding-Leitfaden für neue Data Stewards schreiben
■ Quartalsmäßige Rezertifizierung im Kalender eintragen: Domain Owner bestätigt Survivorship Rules
■ TAG 22-25: SQL AGENT JOBS EINRICHTEN
■ Tägliche Konsolidierungs-Pipeline als SQL Agent Job (06:00 Uhr)
■ Tägliches KPI-Logging (07:00 Uhr) — nach der Konsolidierung
■ Wöchentlicher SLA-Bericht: offene Queue-Einträge, SLA-Verletzungen per Database Mail
■ Monatlicher Qualitätsbericht: Vollständigkeit, Konfidenz, Merge-Statistik
■ TAG 26-28: NEUANLAGE-PRÜFUNG IN QUELLSYSTEMEN
■ MDM-Suche API (Kapitel 9.2) für das wichtigste Quellsystem implementieren
■ Prozess mit Quellsystem-Owner abstimmen: Suche im Hub vor jeder Neuanlage
■ Wenn technisch möglich: Trigger oder API-Call direkt aus Quellsystem
■ Wenn nicht möglich: täglicher Alert über Records im Quellsystem ohne Hub-Referenz
■ TAG 29-30: ABSCHLUSS UND ROADMAP
■ Abschlussmessung: Konfidenz-Durchschnitt, Vollständigkeit, Anzahl Golden Records, offene Queue
■ Vergleich mit Baseline aus Tag 1 dokumentieren
■ Roadmap für zweite Domain skizzieren: Lieferantenstamm oder Artikelstamm
■ MDM-Dokumentation: Architekturentscheidung, Survivorship Rules, Rollenmatrix
■ Ergebnis feiern — eine funktionierende MDM-Schicht ist das Fundament jeder sauberen BI-Architektur! ■
|
|
ERGEBNIS NACH 30 TAGEN Ihr Ergebnis nach 30 Tagen: Erste produktive Golden Records für den Kundenstamm, eine aktive Stewardship-Queue mit SLA-Monitoring, ein Power-BI-Dashboard das den Qualitätszustand täglich zeigt, eine Cross-Reference-Tabelle die alle Quellsystem-IDs verbindet — und ein Domain Owner der weiß, was MDM ist und warum es seinen Alltag verbessert. |
Die in diesem Dokument enthaltenen Informationen, Skripte und Architekturempfehlungen wurden nach bestem Wissen und Gewissen erarbeitet. MDM-Projekte berühren Kerndaten des Unternehmens — Fehler in Matching- und Merge-Prozessen können zu fehlerhaften Zusammenführungen führen, die schwer rückgängig zu machen sind. Testen Sie alle Matching-Operationen ausschließlich auf Kopien der Produktivdaten, bevor Sie sie produktiv einsetzen.
Der Autor übernimmt keinerlei Haftung für Datenverlust, fehlerhafte Datenkonsolidierungen, Compliance-Verstöße oder sonstige unmittelbare oder mittelbare Schäden.
MDM-Prozesse können personenbezogene Daten (Kunden, Kontaktpersonen) zusammenführen und anreichern. Stellen Sie sicher, dass eine Rechtsgrundlage für die Datenverarbeitung und -zusammenführung besteht. Klären Sie Aufbewahrungsfristen, Löschkonzepte und das Recht auf Vergessenwerden (Art. 17 DSGVO) mit Ihrem Datenschutzbeauftragten.
Genannte Matching-Genauigkeiten, Zeitrahmen und Qualitätsverbesserungen sind Erfahrungswerte. Tatsächliche Ergebnisse hängen von Datenqualität, Systemlandschaft und organisatorischem Commitment ab.
Die Inhalte beziehen sich auf SQL Server 2022/2025, dbt Core 1.8+, Azure Purview und Power BI, Stand März 2026.
© 2026 Sascha Hess, xenosystems.de. Alle Rechte vorbehalten. Dieses Dokument ist für den persönlichen oder betriebsinternen Gebrauch des Käufers lizenziert.
SQL Server, Azure Purview, Power BI und Microsoft Fabric sind eingetragene Marken der Microsoft Corporation. dbt ist eine Marke von dbt Labs, Inc. SAP MDG ist eine Marke der SAP SE. Informatica ist eine Marke der Informatica LLC.
Es gilt ausschließlich deutsches Recht. Gerichtsstand für alle Streitigkeiten 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 mehr als 300 Oracle- und SQL-Server-Instanzen administriert und betreut — von mittelständischen KMU bis zu Universitäten und Energieversorgern.
Sein Ansatz verbindet naturwissenschaftliche Präzision mit hochgradiger IT-Spezialisierung. Schwerpunkte: Master Data Management, SQL Server Performance-Tuning, ERP-Einführungen, Business Intelligence (Power BI, DeltaMaster), Prozessdigitalisierung und IT-Interim-Management.
Web: www.xenosystems.de | E-Mail: info@xenosystems.de | Standort: Weimar, Thüringen / Remote
|
Service |
Beschreibung |
|
MDM-Readiness Assessment |
Strukturierte Analyse Ihrer aktuellen Stammdatenlandschaft — Reifegradbestimmung, Domain-Priorisierung, Architekturempfehlung und Umsetzungsfahrplan. Scope: 3-5 Tage. |
|
MDM-Hub Implementierung |
Aufbau eines produktiven MDM-Hubs mit SQL Server, Matching-Pipeline, Golden Record Framework und Power-BI-Dashboard — für KMU ohne Spezialsoftware. |
|
Stammdaten-Audit |
Vollständige Analyse der Datenqualität in ERP, CRM und weiteren Quellsystemen — mit Bereinigungsplan und Quick-Win-Identifikation. |
|
BI-Dashboard-Aufbau |
Power BI / DeltaMaster Dashboards inkl. ETL-Strecken, Data-Warehouse-Aufbau und MDM-Integration — für KMU ab 1 Woche Projektumfang. |
|
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