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

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_id | kunden_id | transaktion_datum | umsatz | Menge |
|---|---|---|---|---|
| 22 | 123 | 2024-01-01 | 19,99 | 2 |
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_id | kunde_name | Kunde_Adresse | kunde_email | kunde_erstellt_am |
|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | a.johnson@email.com | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am |
|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am |
|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | gĂŒltig_von | gĂŒltig_bis | is_valid_record |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | 2024-01-01T14:59 | false |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-05T15:59 | false |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | 9999-12-31:23:59 | true |
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_id | kunde_name | Kunde_Adresse | erstellt_am | gĂŒltig_von | gĂŒltig_bis | is_valid_record | gelöscht_am |
|---|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | 2024-01-01T14:59 | false | 2024-01-06T12:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-05T15:59 | false | 2024-01-06T12:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | 2024-01-6T11:59 | false | 2024-01-06T12:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-06T12:00 | 9999-12-31:23:59 | true | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am |
|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am | Betrieb | zeilen_operation_at |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | INSERT | 2024-01-01T14:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | UPDATE | 2024-01-01T15:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | UPDATE | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | scd2_valid_from | scd2_valid_until | is_current_record |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | 2024-01-01T14:59 | false |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-05T15:59 | false |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | NULL | true |
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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am | Betrieb | zeilen_operation_at |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | INSERT | 2024-01-01T14:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | UPDATE | 2024-01-01T15:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | UPDATE | 2024-01-05T16:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-10T12:00 | LĂSCHEN | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am | snapshotted_at |
|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-02T00:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-03T00:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-04T00:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | 2024-01-05T00:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am | gelöscht_am | snapshotted_at |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | NULL | 2024-01-02T00:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | NULL | 2024-01-06T00:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-06T12:00 | 2024-01-06T12:00 | 2024-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_id | kunde_name | Kunde_Adresse | erstellt_am | scd2_valid_from | scd2_valid_until | is_current_record |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | 2024-01-05T15:59 | false |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-01T15:00 | NULL | true |
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_id | kunde_name | Kunde_Adresse | erstellt_am | aktualisiert_am | Betrieb | zeilen_operation_at |
|---|---|---|---|---|---|---|
| 123 | Adam Johnson | HauptstraĂe 1, London | 2024-01-01T14:00 | 2024-01-01T14:00 | INSERT | 2024-01-01T14:00 |
| 123 | Adam Johnson | HauptstraĂe 3, London | 2024-01-01T14:00 | 2024-01-01T15:00 | UPDATE | 2024-01-01T15:00 |
| 123 | Adam Johnson | HauptstraĂe 4, London | 2024-01-01T14:00 | 2024-01-05T16:00 | UPDATE | 2024-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.
| Strategie | Genauigkeit | Skalierbarkeit | PĂŒnktlichkeit | Kosten |
|---|---|---|---|---|
| CDC (Echtzeit) | Genauigkeit auf Transaktionsniveau | Geeignet fĂŒr groĂe Datenmengen | Aktualisierungen in Echtzeit | Relativ schwieriger Aufbau und relativ höhere Kosten fĂŒr den Betrieb von Streaming-Pipelines. |
| CDC (Batch) | Genauigkeit auf Transaktionsniveau | Geeignet fĂŒr groĂe Datenmengen | AbhĂ€ngig von der Batch-HĂ€ufigkeit | Relativ 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 Datenmengen | HĂ€ngt von der HĂ€ufigkeit des Schnappschusses ab | Relativ 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 Datenmengen | AbhĂ€ngig von der Snapshot-HĂ€ufigkeit | Relativ 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.
Unsere Ideen
Weitere Blogs
Contact



