Blog

Ein praktischer Leitfaden zur Erstellung von Slowly Changing Dimensions Typ 2 in dbt | Teil 1

Thom van Engelenburg

Thom van Engelenburg

Aktualisiert Dezember 30, 2025
21 Minuten
‌

Viele Unternehmen verwenden das Kimball-Rahmenwerk zur Dimensionsmodellierung, um ihre Daten zu modellieren, und denken dabei zweifellos an Slowly Changing Dimensions Type 2 (SCD2)-Modelle oder verwenden sie bereits. Dies ist einer der gĂ€ngigsten AnsĂ€tze zur Modellierung historischer Daten fĂŒr analytische Zwecke. Sie ist so weit verbreitet, dass das heute populĂ€rste Analyse-Engineering-Tool dbt (data build tool) seit 2016 (!) die Möglichkeit bietet, SCD2-Modelle zu erstellen. Wie immer gibt es jedoch viele verschiedene Möglichkeiten, um Slowly Changing Dimensions Type 2 in dbt zu erstellen. DarĂŒber hinaus bestimmt die Art und Weise, wie historische Daten in Ihr Data Warehouse aufgenommen und gespeichert werden, zu einem großen Teil, wie Sie SCD2-Modelle innerhalb von dbt implementieren können.

Dieser praktische 2-teilige Leitfaden erlÀutert das Konzept der Slowly Changing Dimensions, die Speicherung historischer Daten unter Verwendung verschiedener Muster und die verschiedenen Möglichkeiten der Erstellung von SCD2-Modellen in dbt.

In Teil 1 gehen wir darauf ein, was Slowly Changing Dimensions sind und vor allem, wie Sie Daten in Ihrer Datenplattform extrahieren und speichern, um sie in SCD2-Modelle zu konvertieren. In Teil 2 werden wir uns mit dbt-Snapshots befassen und wie Sie selbst benutzerdefinierte SCD2-Modelle erstellen, die flexibler und skalierbarer sind als die native Lösung von dbt.

Kimball & Langsam wechselnde Dimensionen

Bevor wir uns mit anderen Themen befassen, lassen Sie uns kurz auf die Dimensionsmodellierung von Kimball und die Notwendigkeit von Slowly Changing Dimensions eingehen.

Dimensionale Modellierung

Eine der beliebtesten Datenmodellierungstechniken, die immer noch von vielen Unternehmen verwendet wird, wurde 1996 von Kimball eingefĂŒhrt. In seinem Buch stellte Kimball die Konzepte von Fakten und Dimensionen sowie einen Prozess vor, mit dem die Anforderungen fĂŒr die Erstellung dieser Fakten und Dimensionen ermittelt werden können. Die Idee dahinter ist, dass Sie mit dieser Technik alles auf konsistente Weise modellieren, was die Anpassung von Datenmodellen und die Nutzung der Daten durch Analysten und BI-Tools erleichtert.

Fakten

Der Zweck von Faktentabellen ist "das Repository der numerischen Fakten, die wĂ€hrend des Messvorgangs beobachtet werden" (Link). Mit anderen Worten: FĂŒr jeden GeschĂ€ftsprozess, den Sie messen möchten, sollten Sie alle numerischen Messwerte in einer Faktentabelle speichern. Faktentabellen sind in der Regel sehr eng gefasst (begrenzte Anzahl von Spalten), enthalten aber eine Vielzahl von DatensĂ€tzen. Diese Tabellen können dann zur Berechnung von Metriken wie Umsatz, verkaufte Menge usw. verwendet werden.

transaktion_idkunden_idtransaktion_datumumsatzMenge
221232024-01-0119,992

Beispiel einer Faktentabelle fĂŒr eine Auftragszeile mit 3 FremdschlĂŒsseln und 2 Fakten (Umsatz und Menge).

Abmessungen

Um ein wertvolles Data Warehouse zu erstellen, reicht es nicht aus, nur Faktentabellen zu haben. Neben der Erstellung von Faktentabellen mĂŒssen Sie auch Dimensionen erstellen. Dimensionen "liefern den Wer-, Was-, Wo-, Wann-, Warum- und Wie-Kontext rund um ein GeschĂ€ftsprozessereignis"(Link). Mit anderen Worten: Alles, was eine Messung in einem Fakt beschreibt, landet normalerweise in einer Dimension. Sie können diese Dimensionen mithilfe von SchlĂŒsseln mit Fakten verknĂŒpfen, um den Fakten mehr Kontext hinzuzufĂŒgen. So können Sie beispielsweise eine Kundendimension mit einem Transaktionsfaktum verknĂŒpfen, um die Anzahl der Transaktionen von Kunden aus einem bestimmten Land zu analysieren.

Dimensionen sind in der Regel sehr umfangreich (viele verschiedene Spalten), enthalten aber nicht viele DatensÀtze. In ihrer einfachsten Form zeigt eine Dimension den aktuellen Zustand der Daten. Was trifft zum Beispiel im Moment auf einen Kunden zu?

kunde_idkunde_nameKunde_Adressekunde_emailkunde_erstellt_am
123Adam JohnsonHauptstraße 1, Londona.johnson@email.com2024-01-01T14:00

Beispiel fĂŒr eine Kunden-Dimensionstabelle mit einer Reihe von Attributen.

Die Notwendigkeit eines langsamen Dimensionswechsels

WÀhrend viele geschÀftliche Fragen beantwortet werden können, indem man nur grundlegende Fakten und Dimensionen hat und diese miteinander verbindet, reicht dies nicht aus, um geschÀftliche Fragen zu beantworten, die sich auf VerÀnderungen der "Wahrheit" im Laufe der Zeit beziehen. Grundlegende Fakten und Dimensionen helfen bei der Beantwortung von Fragen wie der folgenden:

  • Wie viele Kunden haben wir jetzt?
  • Wie viel Umsatz haben wir letztes Jahr gemacht?
  • Welche Produktkategorie hat im letzten Monat den meisten Umsatz eingebracht?

Es wird jedoch nicht in der Lage sein, Fragen wie diese zu beantworten:

  • Welche Produkte haben im letzten Jahr ihre Inhaltsstoffe geĂ€ndert?
  • Welche Kunden sind umgezogen?
  • Wie oft Ă€ndern Kunden ihre E-Mail Adresse?

Um diese Fragen beantworten zu können, benötigen Sie nicht nur die Wahrheit ĂŒber Kunden, Produkte usw. in diesem Moment, sondern auch die Wahrheit ĂŒber Kunden oder Produkte zu einem beliebigen Zeitpunkt. Zum GlĂŒck fĂŒr uns hat Kimball das Konzept der sich langsam verĂ€ndernden Dimensionen eingefĂŒhrt, um dieser Anforderung gerecht zu werden. Im weiteren Verlauf dieses Leitfadens werden wir die Wahrheit als einen Zustand bezeichnen. Ein Kunde kann also viele historische ZustĂ€nde haben, wenn sich die Informationen ĂŒber diesen Kunden Ă€ndern.

Verschiedene Möglichkeiten zur Modellierung historischer DatenzustÀnde (SCD-Typen)

Kimball beschreibt 8 Arten von sich langsam verĂ€ndernden Dimensionen, die auf die Erfassung von VerĂ€nderungen fĂŒr verschiedene AnwendungsfĂ€lle zugeschnitten sind. Da der Zweck dieses Leitfadens nicht darin besteht, die gesamte Kimball-Methodik im Detail zu erlĂ€utern, beschrĂ€nken wir uns auf die Typen, die relevant sind und am hĂ€ufigsten verwendet werden. Da Typ 1 und 2 die beliebtesten und relevantesten Typen sind, werden wir nur diese 2 behandeln. Andere Typen sind in der Anzahl der speicherbaren ZustĂ€nde begrenzt oder sind Variationen von Typ 2.

Zur Veranschaulichung der verschiedenen Arten von Slowly Changing Dimensions nehmen wir im weiteren Verlauf dieses Leitfadens die Quelltabelle eines niederlÀndischen Stroopwaffel-Ladens mit nur 1 Kunden als Beispiel. Es handelt sich um eine sehr einfache Quelltabelle mit einer ID, einem Namen und einer Adresse eines Kunden, die auch Metadaten-Spalten enthÀlt, die beschreiben, wann ein Datensatz erstellt und/oder aktualisiert wurde.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_am
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-02T14:00

Kunden-Quelltabelle

Typ 1

Dies ist der 'Standard'-Typ einer Dimension. Sie enthĂ€lt keine Historie, sondern speichert nur den aktuellen Zustand einer Dimension. Wenn sich z.B. ein Kunde Ă€ndert, wird der zugehörige Kundendatensatz einfach ĂŒberschrieben.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_am
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:00

Beispiel fĂŒr einen Kunden Langsam Ă€ndernde Dimension Typ 1 mit einer Reihe von Attributen. Sie enthĂ€lt nur die aktuelle Wahrheit und 1 Datensatz = 1 Kunde. Beachten Sie die aktualisierten Werte fĂŒr Adresse und updated_at.

Typ 2

In einer sich langsam Ă€ndernden Dimension Typ 2 wird jedes Mal, wenn ein Kunde hinzugefĂŒgt oder aktualisiert wird, ein neuer Datensatz eingefĂŒgt. Um nachzuvollziehen, welcher Zustand zu welchem Zeitpunkt zutreffend war, profitiert dieser Typ von drei Spalten: valid_from, valid_to und is_current_record. Wenn sich beispielsweise die Adresse eines Kunden Ă€ndert, wird ein neuer Datensatz mit denselben Informationen und einer aktualisierten Kundenadresse eingefĂŒgt, fĂŒr den der GĂŒltigkeitszeitraum ermittelt und in diesen drei Spalten verfĂŒgbar gemacht wird.

kunde_idkunde_nameKunde_Adresseerstellt_amgĂŒltig_vongĂŒltig_bisis_valid_record
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:002024-01-01T14:59false
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-05T15:59false
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:009999-12-31:23:59true

Beispiel fĂŒr einen Kunden, der seine Dimension langsam Ă€ndert Typ 2, bei dem ein Kunde zweimal seine Adresse Ă€ndert.

Langsam wechselnde Dimensionen und gelöschte DatensÀtze

Wenn Sie mit historischen Daten arbeiten, werden Sie fast immer auf Situationen stoßen, in denen DatensĂ€tze in den Quelldaten gelöscht werden. Denken Sie an Kunden, die sich abmelden möchten (GDPR), an Produkte, die gelöscht werden usw. Das bedeutet, dass Sie dies bei der Erstellung von SCD2-Tabellen berĂŒcksichtigen mĂŒssen.

Kimball geht in seinem Buch nur sehr kurz auf das Löschen von DatensĂ€tzen ein, aber in der Praxis mĂŒssen Unternehmen gelöschte DatensĂ€tze in den Quelldaten berĂŒcksichtigen und das Löschen von DatensĂ€tzen ist eine sehr wichtige Designentscheidung. Es gibt zwei Möglichkeiten, Löschungen zu behandeln.

Weiche Löschungen

Immer dann, wenn ein Datensatz als gelöscht markiert wird, aber physisch in der Datenbank verbleibt. Dies geschieht in der Regel, um sicherzustellen, dass diese Daten nicht von nachgelagerten Systemen verwendet werden, wĂ€hrend sie fĂŒr PrĂŒfungs- und Analysezwecke aufbewahrt werden.

Nehmen wir als Beispiel die gleichen Beispieldaten fĂŒr einen bestimmten Kunden. Dieser Kunde bittet darum, aus den Systemen des Unternehmens gelöscht zu werden. In einem SCD2-Modell könnte dies wie folgt modelliert werden:

kunde_idkunde_nameKunde_Adresseerstellt_amgĂŒltig_vongĂŒltig_bisis_valid_recordgelöscht_am
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:002024-01-01T14:59false2024-01-06T12:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-05T15:59false2024-01-06T12:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:002024-01-6T11:59false2024-01-06T12:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-06T12:009999-12-31:23:59true2024-01-06T12:00

Diese Art der Modellierung ermöglicht es Ihnen, den softgelöschten Kunden in seinem historischen Zustand zu belassen, markiert aber jeden Datensatz als gelöscht, einschließlich des Zeitstempels der Löschung.

Hartes Löschen

Wenn ein Datensatz physisch aus einer Datenbank gelöscht wird, sprechen wir von einer harten Löschung. Dies geschieht in der Regel, um den Vorschriften zur Datenaufbewahrung oder der Opt-out-Verordnung (GDPR in Europa) zu entsprechen.

Es ist einfach, dies anhand eines Beispiels zu veranschaulichen, da es keine Daten gibt, die den Moment zeigen, in dem ein Kunde hart aus einer Datenbank gelöscht wird. Wenn Sie SCD2-Modelle erstellen, sollten Ihre Datenoperationen einen Prozess zum harten Löschen von DatensĂ€tzen in Tabellen enthalten, die Ihrem Quellsystem nachgelagert sind. Andernfalls wĂŒrden Sie nur die Daten in der Quelle löschen, nicht aber z.B. in Ihren SCD2-Modellen.

Wie bereitet man Daten fĂŒr SCD2 vor?

Wenn Sie die Anforderung haben, Slowly Changing Dimensions Type 2-Modelle zu erstellen, gibt es drei relevante und hĂ€ufig verwendete Muster, um Quelldaten zu extrahieren, ZustĂ€nde zu speichern und schließlich eine SCD2-Tabelle zu erstellen.

  • Das erste Muster ist die Verwendung von Change Data Capture zur Erfassung jeder Datenbanktransaktion.
  • Das zweite Muster, vollstĂ€ndige Extrakte, verwendet einen Snapshotting-Prozess, um den vollstĂ€ndigen Status der Quelltabelle regelmĂ€ĂŸig zu erfassen und den vollstĂ€ndigen Status an eine Verlaufstabelle anzuhĂ€ngen.
  • Das dritte Muster, Delta-Extraktionen, ist ein Snapshot-Verfahren, das nur geĂ€nderte DatensĂ€tze in einer Quelltabelle erfasst.

In den folgenden Abschnitten gehen wir auf die verschiedenen AnsĂ€tze zum Extrahieren und Speichern Ihrer Quelldaten ein und erlĂ€utern, wie diese in SCD2-Modelle ĂŒbertragen werden können.

Datenerfassung Àndern (CDC)

Die detailliertesten SCD2-Modelle sind möglich, wenn Sie CDC-Tabellen verwenden. Mit dieser Art von Quelltabelle haben Sie Zugriff auf die vollstĂ€ndige Historie jedes Datensatzes in einer Tabelle. Das bedeutet, dass Sie genau wissen, wann ein Datensatz erstellt, aktualisiert und/oder aus einer Tabelle gelöscht wurde, einschließlich des Status des Datensatzes bei jedem Schritt.

Was ist Change Data Capture?

Change Data Capture, kurz CDC, ist ein Prozess, bei dem Sie jede Änderung an Daten in der Quelltabelle erfassen. Die Änderungen können dann entweder in Stapeln oder in Echtzeit in eine andere Tabelle auf Ihrer Datenplattform geladen werden. CDC wird von vielen SQL-Datenbanken unterstĂŒtzt, die genaue Implementierung und der Funktionsumfang sind jedoch von Datenbank zu Datenbank unterschiedlich. In diesem Leitfaden beschrĂ€nken wir uns auf die Grundlagen.

In einer Tabelle in einer SQL-Datenbank wird jede Änderung eines Datensatzes in einer Tabelle mit einer SQL-Operation durchgefĂŒhrt. Die gĂ€ngigsten Operationen sind INSERT, UPDATE und DELETE. Wenn Sie einen Kunden anlegen, fĂŒgen Sie einen neuen Datensatz in die Tabelle ein (INSERT), wenn Sie den Datensatz eines Kunden aktualisieren möchten, fĂŒhren Sie eine UPDATE-Operation durch und wenn Sie einen Kunden entfernen möchten, können Sie eine DELETE-Anweisung ausfĂŒhren. Die meisten SQL-Datenbanken speichern diese VorgĂ€nge in einem Protokoll, das dann gelesen und verwendet werden kann, um alle DatenĂ€nderungen in einer Tabelle zu erfassen.

Wie können Sie eine SCD2-Tabelle mit CDC erstellen?

Nehmen wir die Kundentabelle, die wir bereits in diesem Leitfaden verwendet haben, um zu veranschaulichen, wie CDC mehr Einblick in die Änderungen von Kundendaten gibt. Bei einer direkten Abfrage der Kundentabelle wĂŒrden Sie normalerweise nur den letzten Stand der Kundentabelle sehen.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_am
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00

Kundenquellentabelle von Stroopwaffle Shop

Im Hintergrund haben wir jedoch jede Änderung am Datensatz dieses Kunden in dieser Tabelle mit Hilfe der CDC-Funktion der Datenbank erfasst und diese Änderungen in eine neue Tabelle geladen:

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_amBetriebzeilen_operation_at
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:00INSERT2024-01-01T14:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:00UPDATE2024-01-01T15:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00UPDATE2024-01-05T16:00

CDC-Tabelle der Kundenquelltabelle

In der neuen Tabelle können Sie sehen, dass es 3 Tabellenoperationen fĂŒr diesen speziellen Kunden gegeben hat: 1 INSERT und 2 UPDATEs. Außerdem können Sie sehen, dass die Art der Operation und der Zeitstempel der Datensatzoperation erfasst und zusammen mit den DatensĂ€tzen gespeichert wurden. Aus dieser Tabelle geht hervor, dass die Adresse des Kunden am selben Tag, an dem der Datensatz erstellt wurde, aktualisiert und dann 4 Tage spĂ€ter erneut angepasst wurde.

Da Sie nun alle historischen Änderungen zur VerfĂŒgung haben, können Sie ein SCD2-Modell erstellen:

kunde_idkunde_nameKunde_Adresseerstellt_amscd2_valid_fromscd2_valid_untilis_current_record
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:002024-01-01T14:59false
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-05T15:59false
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00NULLtrue

Resultierende SCD2-Kundentabelle unter Verwendung der CDC-Kundentabelle

In der resultierenden SCD2 können Sie sehen, wie die Zeitstempel der Datensatzoperationen in die Spalten valid_from und valid_until ĂŒbersetzt werden.

Wie arbeitet die CDC mit gelöschten DatensÀtzen?

Wie bereits erwĂ€hnt, besteht eine Tabellenoperation darin, DatensĂ€tze zu LÖSCHEN. Dies geschieht zum Beispiel, wenn Kunden sich abmelden möchten, falsche Daten entfernt werden usw. CDC verarbeitet DELETE-Operationen auf die gleiche Weise wie INSERT- und UPDATE-Operationen. Jedes Mal, wenn ein Datensatz in der Quelltabelle gelöscht wird, wird der Vorgang im Protokoll registriert.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_amBetriebzeilen_operation_at
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:00INSERT2024-01-01T14:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:00UPDATE2024-01-01T15:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00UPDATE2024-01-05T16:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-10T12:00LÖSCHEN2024-01-10T12:00

CDC-Tabelle mit DELETE-Operation

Sie können nun diesen Datensatz der DELETE-Operation verwenden, um diesen Kunden in der SCD2-Tabelle weich oder hart zu löschen. Mehr ĂŒber LöschvorgĂ€nge erfahren Sie spĂ€ter in diesem Leitfaden.

Wie richten Sie CDC fĂŒr Ihre Datenbank ein?

Wie bereits erwĂ€hnt, unterstĂŒtzen viele verschiedene Datenbanken CDC, haben aber unterschiedliche Funktionen und Implementierungen. Es wĂŒrde den Rahmen dieses Leitfadens sprengen, in die Tiefe zu gehen, aber wir können kurz ein paar Optionen erwĂ€hnen.

Databricks

Databricks unterstĂŒtzt CDC von Haus aus, wenn Sie das Delta Lake-Format verwenden. Es heißt Change Data Feed (CDF) und bietet Ihnen alles, was Sie brauchen. Beachten Sie, dass CDF vorausschauend ist, d.h. es beginnt erst mit der Erfassung von DatenĂ€nderungen, wenn Sie es fĂŒr eine Tabelle aktivieren. Um es zu aktivieren, fĂŒhren Sie aus:

CREATE TABLE customer (  
  customer_id INT,   
  customer_name STRING,   
  customer_address STRING,  
  created_at TIMESTAMP,  
  updated_at TIMESTAMP  
)   
TBLPROPERTIES (delta.enableChangeDataFeed = true)
Google Cloud

Wenn Sie Google Cloud nutzen, können Sie Datastream in Betracht ziehen. Dieser vollstÀndig verwaltete Datenbankreplikationsdienst ermöglicht Ihnen die Replikation von Datenbanken wie Postgres, MySQL usw., indem Sie ein CDC-Muster verwenden und die Daten in Echtzeit in Google Cloud Storage oder Google BigQuery einspeisen.

Debezium

Wenn Sie einen verwalteten Dienst wie Change Data Feed von Databricks oder Datastream von Google Cloud nicht nutzen möchten oder dieser fĂŒr Ihre Cloud-Plattform einfach nicht verfĂŒgbar ist, können Sie auch auf das Open-Source-Tool Debezium zurĂŒckgreifen. Debezium kann sich mit Datenbanken wie MySQL, PostgreSQL oder MongoDB verbinden, Änderungen erfassen und diese Änderungen in Echtzeit fĂŒr andere Anwendungen zur VerfĂŒgung stellen.

Schnappschuss-Tabellen

Wenn Sie nicht die Möglichkeit haben, mit CDC alle DatenĂ€nderungen zu erfassen, und Ihre Quelldaten Ihnen nur den letzten Stand der Daten liefern, können Sie fĂŒr Ihre Quelldaten, fĂŒr die Sie SCD2-Modelle erstellen möchten, einen Snapshot erstellen.

Was ist ein Snapshot?

Ein Snapshot einer Datenquelle bedeutet, dass Sie sich eine Quelltabelle in regelmĂ€ĂŸigen AbstĂ€nden ansehen und den Zustand dieser Quelltabelle zu diesem Zeitpunkt erfassen. Idealerweise speichern Sie dann jeden Snapshot, den Sie machen (in einem Data Lake), so dass Sie jederzeit eine Verlaufstabelle anhand dieser Snapshots von Grund auf neu erstellen können. In einer analytischen Datenbank können Sie all diese Snapshots offenlegen, indem Sie einfach alle Snapshots aneinander anhĂ€ngen, was zu einer großen historischen Snapshot-Tabelle fĂŒhrt. Auf diese Weise erfassen Sie den Zustand der Daten hĂ€ufig und können dies zur Erstellung einer SCD2-Tabelle verwenden.

Schnappschuss-Strategien

VollstĂ€ndige AuszĂŒge

In seiner einfachsten Form erstellen Sie jeden Tag eine Kopie der gesamten Tabelle, einen Snapshot, und fĂŒgen ihn in einer Verlaufstabelle an. Wenn wir zum Beispiel die Kundentabelle des Stroopwaffle-Shops tĂ€glich abfotografieren und jeden Snapshot in einer Historientabelle speichern, erhalten Sie die folgende Historientabelle:

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_amsnapshotted_at
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-02T00:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-03T00:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-04T00:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:002024-01-05T00:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:002024-01-06T00:00

Verlaufstabelle mit tĂ€glichem Snapshotting unter Verwendung vollstĂ€ndiger AuszĂŒge aus der Kundentabelle von Stroopwaffle Shop

In der resultierenden Tabelle können Sie sehen, dass ein Datensatz unabhÀngig davon kopiert wird, ob sich die Informationen eines Kunden Àndern.

Der Vorteil von vollstĂ€ndigen Extrakten ist, dass sie einfach einzurichten sind und dass Sie gelöschte DatensĂ€tze identifizieren können (DatensĂ€tze, die in einem Extrakt enthalten sind, aber nicht im nĂ€chsten). Dies ist besonders bei weichen Löschungen nĂŒtzlich. Bei harten Löschungen ist ein separater Prozess erforderlich, um auch DatensĂ€tze aus frĂŒheren Vollextrakten zu löschen. Der Nachteil der Strategie fĂŒr Vollextrakte ist, dass Sie bei einem mittleren bis hohen Datenvolumen auf Probleme mit der Skalierbarkeit stoßen werden.

Delta-Extrakte

Eine Delta-Strategie erfordert eine zuverlĂ€ssige updated_at Spalte, um zu prĂŒfen, ob ein Datensatz in einer Quelltabelle seit dem letzten Snapshot aktualisiert wurde. Auf diese Weise extrahieren Sie nur eingefĂŒgte oder aktualisierte DatensĂ€tze und Sie erhalten nicht viele doppelte DatensĂ€tze in der Verlaufstabelle. Auch hierfĂŒr ist eine sehr zuverlĂ€ssige updated_at Spalte erforderlich, denn wenn die updated_at Spalte beispielsweise nicht aktualisiert wird, wenn manuelle Korrekturen vorgenommen werden, fĂŒhrt dies zu Problemen mit der DatenqualitĂ€t bei der Verwendung dieser Spalte. Um auf unser Beispiel zurĂŒckzukommen: Wenn Sie eine Delta-Extraktionsstrategie verwenden, werden Sie viel weniger DatensĂ€tze erhalten.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_amgelöscht_amsnapshotted_at
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:00NULL2024-01-02T00:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00NULL2024-01-06T00:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-06T12:002024-01-06T12:002024-01-07T00:00

Verlaufstabelle mit tĂ€glichem Snapshotting unter Verwendung von Delta-AuszĂŒgen der Kundenquelltabelle von Stroopwaffle Shop

Die resultierende Tabelle ist viel schlanker und enthÀlt keine doppelten DatensÀtze mehr.

Wenn es keine Möglichkeit gibt, eine zuverlĂ€ssige updated_at Spalte zu verwenden, um aktualisierte DatensĂ€tze zu identifizieren, können Sie auch die Datensatzinhalte des vorherigen Zustands mit dem neuen Zustand vergleichen und nachsehen, ob sich irgendwelche Werte geĂ€ndert haben. Dazu können Sie jede Spalte einzeln auf Änderungen ĂŒberprĂŒfen oder einen vollstĂ€ndigen Datensatz-Hash erstellen (empfohlen).

Gelöschte DatensĂ€tze mĂŒssen ebenfalls berĂŒcksichtigt werden, z.B. durch HinzufĂŒgen des Zeitstempels deleted_at in dem Moment, in dem ein Datensatz gelöscht wird. Dies funktioniert jedoch nur bei weichen Löschungen. FĂŒr harte Löschungen, Ă€hnlich wie bei vollstĂ€ndigen Extrakten, mĂŒssen Sie einen separaten Prozess einrichten, um DatensĂ€tze aus allen Delta-Extrakten zu löschen.

Erstellen einer SCD2-Tabelle auf der Grundlage eines Snapshotings

Sowohl die Strategie des vollstĂ€ndigen Extrakts als auch die des Delta-Extrakts fĂŒhren zu demselben SCD2-Modell:

kunde_idkunde_nameKunde_Adresseerstellt_amscd2_valid_fromscd2_valid_untilis_current_record
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:002024-01-05T15:59false
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-01T15:00NULLtrue

Sie sehen, dass die doppelten DatensĂ€tze, die mit der Strategie des vollstĂ€ndigen Extrakts erfasst wurden, verschwunden sind und nur der erstellte Datensatz und der aktualisierte Datensatz in der SCD2 enthalten sind. Bei der Delta-Strategie können Sie sehen, dass die Delta-Strategie bereits zu einer Tabelle fĂŒhrt, die einer SCD2-Tabelle sehr Ă€hnlich ist.

EinschrĂ€nkung der Genauigkeit von SchnappschĂŒssen

Es gibt verschiedene Möglichkeiten, einen Snapshot zu erstellen. Allen gemeinsam ist jedoch, dass der Detaillierungsgrad von der HĂ€ufigkeit der Snapshot-Erstellung abhĂ€ngt. Mit anderen Worten: Wenn Sie monatlich einen Snapshot Ihrer Quelltabelle erstellen, erfassen Sie den Zustand der Daten nur einmal pro Monat und wissen nicht genau, was dazwischen passiert ist. Wenn wir unser Kundenbeispiel betrachten und die Verlaufstabelle mit CDC mit der Verlaufstabelle mit Snapshotting vergleichen, werden Sie feststellen, dass wir die erste UPDATE-Operation (den roten Datensatz), die die Adresse geĂ€ndert hat, ĂŒbersehen haben. Das liegt daran, dass zwischen 2 Snapshots 2 VorgĂ€nge am selben Tag stattfanden.

kunde_idkunde_nameKunde_Adresseerstellt_amaktualisiert_amBetriebzeilen_operation_at
123Adam JohnsonHauptstraße 1, London2024-01-01T14:002024-01-01T14:00INSERT2024-01-01T14:00
123Adam JohnsonHauptstraße 3, London2024-01-01T14:002024-01-01T15:00UPDATE2024-01-01T15:00
123Adam JohnsonHauptstraße 4, London2024-01-01T14:002024-01-05T16:00UPDATE2024-01-05T16:00

CDC-Quelltabelle von Stroopwaffle Shop, in der der rot markierte Datensatz nicht durch einen Snapshot erfasst werden wĂŒrde

Wenn wir stĂŒndliche Snapshots erstellt hĂ€tten, wĂ€re das Problem gelöst. In der Regel geht eine Erhöhung der Snapshotting-HĂ€ufigkeit jedoch Hand in Hand mit der PrĂŒfung, wie hĂ€ufig Sie aktualisieren können, bevor die Systeme nicht mehr skalieren können. Wenn zum Beispiel ein stĂŒndlicher Snapshot-Prozess mehr als 1 Stunde dauert oder die Quelldaten sehr groß sind, sollten Sie von stĂŒndlichen Snapshots absehen und weniger hĂ€ufige Snapshots in Betracht ziehen.

Und schließlich gibt es beim Snapshotting keine Möglichkeit, einen Snapshot wiederherzustellen, wenn er aus irgendeinem Grund nicht erfasst wird. Das heißt, wenn Ihr Snapshotting-Prozess 5 Tage lang ausfĂ€llt, gibt es keine Möglichkeit, den Zustand in jedem dieser 5 Tage zu ermitteln und wiederherzustellen. Mit CDC ist dies jedoch kein Problem.

Wie funktioniert der Snapshot mit gelöschten DatensÀtzen?

Die Verarbeitung gelöschter DatensĂ€tze mit der Snapshotting-Strategie ist nicht ganz einfach. An einem bestimmten Punkt mĂŒssen Sie feststellen, welche DatensĂ€tze gelöscht wurden. Der genaue Punkt, an dem Sie dies tun, ist je nach Strategie leicht unterschiedlich.

Identifizieren gelöschter DatensĂ€tze mit vollstĂ€ndigen AuszĂŒgen

Wenn Sie einen Snapshot erstellen und die vollstĂ€ndigen AuszĂŒge mit jedem Snapshot speichern, können Sie den vorherigen Zustand mit dem neuen Zustand vergleichen und feststellen, ob eine EntitĂ€t im vorherigen Zustand im neuen Zustand nicht mehr vorhanden ist. Um genauer zu sein, fĂŒhren Sie diese Aktion durch, NACHDEM Sie die gesamte Quelltabelle in die Historientabelle im Data Lake gedumpt haben. Dazu können Sie eine einfache WINDOW-Funktion verwenden. Zum Beispiel:

-- BigQuery SQL
with customers as (
    select customer_id, customer_name, customer_address, created_at, updated_at, snapshotted_at from raw.customer_snapshots
),

identify_previous_and_next_record as (
  select 
    *,
    if(
      lag(customer_id) over (partition by customer_id order by snapshotted_at) is not null, 
    true, false) as has_previous_record,

    -- This method is not very scalable since it's a window function. For larger tables, consider storing the max snapshotted_at in a pre-computed Jinja variable in dbt.
    max(snapshotted_at) over () as max_snapshotted_at
  from 
    customers
),

identify_deleted_customers as (
  select 
    *,
    if(snapshotted_at <> max_snapshotted_at AND has_next_record is false, true,false) as is_deleted_record
  from 
    identify_previous_and_next_record
)

select * from identify_deleted_customers
Identifizierung gelöschter DatensÀtze mit Delta-Extrakten

Die Identifizierung gelöschter DatensĂ€tze mit Delta-Extrakten ist etwas weniger einfach, da diese Logik entweder beim Einlesen oder bei der Umwandlung von Daten erfolgen kann. Der Prozess, der einen Snapshot der Quelldaten erstellt, sollte neue, aktualisierte und gelöschte DatensĂ€tze gleichzeitig identifizieren. Dabei wird der neueste Stand im Data Lake mit dem aktuellen Stand des Quellsystems verglichen. Da der Ingestionsprozess in der Regel von Unternehmen zu Unternehmen sehr unterschiedlich ist, ist es nicht einfach, ein Beispiel zu nennen. Die Funktion dbt snapshots ist jedoch in der Lage, diesen Prozess in der Transformationsphase durchzufĂŒhren (da die Daten bereits auf der Datenplattform vorhanden sein sollten, damit dbt snapshot funktioniert). Sie werden in Teil 2 dieser Serie mehr darĂŒber erfahren.

Welches Muster verwenden Sie wann?

Ausgehend von den Beschreibungen der CDC- und Snapshotting-Strategien könnte man meinen, dass CDC aufgrund der Detailgenauigkeit und der Latenzzeit immer der empfohlene Weg wÀre. Die Wahrheit ist jedoch, wie immer, dass es darauf ankommt.

StrategieGenauigkeitSkalierbarkeitPĂŒnktlichkeitKosten
CDC (Echtzeit) Genauigkeit auf TransaktionsniveauGeeignet fĂŒr große DatenmengenAktualisierungen in EchtzeitRelativ schwieriger Aufbau und relativ höhere Kosten fĂŒr den Betrieb von Streaming-Pipelines.
CDC (Batch) Genauigkeit auf TransaktionsniveauGeeignet fĂŒr große DatenmengenAbhĂ€ngig von der Batch-HĂ€ufigkeitRelativ schwieriger Aufbau und relativ geringere Kosten fĂŒr den Betrieb von Batching-Pipelines.
SchnappschĂŒsse (vollstĂ€ndige AuszĂŒge)AbhĂ€ngig von der HĂ€ufigkeit des Snapshotings (z.B. tĂ€glich)Geeignet fĂŒr kleine DatenmengenHĂ€ngt von der HĂ€ufigkeit des Schnappschusses abRelativ einfache Einrichtung und relativ niedrige Betriebskosten. Etwas höhere Lagerkosten aufgrund des ineffizienten Lagermusters.
Snapshotting (Delta-Extrakte) AbhĂ€ngig von der HĂ€ufigkeit des Snapshotings (z.B. tĂ€glich)Geeignet fĂŒr mittlere DatenmengenAbhĂ€ngig von der Snapshot-HĂ€ufigkeitRelativ einfach einzurichten und relativ geringe Betriebskosten.

Mit CDC können Sie zwar eine vollstĂ€ndige Historientabelle fĂŒr jeden Datensatz erstellen, aber die Kosten fĂŒr die Implementierung, die Pflege und den Betrieb eines solchen Prozesses können den Mehrwert, der sich aus der VerfĂŒgbarkeit dieser Details ergibt, ĂŒbersteigen. Insbesondere die Streaming-Variante von CDC wird zu höheren Betriebskosten fĂŒhren.

Die Implementierung und Pflege von CDC-Prozessen erfordert Data-Engineering-KapazitĂ€ten, denn es geht nicht nur darum, eine Funktion einzuschalten. Vor allem, wenn Sie eine CDC-Lösung in Echtzeit benötigen, ist die KomplexitĂ€t deutlich höher. Außerdem, und das ist ein kleines Detail, muss CDC auch von Ihrem Quellsystem unterstĂŒtzt werden.

Andererseits ist die Erstellung von Snapshots sehr unkompliziert und relativ einfach einzurichten. Je nach VerfĂŒgbarkeit der Spalte updated_at können Sie diesen Prozess sogar recht einfach gestalten, wie Sie auch in Teil 2 dieser Serie sehen werden. FĂŒr die meisten AnwendungsfĂ€lle benötigen Sie in der Regel keine so detaillierte Historie und tĂ€gliche Snapshots sind mehr als genug.

Eine letzte sehr wichtige Anforderung, die all diese Überlegungen ĂŒberflĂŒssig macht, ist die Notwendigkeit der Auditierbarkeit. Wenn Ihr Unternehmen in der Lage sein muss, Audits einzuhalten, ist die Genauigkeit auf Transaktionsebene sehr wichtig.

Bei Xebia haben wir viele AnwendungsfĂ€lle in Unternehmen gesehen, die diese ganze KomplexitĂ€t gar nicht benötigen. Wir empfehlen daher, den Anwendungsfall, fĂŒr den Sie SCD2-Modelle haben möchten, sorgfĂ€ltig zu evaluieren und dann zu entscheiden, wie Sie historische Daten extrahieren und speichern möchten.

Wie erstellt man SCD2-Modelle in dbt?

Jetzt wissen Sie, wie Sie historische Daten anhand verschiedener Muster extrahieren und speichern können.

In Teil 2 dieser Serie werde ich mich eingehender mit der praktischen Erstellung von SCD2-Modellen auf der Grundlage historischer Daten beschÀftigen. Dabei werden sowohl die bestehende dbt Snapshots-Funktion (die zum Snapshotting-Muster der Delta-Extraktion gehört) als auch benutzerdefinierte Implementierungen von SCD2-Modellen in dbt behandelt.

Bleiben Sie dran fĂŒr Teil zwei!

Verfasst von

Thom van Engelenburg

Thom obtained degrees in Business, Marketing and Entrepreneurship giving fundamental knowledge of the needs of a business. Besides studying, he complemented his business knowledge with technical skills by learning how to program and work with data. The combination of business and tech has since been present in his various data roles and allows him to easily bridge business and tech teams.

Contact

Let’s discuss how we can support your journey.

‌
‌
‌
‌
‌
‌
‌
‌
‌