net/publication/314446630
CITATIONS READS
0 555
1 author:
Stephan Volkmann
Universität Paderborn
2 PUBLICATIONS 0 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Stephan Volkmann on 10 March 2017.
Bachelorarbeit
von
Stephan Volkmann
Matrikelnummer 7000521
Grevestraße 8 33102 Paderborn
stevolkm@mail.uni-paderborn.de
vorgelegt bei
Jun.-Prof. Dr. Artus Krohn-Grimberghe
Prof. Dr. Leena Suhl
in Kooperation mit
Dirk Lerner
ITGAIN GmbH
——————————————
(Stephan Volkmann)
Abstract - deutsch
Die vorliegende Bachelorarbeit beschäftigt sich mit temporalen Aspekten in Data
Vault. Das Ziel der Arbeit ist es, die Probleme der bi-temporalen Historisierung ei-
nerseits theoretisch darzustellen, andererseits in der praktischen Umsetzung der Data
Vault Modellierung zu lösen.
Zunächst gibt die Arbeit einen Überblick über die bisherigen Entwicklungen zum
temporalen Datenmanagement. In diesem Abschnitt werden die wichtigsten Veröf-
fentlichungen zu diesem Thema miteinander verglichen. Es wird eine Einschätzung
gegeben, welche Ziele zukünftige Entwicklungen mit Fokus auf das temporale Daten-
management verfolgen sollten.
Anschließend werden die theoretischen Grundlagen zur bi-temporalen Modellierung
erläutert. Die zentralen Aspekte, die bei der Umsetzung eines bi-temporalen Daten-
modells beachtet werden müssen, werden schrittweise eingeführt.
Aktuell wird der Data Vault Ansatz von Dan Linstedt als eine weitere Modellierungs-
technik für das core data warehouse betrachtet. Aufgrund der Aktualität der Diskus-
sionen zu diesem Thema sollen die theoretisch beschriebenen Grundlagen praktisch
am Beispiel eines data warehouse mit Data Vault Modellierung angewandt werden.
Dazu wird zunächst erklärt, welche Elemente in einem Data Vault Modell existieren
und wie diese aus Quelldaten aufgebaut werden. Der Data Vault Ansatz wird mit
normalisierten Datenmodellen und der dimensionalen Modellierung verglichen. Eine
Bewertung des Ansatzes findet durch Analyse von Anwenderberichten und Literatur
statt.
Der praktische Teil der Arbeit stützt sich auf ein selbst erstelltes Testmodell. Zu-
nächst wird erläutert, wie ein Quelldatenmodell in ein Data Vault Modell transfor-
miert wird. Anschließend folgt eine Beschreibung vom ETL-Prozess, der die Daten
vom Quellsystem in das data warehouse lädt. Die dafür erstellten SQL-Skripte die-
nen als Musterbeispiele für die Umsetzung der bi-temporalen Historisierung in Data
Vault. Abschließend wird ein Generator in Java implementiert, der durch Analyse von
Metadaten die SQL-Skripte automatisiert erstellen kann.
1. Einleitung 1
1.1. Problematik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Zielsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
6. Schlussteil 55
6.1. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
i
Inhaltsverzeichnis
6.2. Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.3. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Literaturverzeichnis 57
C. Testdaten 67
ii
Abbildungsverzeichnis
iii
Tabellenverzeichnis
v
1. Einleitung
Die temporalen Aspekte von Daten sind seit Beginn der Datenbankmodellierung ein
wichtiger Bestandteil von Entwicklungen im Datenmanagement. Es gibt sehr viele ver-
schiedene Möglichkeiten Daten mit Zeitbezug zu speichern, jedoch hat sich bisher kein
Standard durchgesetzt. Damit die Datenbankmodellierer und Anwender diese Kon-
zepte effektiv nutzen können, brauchen sie ein grundlegendes Verständnis der Theorie.
Dies ist notwendig, um Anforderungen an temporale Daten durch ein Geschäftsmodell
sinnvoll zu formulieren und in der Datenbank umsetzen zu können.
Diese Bachelorarbeit soll zunächst eine fundierte Wissensgrundlage zur Theorie der
temporalen Modellierung mit Fokus auf die bi-temporale Historisierung liefern. An-
schließend wird in einem praktischen Teil diese Theorie genutzt, um in Kooperation
mit der Firma ITGAIN1 die bi-temporale Historisierung in Data Vault umzusetzen.
Zusätzlich soll ein Konstrukt entwickelt werden, welches das Laden von Daten in ein
data warehouse durch Analyse von Metadaten automatisiert.
1.1. Problematik
Die wissenschaftliche Untersuchung von temporalen Aspekten wurde in den 1980er
Jahren intensiviert. Um einen Zeitbezug der Daten in einer Datenbank definieren zu
können, wurden die Daten zunächst mit einer Zeit-Dimension verknüpft. So wurde
es möglich, Daten in Tabellen uni-temporal zu speichern. Eine uni-temporale Tabelle
speichert Daten in Bezug zur logischen oder physischen Zeit. Die logische Zeit wird als
die Zeit definiert, in der Fakten oder Daten in der realen Welt wahr sind. Eine Tabel-
le, welche Angaben zur logischen Zeit nutzt, wird als „historical relation“ [JDB+ 98]
bezeichnet, da die Daten mit ihr historisiert werden können. Die physische Zeit wird
als die Zeitangabe definiert, zu der die Fakten bzw. die Daten in der Datenbank prä-
sent sind. Eine Tabelle, welche die physische Zeit nutzt, wird als „rollback relation“
[JDB+ 98] bezeichnet, da mit dieser Zeitangabe eine Versionierung eingeführt wird und
die Tabelle zu alten Versionen wiederhergestellt werden kann.
Eine bi-temporale Datenbank soll die Vorteile beider Zeitdimensionen vereinen und
speichert sowohl logische als auch physische Zeit zu den Daten. Bei dieser Modellierung
können jedoch einige Fragen auftauchen: Wie wird mit Aktualisierungen der Daten
umgegangen, so dass weiterhin alte Daten verfügbar und jederzeit einsehbar sind?
Was passiert bei fehlerhaften Eingaben von Zeitangaben, können sie ohne Probleme
abgeändert werden? Wie können Abhängigkeiten zwischen den Zeitangaben realisiert
1
Informationen zur Firma ITGAIN sind in Anhang A zu finden.
1
1. Einleitung
werden? Sollte die physische Zeit immer nach oder gleichzeitig mit der logischen Zeit
beginnen? Und wie müssen Anfragen angepasst werden, die beide Zeitdimensionen
berücksichtigen?
Diesen Fragestellungen haben sich Wissenschaftler im Bezug zu bi-temporalen Da-
tenmodellen und damit verbundenen Abfragesprachen bereits angenommen. Es gibt
jedoch eine Vielzahl an verschiedenen Modellierungsansätzen und keinen einheitlichen
Standard zur bi-temporalen Historisierung.
Eine neue Art der Modellierung eines data warehouse ist die Umsetzung mit Data
Vault. Für diesen Modellierungsansatz existiert noch kein standardisiertes Konzept
zur Modellierung von bi-temporalen Daten.
1.2. Zielsetzung
Das erste Ziel dieser Bachelorarbeit ist es, die bi-temporale Historisierung in Data
Vault zu beschreiben. Dem Leser sollen auf verständliche Art die Theorie und die
Probleme der bi-temporalen Historisierung vermittelt werden. Das Ergebnis der Arbeit
soll es Außenstehenden ermöglichen, die bi-temporale Historisierung in der Data Vault
Modellierung umzusetzen. Als zweites Ziel soll ein Generator entwickelt werden, der
aus Metadaten die nötigen Informationen ausliest um SQL-Skripte zu erstellen, welche
Daten automatisiert in ein data warehouse laden.
1.3. Vorgehensweise
Der erste Schritt in der Bachelorarbeit ist eine Literaturrecherche zum Thema tempo-
rale Datenbanken, Bi-Temporalität und Data Vault, um grundlegende Begrifflichkei-
ten kennenzulernen. Anschließend wird die Arbeit zum Erreichen der Zielsetzung in
folgende Abschnitte eingeteilt:
Zunächst wird im Kapitel 2 die historische Entwicklung des temporalen Datenma-
nagements vorgestellt. Anschließend werden in Kapitel 3 die theoretischen Grundlagen
zur bi-temporalen Modellierung erläutert. In Kapitel 4 wird der Data Vault Ansatz
erklärt und von anderen Modellierungstechniken abgegrenzt.
Im Praxisteil der Arbeit wird in Kapitel 5 erläutert, wie die bi-temporale Histori-
sierung in der Data Vault umgesetzt werden kann. Ebenso wird die Implementierung
des Generators vorgestellt.
Im abschließenden Kapitel 6 wird eine Zusammenfassung der Arbeit erstellt und ein
Fazit gezogen. Zuletzt wird ein Ausblick auf zukünftige Entwicklungsmöglichkeiten
gegeben.
2
2. Historie des temporalen Datenmanagements
Die Historie der Entwicklung von temporalem Datenmanagement reicht bis zu den An-
fängen der Datenbanksysteme zurück. Mit Sicherungen und Protokoll-Dateien wurden
die ersten Historien zu den Daten aufgebaut. Auf den Daten ausgeführte Transaktionen
wurden in einer Protokoll-Datei mitgeschrieben. Die Daten selbst wurden periodisch
auf externen Datenträgern gesichert. Somit konnte man für eine beliebige Periode in
der Vergangenheit die Daten rekonstruieren. Allerdings haben weder die Datenbank-
Management-Systeme (DBMS), noch die Datenstrukturen, welche diese verwalten,
einen Mechanismus oder eine Struktur geliefert, um Daten der Vergangenheit, der
Gegenwart oder der Zukunft zu trennen [JW10]. Solange keine selbst-entworfene Da-
tenstruktur oder eigenhändig geschriebener Code verwendet wurde, wurde ein Objekt
genau durch eine Zeile einer Datenbanktabelle repräsentiert.
Die großen Änderungen und Entwicklungen in der Vergangenheit wurden mit dem
Ziel durchgeführt, temporale Daten zugänglicher zu machen [JW10]. In der heutigen
Zeit ist der Speicherplatz günstiger als früher, die Rechenleistungen sind gestiegen und
durch die neuen Möglichkeiten wird weniger Aufwand und Zeit benötigt, um temporale
Daten zu nutzen.
Dieses Kapitel fasst relevante Entwicklungen der Vergangenheit zusammen, um
einen Überblick über den aktuellen Stand der Technik zu geben.
3
2. Historie des temporalen Datenmanagements
4
2.3. Neueste Entwicklungen zum temporalen Datenmanagement seit 2000
näher betrachtet werden, da der Fokus dieser Arbeit auf der bi-temporalen Modellie-
rung mit Data Vault liegt.
Auf Grund von unterschiedlicher Kritiken an den Modellen entwickelten beide Wis-
senschaftler ihre Ansätze weiter. Inmon entwickelte eine übergreifende Architektur
zur Sammlung von Daten aus unterschiedlichen Quellen [Inm02]. Kimball hingegen
definiert mehrere kleine Datenbanken als sogenannte „data marts“, die je einen Ge-
schäftsprozess abbilden [KR02]. Durch das Konzept der „conformed dimensions“ sollen
die Informationen in den Dimensionstabellen der data marts konform gehalten werden.
5
2. Historie des temporalen Datenmanagements
trachtet, das „Real-Time Data Warehouse“ [Lan04]. Bei dieser neuen Form werden
statt regelmäßiger snapshots der Tabellen die entsprechenden Zeilen vor einer Ände-
rung als Abbild gesichert. Diese Änderung war nötig, da die periodischen snapshots
keine Änderungen gespeichert haben, die von nachträglichen Änderungen in der glei-
chen Periode überschrieben wurden. Außerdem wurden keine neu eingefügten Objekte
gesichert, die in der gleichen Periode wieder gelöscht wurden. Laut Johnston et al.
wird diese Modellierungsart allerdings in der Praxis missverstanden und somit auch
falsch umgesetzt [JW10].
Im Jahr 2010 veröffentlichen Johnston et al. aufgrund der Kritiken an den bisherigen
Entwicklungen das „Asserted Versioning Framework“ [JW10], um temporale Daten zu
verwalten. Das Ziel war die Entkapselung der Komplexität von temporalen Daten aus
der Datenbank heraus. Der Vorteil dieses Frameworks ist, dass die Transaktionen zu
Objekten und Abfragen sehr ähnlich zu denen von nicht-temporalen Datenbanken
sind, und somit Anwender dieser Datenbanken einen leichten Einstieg haben. Die
Autoren stellen das Framework nicht nur für einzelne Prozesse bereit, sondern auch
als komplette Unternehmenslösung.
Durch die steigende Relevanz von temporalen Aspekten in Datenbanken wurden
schließlich auch im SQL-Standard Erweiterungen vorgenommen. 2008 wurden die
„system-versioned tables“ und 2010 die „application-time period tables“ in den Stan-
dard aufgenommen und im Jahr 2011 durch SQL:2011 (ISO/IEC 9075:2011) veröffent-
licht [KM12]. Neben weiteren Neuerungen steht mit dieser Veröffentlichung die Un-
terstützung von temporalen Daten im Fokus. Dies wird unter anderem durch folgende
Modifikationen ermöglicht: Zur Festlegung eines Zeitintervalls werden zwei Spalten in
einer Tabelle für Start- und Endzeit des Intervalls definiert. Die application-time pe-
riod tables werden eingeführt, um die logische Zeit eines Objektes zu repräsentieren.
Die system-versioned tables werden eingeführt, um die physische Zeit eines Objek-
tes zu repräsentieren. Letztere werden automatisch vom Datenbanksystem verwaltet.
Die Primärschlüssel der Tabellen können nun temporal verwaltet werden, indem ein
nicht-temporaler Primärschlüssel um ein Zeitintervall erweitert wird. Das Zeitintervall
ist somit Teil des Primärschlüssels. Durch die gemeinsame Nutzung von system-time
und application-time in einer Tabelle als Primärschlüssel können bi-temporale Tabel-
len unterstützt werden. Durch spezielle Operatoren können trotz der Komplexität der
Bi-temporalität die Entitätsintegrität und die referenzielle Integrität erhalten werden.
Allerdings sind im Vergleich zur Veröffentlichung von Darwen et al. [DDL03] einige
Probleme nicht mit dem neuen Standard lösbar: In SQL:2011 gibt es keine Operato-
ren, die mit leeren Intervallen umgehen können. Außerdem wird keine Lösung für das
sogenannte „circumlocution problem“ unterstützt. Bei diesem Problem existieren zwei
zeitlich direkt aufeinanderfolgende Datensätze, welche die gleiche Information reprä-
sentieren. Diese Datensätze müssen laut Darwen [Dar13] zusammengeführt werden,
um fehlerhafte Abfragen und Berichte auszuschließen.
6
2.4. Anforderungen zukünftiger Entwicklungen
7
3. Theorie zur bi-temporalen Modellierung
Dieses Kapitel beschreibt die theoretischen Grundlagen der bi-temporalen Modellie-
rung. Im ersten Abschnitt wird zunächst definiert, was eine Zeitperiode ist. Im zweiten
Kapitel werden anschließend die Unterschiede von nicht-, uni- und bi-temporalen Da-
ten erklärt und was diese Daten semantisch ausdrücken. Anschließend wird im dritten
Abschnitt eine einheitliche Begriffsgrundlage für die unterschiedlichen Zeitbegriffe de-
finiert, da diese Begriffe in der Literatur oft geändert wurden. Im vierten Abschnitt
werden die Beziehungen nach Allen [All83] erklärt, da diese eine zentrale Bedeutung in
der temporalen Modellierung haben. Weiterhin werden im fünften Abschnitt zunächst
allgemein die temporalen Integritätskonzepte dargestellt. Diese werden in Abschnitt
sechs und sieben mit der temporalen Entitätsintegrität und der temporalen referenti-
ellen Integrität auf bi-temporale Daten spezialisiert.
Voraussetzungen für dieses Kapitel sind die Mathematik und die Logik des relatio-
nalen Paradigmas sowie SQL als Datenbanksprache. Diese Inhalte können aufgrund
des Umfangs und des Fokus der Arbeit auf die temporalen Aspekte an dieser Stelle
nicht erläutert werden. Eine Erklärung dieser Themen kann in [Joh14] und [DD97]
nachgelesen werden.
9
3. Theorie zur bi-temporalen Modellierung
der open/open-Sichtweise ist keiner der beiden Zeitpunkte enthalten. Die Zeitperiode
würde daher nur den Monat Juli enthalten.
Jede dieser Sichtweisen kann ein beliebiges nicht-leeres Zeitintervall darstellen. Die
open/closed- und die closed/open-Sichtweise haben jedoch einen entscheidenden Vor-
teil: Mit Ihnen kann man direkt feststellen, ob zwei Zeitperioden direkt aufeinander-
folgen. Dies bedeutet, dass kein Zeitpunkt zwischen den Intervallen existiert. Bei zwei
Zeitintervallen z1 und z2 kann dies einfach überprüft werden, indem der Endzeitpunkt
der früheren Periode mit dem Anfangszeitpunkt der späteren Periode verglichen wird.
Sind beide Zeitpunkte identisch, so liegen z1 und z2 zeitlich direkt nacheinander. Ein
Beispiel für zwei Zeitperioden, die in der closed/open Sichtweise aufeinanderfolgen,
sind die Intervalle [Juni 2014 - August 2014] und [August 2014 - Juni 2015].
Die closed/open-Sichtweise wurde gegenüber der open/closed-Sichtweise von der
Wissenschaft als de-facto-Standard anerkannt [Joh14]. Dies wird von Johnston da-
durch erklärt, dass die natürliche Aufzählung in einem Zeitintervall immer mit dem
ersten Zeitpunkt im Intervall startet, und nicht mit dem Zeitpunkt direkt vor dem
Anfangszeitpunkt. In SQL:2011 sowie in der TSQL2-Spezifikation [SAA+ 94] wurde
diese Sichtweise als de-jure-Standard festgelegt [Joh14]. In dieser Arbeit wird daher
die closed/open-Sichtweise für angegebene Zeitintervalle übernommen.
In der Praxis müssen häufig Zeitperioden eingetragen werden, deren Endzeitpunkte
zum Zeitpunkt der Transaktion nicht bekannt sind. Diese Zeitperioden werden daher
mit dem spätesten Zeitpunkt, der im Datenbanksystem möglich ist, als Endzeitpunkt
eingetragen. Im SQL-Server wäre dies beispielsweise der 31. Dezember 9999. Durch die-
se Modellierung ist es möglich, die offenen Zeitperioden in der closed/open-Sichtweise
in die Datenbank zu integrieren.
10
3.2. Unterschied von nicht-, uni- und bi-temporalen Daten
jedoch weder angeben noch verändern. Da die Daten in dieser Tabellenart immer den
Stand zum aktuellen Zeitpunkt repräsentieren, wird dieser Zeitpunkt implizit für bei-
de Zeitdimensionen angenommen. Nicht-temporale Tabellen werden daher auch als
„implicitly bitemporal tables“ [Joh14] bezeichnet.
In einer uni-temporalen Tabelle hingegen können wir mehrere Zeilen haben, welche
die gleiche Entität beschreiben. Jede Zeile beschreibt eine Entität in einer bestimmten
Zeitperiode, die durch die Anfangs- und Endzeit definiert wird. Die Zeitperiode wird in
den Primärschlüssel integriert. Diese Zeitperiode definiert entweder die logische oder
die physische Zeit. In dem vorliegenden Beispiel kann ein Produkt mehrmals in der
Tabelle auftauchen, jeweils definiert über die id und die Zeitperiode. Jede dieser Zeilen
ist eine Version des Produktes.
Die Tabelle 3.1 zeigt eine uni-temporale Produkttabelle. Die unterstrichenen Spalten
definieren den Primärschlüssel. Zu sehen ist, dass das Produkt mit der id p1 zweimal
in der Tabelle auftaucht. Von Juni 2014 bis Juli 2014 hat es den Preis 1.99, von August
2014 bis Mai 2015 den Preis 1.69.
1
Übernommen von Johnston, [Joh14], S.3
11
3. Theorie zur bi-temporalen Modellierung
Durch die bi-temporale Modellierung können wir nun zwei Arten von Berichten
erstellen: Den „as-was“ und den „as-is“ Bericht [JW10]. Sollte unser Bericht eine Zeit
in der Periode von August 2014 bis Dezember 2014 abfragen, wird er nur die ersten 3
Zeilen der Tabelle anzeigen. Als as-was Bericht wird abgefragt, welche Daten zu der
angegebene Zeit korrekt waren. Liegt die Zeit der Abfrage allerdings in einem Zeitraum
ab Januar 2015, so wird der Bericht alle Zeilen außer der zweiten Zeile liefern. Dieser
12
3.2. Unterschied von nicht-, uni- und bi-temporalen Daten
as-is Bericht zeigt, welche Daten zum aktuellen Zeitpunkt korrekt sind. Beide Berichte
zeigen die Historie von Produkt p1 von Juni 2014 bis Juni 2015. Liegt der aktuelle
Zeitpunkt bei einer Abfrage in der zweiten Zeitperiode, so ist sichergestellt, dass immer
die aktuellen Daten zu den abgefragten Datensätzen angezeigt werden [JW10].
Für die temporale Modellierung ist es möglich, nur jeweils einen Teil der Zeitanga-
ben in den Primärschlüssel zu integrieren. In der Praxis werden für die bi-temporale
Modellierung laut Johnston häufig nur die Anfangszeiten der logischen und physischen
Zeit in den Primärschlüssel aufgenommen [Joh14]. Dies ist für die Umsetzung in SQL
vorteilhaft, da man so über eine Aktualisierung der Endzeit der physischen Zeit einen
zuvor gültigen Datensatz als ungültig markieren kann.
Laut Johnston [JW10] muss bei dieser Modellierung ein hohes Maß an Komplexität
verwaltet werden. Im Folgenden werden einige dieser komplexen Probleme aufgezeigt:
In der Tabelle 3.2 wird durch das Datenbankmanagementsystem erlaubt, einen Da-
tensatz anzulegen, dessen Spalten bis auf die Beginn-Zeit bt1 identisch zu einem exis-
tierenden Datensatz sind. Dieser Datensatz könnte beispielsweise so aussehen:
Wird dieser Datensatz in die Tabelle eingefügt, führt dies zu einem Fehler. Das
Produkt p1 hätte beispielsweise zum Zeitpunkt April 2015 zwei unterschiedliche Prei-
se, es kann nicht geprüft werden, welcher der korrekte Preis ist. Diese Fehlerart wird
als „overlapping versions“ [JW10] bezeichnet. Um diesen Fehler verhindern zu kön-
nen, müssen temporale Erweiterungen an den Integritätsbedingungen der Datenbank
vorgenommen werden.
Eine weitere Vielzahl an Bedingungen müsse laut Johnston bei Einfügen, Ändern
oder Löschen von bi-temporalen Daten beachtet werden. Beispielsweise seien die Be-
dingungen für kaskadierende Löschvorgänge sehr komplex, wenn Zeilen in temporalen
Tabellen betroffen sind. Ebenso entstehen komplexe Probleme bei Einfügen von Da-
tensätzen mit referentieller Integrität zu temporalen Daten. Weiterhin würden beim
Schreiben von Anfragen, bei denen sich die Zeitperioden überschneiden, häufig Pro-
bleme auftreten. Weitere Probleme gäbe es beim Zusammenführen von bi-temporalen
Tabellen, oder beim Zusammenführen von temporalen und nicht-temporalen Tabellen.
Johnston ist der Meinung, die aktuellen Entwicklungen „adressieren nur die Spitze des
Eisbergs der Komplexität vom temporalen Datenmanagement“2 .
2
Eigene Übersetzung: „adresses only the tip of the iceberg of temporal data management
complexities“[JW10],S.8
13
3. Theorie zur bi-temporalen Modellierung
14
3.4. Die Beziehungen nach Allen
Alle Terminologien stimmen in der Definition von nicht-, uni- und bi-temporalen
Tabellen überein. Nicht-temporale Tabellen enthalten keine Zeitdimension. Sie werden
häufig auch als konventionelle Tabellen bezeichnet [Joh14]. Eine uni-temporale Tabelle
enthält entweder die physische oder die logische Zeit. Die Zeilen 3 und 4 in der Tabelle
3.3 zeigen die Bezeichnung für eine solche Tabelle je nach verwendeter Zeitdimension.
Eine bi-temporale Tabelle enthält genau eine Zeitperiode aus beiden Zeitdimensionen.
15
3. Theorie zur bi-temporalen Modellierung
Ein logischer Beweis dafür kann in [JW10] nachgelesen werden. Die Operatoren sind
für die temporale Integrität der Datenbanken von zentraler Bedeutung und werden
daher in diesem Abschnitt erläutert.
Die grundlegenden Beziehungen nach Allen sind [starts], [finishes], [equals], [during],
[overlaps], [before] und [meets]. Insgesamt gibt es 13 Beziehungen, da es für alle Bezie-
hungen außer [equals] eine gegenseitige Beziehung gibt, die mit einem „-1“ ausgedrückt
wird. Für die Beziehung [starts] ist dies beispielsweise [starts−1 ].
Im Folgenden werden diese Beziehungen erläutert. Anschließend werden sie in eine
Taxonomie eingeordnet. Zur Illustration der grundlegenden Beziehungen werden zwei
Datensätze für einen Kunden als Beispiel gezeigt. Die Datensätze haben die Form:
[Anfangszeitpunkt | Endzeitpunkt | Kundennummer | Name | Wohnort]
Die Beziehung [starts] drückt aus, dass beide Zeitperioden z1 und z2 den gleichen
Anfangszeitpunkt haben, aber z1 vor z2 endet. Diese Beziehung ist daher nur zwischen
Zeitperioden möglich, welche eine ungleiche Dauer haben.
Ein Beispiel für die Beziehung [starts]:
[ Jan15 | Mär15 | K1 | Müller | Paderborn ]
[ Jan15 | Jun15 | K1 | Müller | Bielefeld ]
In diesem Beispiel beginnen z1 und z2 gleichzeitig, z1 endet 3 Zeiteinheiten vor z2 . Da
die Datensätze die gleiche Entität beschreiben (K1), ist ein gleichzeitiges Auftreten
der Beziehung [starts] in der Datenbank nicht erlaubt. Ansonsten würde das Problem
der overlapping versions entstehen, da beide gegensätzliche Aussagen über die Entität
treffen. Die gegensätzliche Beziehung [starts−1 ] drückt aus, dass z1 und z2 gleichzeitig
beginnen, z2 allerdings vor z1 endet.
Die Beziehung [finishes] drückt aus, dass zwei Zeitperioden z1 und z2 gleichzeitig
enden, aber z1 früher als z2 beginnt. Auch diese Beziehung ist daher nur zwischen
ungleich langen Zeitperioden möglich.
Ein Beispiel für die Beziehung [finishes]:
[ Nov14 | Mai15 | K2 | Meier | Berlin ]
[ Dez14 | Mai15 | K2 | Meier | München ]
Hier beginnt z1 eine Zeiteinheit vor z2 , beide Zeitperioden enden gleichzeitig. Auch
der Eintrag dieser beiden Datensätze würde zu overlapping versions führen, diese Be-
ziehung wird für die gleiche Entität ebenfalls nicht in der Datenbank erlaubt. Die
gegensätzliche Beziehung [finishes−1 ] steht für zwei Zeitperioden z1 und z2 , die gleich-
zeitig enden, z2 allerdings vor z1 beginnt.
Die Beziehung [during] beinhaltet zwei Zeitperioden z1 und z2 für die gilt, dass die
Zeiteinheiten aus z1 komplett in z2 enthalten sind. Dabei muss z2 früher als z1 beginnen
und später als z1 enden. Der Anfangs- und Endzeitpunkt beider Zeitperioden darf nicht
identisch sein.
16
3.4. Die Beziehungen nach Allen
Die Beziehung [equals] steht für zwei Zeitperioden z1 und z2 , die den gleichen
Anfangs- und Endzeitpunkt haben. Diese Zeitintervalle müssen somit gleich lang sein,
da Zeitperioden als durchgängig definiert wurden und keine zeitlichen Lücken enthal-
ten.
Zwei Beispieldatensätze, die die Beziehung [equals] erfüllen:
[ Jan14 | Mai15 | K4 | Meister | Aachen ]
[ Jan14 | Mai15 | K4 | Meister | Hamburg ]
Beide Datensätze enthalten die gleichen Zeitpunkte. Erneut ist diese Beziehung bei
widersprüchlichen Aussagen zur gleichen Entität verboten. Für [euqals] gibt es keine
gegensätzliche Beziehung, da diese exakt die gleiche Bedeutung haben würde.
Die Beziehung [before] drückt aus, dass die Zeitperiode z1 komplett vor der Zeit-
periode z2 stattfindet. Dabei existiert eine zeitliche Lücke zwischen dem Endzeitpunkt
17
3. Theorie zur bi-temporalen Modellierung
von z1 und dem Anfangszeitpunkt von z2 . Durch diese Bedingung haben beide Zeit-
perioden keinen gemeinsamen Zeitpunkt. Die Länge der Zeitperioden ist für diese
Beziehung nicht relevant.
Folgendes Beispiel zeigt zwei Datensätze in der [before]-Beziehung:
Die Datensätze sagen aus, dass der Kunde K6 mit Namen Schmidt von Januar
bis März 2014 in Hameln wohnte, und von Mai 2014 bis August 2015 in Dortmund
wohnte. Es wird keine Aussage darüber getroffen, wo Herr Schmidt in den Monaten
März und April 2014 gewohnt hat. Bei diesen Datensätzen liegt z1 zeitlich vor z2 .
Zwischen beiden Zeitperioden gibt es eine zeitliche Lücke von 2 Monaten. Für die
[before]-Beziehung ist eine Zeitlücke von mindestens einem Zeitpunkt notwendig. Der
zweite Datensatz dürfte somit erst im April 2014 beginnen. Diese Beziehung ist in einer
Datenbank erlaubt, da die Datensätze Aussagen zum gleichen Kunden zu verschiede-
nen Zeitpunkten treffen. Durch die voneinander getrennten Zeitperioden werden keine
gegensätzlichen Aussagen getroffen. Die Beziehung [before−1 ] spiegelt die Bedeutung:
Hier findet z2 komplett vor z1 statt.
Die letzte Beziehung [meets] ist die wichtigste Beziehung. Bei ihr wird die zeitliche
Lücke aus der [before]-Beziehung verboten. Bei [meets] findet die Zeitperiode z1 vor
z2 statt und der Endzeitpunkt von z1 liegt zeitlich exakt vor dem Anfangszeitpunkt
von z2 . Es ist keine zeitliche Lücke zwischen z1 und z2 erlaubt.
Dieses Beispiel verdeutlicht die [meets]-Beziehung:
In diesem Beispiel wohnte Herr König (K7) von Januar bis Februar 2015 in Bonn,
und anschließend von März bis August 2015 in Paderborn. Durch die closed/open-
Sichtweise kann sofort erkannt werden, dass der Endzeitpunkt von z1 direkt vor dem
Anfangszeitpunkt von z2 liegt, da beide die gleichen Werte (März 2015) aufweisen.
Die Historie von Herrn König hat somit keine zeitliche Lücke im betrachteten Zeit-
raum. Diese Beziehung wird in der Datenbank erlaubt, da beide Datensätze Aussagen
zur gleichen Entität über unterschiedliche Zeitperioden treffen. Diese Beziehung wird
meistens sogar gewünscht, um eine komplette Historie der Entität sicherzustellen. Die
gegensätzliche Beziehung [meets−1 ] vertauscht die Zeitperioden: Hier findet z2 vor z1
statt und der Endzeitpunkt von z2 liegt zeitlich exakt vor dem Anfangszeitpunkt von
z1 .
Für jede der Beziehungen nach Allen wurde von Johnston [Joh14] eine allgemeine
Form der Beziehung erstellt. Er definiert für jede Beziehung eine Form, welche die
18
3.4. Die Beziehungen nach Allen
Zunächst wird zwischen den Fällen [Includes] und [Excludes] unterschieden: [Inclu-
des] beinhaltet alle Beziehungen, deren Zeitperioden sich mindestens einen Zeitpunkt
teilen. [Excludes] enthält alle Beziehungen, in denen Zeitperioden keine gemeinsamen
Zeitpunkte haben.
Bei [Includes] wird unterschieden zwischen [Overlaps] und [Contains]. [Overlaps]
enthält Zeitperioden, bei denen beide Zeitperioden Zeitpunkte besitzen, die das andere
4
Johnston, [Joh14], S.113
19
3. Theorie zur bi-temporalen Modellierung
Zeitintervall nicht beinhaltet. [Contains] fasst die Beziehungen zusammen, bei denen
eine Zeitperiode mindestens alle Zeitpunkte der anderen enthält.
[Equals] ist der Fall, bei dem alle Zeitpunkte der Zeitperioden identisch sind. Die
Beziehung [Encloses] enthält die Fälle, bei denen mindestens eine Zeiteinheit nicht in
beiden Zeitperioden enthalten ist.
Diese Fälle sind einerseits mit [AlignsWith] Zeitperioden, bei denen Anfangs- oder
Endzeitpunkt gleich ist. Andererseits gibt es den Fall, dass eine Zeitperiode komplett
in einer anderen enthalten ist: die [During]-Beziehung.
In [AlignsWith] sind die Beziehungen [Starts] und [Finishes] enthalten, also entweder
Anfangszeitpunkt oder Endzeitpunkt der Zeitperioden sind identisch.
Die Beziehungen, die [Excludes] enthält, sind [Before] und [Meets]. [Before] enthält
Zeitperioden, die zeitlich durch eine Lücke getrennt sind. [Meets] enthält die Zeitperi-
oden, die direkt aufeinanderfolgen.
20
3.5. Konzept der temporalen Integrität
21
3. Theorie zur bi-temporalen Modellierung
tität in Form der Daten identisch sein. Letztendlich müssen die assertion time sowie
die state time beider Zeilen in der [Meets]-Beziehung zueinander stehen.
Nehmen wir im Beispiel an, der Kunde K2 heißt im folgenden Monat weiterhin
König und wohnt in Bonn. Damit enthält die Tabelle folgende zwei Datensätze:
[ Mai14 | Jun14 | Jan15 | Feb15 | K2 | König | Bonn ]
[ Mai14 | Jun14 | Feb15 | Mär15 | K2 | König | Bonn ]
Diese Datensätze halten alle fünf Bedingungen ein und können daher zusammenge-
fügt werden:
6
geänderte Abbildung aus Johnston, [Joh14], S.119
22
3.6. Bi-temporale Entitätsintegrität
23
3. Theorie zur bi-temporalen Modellierung
Der Datensatz wurde zum Zeitpunkt Mai 2015 eingefügt. Sowohl assertion time als
auch state time sind als offene Zeitperioden implementiert, da noch nicht bekannt ist,
wann sich die Informationen des Kunden ändern werden. In Abbildung 3.6 wird dieser
Datensatz grafisch dargestellt. Die Pfeile oben und rechts an der Fläche zeigen eine
offene Zeitperiode an.
Es wird nun der Fall betrachtet, dass eine zusätzliche Zeile für den Kunden K1 einge-
fügt werden soll, unabhängig von den angegebenen Daten. Dazu nehmen wir Juli 2015
als aktuellen Zeitpunkt an. Eine Zeile darf nicht rechts oder oberhalb der bisherigen
Fläche in Abbildung 3.6 eingefügt werden, da ansonsten die temporale Entitätsinte-
grität verletzt werden würde. Ebenfalls kann auch keine Zeile in den unteren linken
oder unteren rechten Quadranten eingefügt werden, da der jetzige Zeitpunkt später als
Januar 2015 ist. Das Einfügen eines neuen Datensatzes mit vergangener assertion time
8
geänderte Abbildung aus Johnston, [Joh14], S.130
24
3.6. Bi-temporale Entitätsintegrität
ist nicht möglich. Die einzige Möglichkeit einen neuen Datensatz für K1 einzufügen ist
im oberen linken Quadranten, somit für eine state time früher als Mai 2015.
Die assertion time des neuen Datensatzes wird vom Datenbanksystem automatisch
auf [Jul15-9999] gesetzt. Da der bisherige Datensatz die assertion time [Mai15-9999]
hat, steht er in [Contains]-Beziehung zum neuen Datensatz. Daher können neuer und
existierender Datensatz nur über die state time verglichen werden [Joh14]. Durch die
temporale Entitätsintegrität gibt es Einschränkungen für die Zeitperiode der state
time. Dies soll anhand folgender Beispiele verdeutlicht werden. Die erste Zeitperiode
steht für die assertion time, die zweite für eine beispielhafte state time. In der letzten
Spalte wird gezeigt, in welcher Beziehung die state time von neuem zu existierendem
Datensatz stehen würden.
25
3. Theorie zur bi-temporalen Modellierung
Nach dem Einfügen des neuen Datensatzes hat die Kundentabelle nun diese Form:
Weiterhin wird nun der Fall betrachtet, dass eine Änderung des ersten Datensatzes
im Oktober 2015 getätigt werden muss. Der Kunde K1 soll nun den Namen Baumann-
Ludwig tragen und in Rietberg wohnen. Es wird erneut eine offene Zeitperiode ange-
nommen.
Bei dieser Transaktion muss beachtet werden, dass der neue Datensatz keine Aus-
sage über Zeitpunkte vor Oktober 2015 tätigt. Da der zweite Datensatz in [Before]-
Beziehung zur Änderung steht, ist er von der Transaktion nicht betroffen und bleibt
unverändert in der Datenbank. Der erste Datensatz hingegen muss verändert werden,
da ansonsten die temporale Entitätsintegrität verletzt werden würde. Da der erste Da-
tensatz ab Oktober 2015 eine falsche Aussage macht, wird die Endzeit der assertion
time auf Oktober 2015 gesetzt. Die closed/open-Sichtweise ermöglicht eine vereinfach-
te Änderung, da nur der Zeitpunkt der Änderungs-Transaktion übernommen werden
muss. Es muss ein zusätzlicher Datensatz für die Zeit zwischen Mai und Oktober
2015 eingefügt werden, da in dieser Zeit die Aussage des ersten Datensatzes wahr
9
geänderte Abbildung aus Johnston, [Joh14], S.131
26
3.6. Bi-temporale Entitätsintegrität
gewesen ist. Die assertion time dieses Datensatzes ist der Zeitpunkt der Änderungs-
Transaktion. Abschließend wird ein Datensatz eingefügt, der die neuen Informationen
beinhaltet. Die Kundentabelle sieht nach Ausführen der Transaktion so aus:
Die Abbildung 3.8 zeigt die Auswirkungen der Änderung grafisch. Die Bezeichnung
R* steht für die jeweilige Reihe in der Tabelle.
27
3. Theorie zur bi-temporalen Modellierung
so wird wie bei der Änderung ein zusätzlicher Datensatz mit den weiterhin gültigen
Informationen eingefügt.
Beachtet der Anwender bei Erstellung von Anfragen diese Regeln bei Einfügen,
Ändern und Löschen von Datensätzen in bi-temporalen Tabellen, so kann durch die
temporale Entitätsintegrität garantiert werden, dass keine gegensätzlichen Aussagen
zur selben Entität im selben Zeitraum in der Tabelle enthalten sind.
Kundentabelle
abt aet sbt set K-ID Name Wohnort esbt
Mai15 Okt15 Mai15 9999 K1 Baumann Steinheim Mai15
Jul15 9999 Feb14 Apr15 K1 Baumann Höxter Feb14
Okt15 9999 Mai15 Okt15 K1 Baumann Steinheim Mai15
Okt15 9999 Okt15 9999 K1 Baumann-Ludwig Rietberg Mai15
Vertragstabelle
abt aet sbt set V-ID F_K-ID V-Typ Rate esbt
Mai15 9999 Mai15 9999 V1 K1 Pacht 380.00 Mai15
Der Vertrag V1 verweist in der Spalte F_K-ID auf den Kunden K1 in der Kun-
dentabelle. Dieser Wert zeigt jedoch nicht auf eine einzigartige Zeile in der Kundenta-
belle, wie es bei konventionellen Fremdschlüsseln der Fall ist. Die Beziehung verweist
28
3.7. Bi-temporale referentielle Integrität
auch nicht auf einen Primärschlüssel, sondern nur auf den eindeutigen Identifizierer
zu Kunde K1. Eine bi-temporale Fremdschlüsselbeziehung ist daher nicht wie bei der
konventionellen eine „one-to-one-Beziehung“, sondern eine „one-to-many-Beziehung“
[Joh14].
Die Semantik der beiden Fremdschlüsselarten bleibt gleich: Die referenzierende En-
tität kann nicht existieren, solange die referenzierte Entität nicht existiert. Im Beispiel
kann kein Vertrag zu Kunde K1 bestehen, solange es keinen Kunden K1 gibt. Für die
Beziehung von V1 zu K1 ist nicht relevant, wie viele Einträge es zu K1 gibt. Es ist
lediglich relevant, dass eine kontinuierliche Beziehung zu K1 über die gesamte Lebens-
dauer von V1 existiert.
In einer one-to-many-Beziehung stellen die Entitäten der parent table eine Samm-
lung an Zeilen dar, die von der child table referenziert wird. Diese Sammlung wird von
Johnston als Episode bezeichnet [Joh14]. Eine Episode ist das zeitliche Intervall von
Entität E, in dem die Entität K auf E referenziert. Die bi-temporale Integritätsinte-
grität fordert, dass alle bi-temporalen Zellen von K in der bi-temporalen Fläche von
E enthalten sind. Somit muss K in [contains]-Beziehung zu E stehen.
Die formale Definition einer Episode einer bi-temporalen Tabelle hat folgende Be-
dingungen:
Durch die Definition einer Episode steht eine Entität K in der child table in one-
to-one-Beziehung zur referenzierten Episode in der parent table. Da wir durch die
bi-temporale Entitätsintegrität wissen, dass es keine Zeilen gibt, die in [Includes]-
Beziehung zueinander stehen und die selbe Entität beschreiben, können wir folgern,
dass die state time-Perioden aller Zeilen einer Episode in [meets]-Beziehung zur nach-
folgenden Zeile der Episode stehen. Das bedeutet, dass es keine zeitliche Lücke in
der state time der Episode gibt. Würde diese Lücke existieren, so würde die Episode
durch oben genannte Bedingung in zwei Episoden unterteilt werden. Eine geschlos-
sene Episode endet mit dem spätesten Endzeitpunkt der state time der enthaltenen
29
3. Theorie zur bi-temporalen Modellierung
Zeilen. Eine offene Episode enthält mindestens eine Zeile, deren state time als offene
Zeitperiode definiert ist. Die Anfangszeit einer Episode ist gleich der Anfangszeit der
frühesten state time aller Zeilen der Episode. Die Endzeit der Episode wird durch den
spätesten state-time Eintrag aller Zeilen der Episode definiert.
Eine Angabe der Episode in einer temporalen Tabelle ist nicht erforderlich, da diese
jederzeit mit oben genannten Bedingungen berechnet werden könnte. Da die Anfangs-
zeit der Episode über alle Zeilen der Episode identisch ist, reicht diese Deklaration als
Spalte in einer Tabelle um die komplette Zeitperiode der Episode berechnen zu kön-
nen. Johnston ist der Meinung, dass die Kosten für den Performance-Verlust durch die
ständige Berechnung die Kosten für den Speicherplatzbedarf einer zusätzlichen Spalte
übersteigen und somit die Aufnahme der episode state begin time in eine temporale
Tabelle nötig ist [Joh14].
In der Beispieltabelle 3.4 ist diese Spalte hinzugefügt worden. Die Historie zu Kunde
K1 besteht aus zwei Episoden, da zwischen den Episoden [Feb14-Apr15] und [Mai15-
9999] eine zeitliche Lücke von zwei Zeiteinheiten existiert. Der Vertrag V1 referenziert
auf den Kunden K1, durch den Vergleich der episode state begin time kann dieser
Vertrag der zweiten Episode des Kunden zugeordnet werden. Die bi-temporale refe-
rentielle Integrität ist erfüllt, da die komplette Episode von V1 in der zweiten Episode
von K1 enthalten ist. In diesem Beispiel stehen die Episoden in [equals]-Beziehung zu-
einander, eine [contains]-Beziehung würde für die bi-temporale referentielle Integrität
ausreichen.
Die Voraussetzung für die bi-temporale referentielle Integrität ist die bi-temporale
Entitätsintegrität. Um die bi-temporale referentielle Integrität in der gesamten Daten-
bank sichern zu können, müssen bei den Transaktionen Einfügen, Ändern und Löschen
einige Bedingungen beachtet werden. Es werden nur Änderungen an den Datensätzen
betrachtet, die zu einer Änderung der Episode führen, da für eine Fremdschlüssel-
beziehung irrelevant ist, welche Daten an referenzierter oder referenzierender Entität
angehängt sind. Die Regeln bei diesen Transaktionen sollen im Folgenden erläutert
werden.
Beim Einfügen eines neuen Datensatzes in einer parent table muss die referentielle
Integrität nicht beachtet werden, da die Integrität durch Erweiterung der Episode in
der parent table nicht verletzt wird. Wenn ein neuer Datensatz in einer child table hin-
zugefügt werden soll, muss das Datenbanksystem folgendes prüfen: In der parent table
muss sich eine Episode zur referenzierten Entität befinden, die in [contains]-Beziehung
zum einzufügenden Datensatz steht. Kann die Bedingung nicht erfüllt werden, so darf
der Datensatz nicht eingefügt werden. Wenn ein Datensatz auf mehrere parent tables
verweist, muss die Bedingung für jede parent table erfüllt sein. Zu beachten ist, dass
eine Tabelle sowohl parent table als auch child table sein kann.
Bei einer Änderungs-Transaktion müssen Regeln in beiden Tabellenarten beach-
tet werden. In einer parent table ist eine Änderung an einem Datensatz nur erlaubt,
wenn weiterhin eine Episode existiert, welche die Episode der referenzierenden Enti-
30
3.7. Bi-temporale referentielle Integrität
täten enthält. In einer child table ist eine Änderung nur möglich, wenn analog zur
Einfügen-Transaktion eine referenzierte Entität in der parent table existiert, welche
die veränderte Episode enthält.
Beim Löschen eines Datensatzes in einer child table ist keine Regel zu beachten, da
hiermit nur eine zuvor gültige Fremdschlüsselbeziehung beendet wird. Die vergangene
Beziehung bleibt im System weiterhin gültig. Das Löschen eines Datensatzes in einer
parent table kann nur durchgeführt werden, wenn weiterhin die referenzierten Episo-
den in der parent table enthalten sind. Auf eine Löschanfrage, die diese Bedingung
nicht erfüllt, kann mit drei Optionen reagiert werden:
Die Entscheidung über die zu implementierende Option muss bei der Implementie-
rung einer Fremdschlüsselbeziehung getroffen werden. Sie sollte konstant beibehalten
werden, damit die Bedeutung der Beziehung im Verlauf der Zeit nicht geändert wird.
Wenn diese Bedingungen für die Transaktionen Einfügen, Ändern und Löschen von
Datensätzen einer Fremdschlüsselbeziehung eingehalten werden, so kann in der Da-
tenbank die bi-temporale referentielle Integrität garantiert werden.
31
4. Theorie zur Modellierung mit Data Vault
Data Vault ist ein Modellierungsansatz zum Aufbau der zentralen Integrationsschicht
im data warehouse. Entwickelt wurde der Ansatz von Dan Linstedt seit den 90er
Jahren, einer der ersten Artikel wurde von ihm im Jahr 2002 veröffentlicht [Lin02].
„Die zugrundeliegende Prämisse von Data Vault ist die Unified Decomposition“1 .
Die Kombination von Dekomposition und Zusammenfügen ist das zentrale Konzept
des Ansatzes: Die Dekomposition von Teilen des data warehouse wird durchgeführt,
um eine flexible, anpassbare und agile Datenhaltung zu gewährleisten. Das Zusammen-
führen der einzelnen Teile wird eingesetzt, um eine integrierte Sicht auf die Daten zu
erhalten und die Daten präsentieren zu können. Um die einzelnen Teile in Verbindung
zu halten wird ein einheitlicher Schlüssel verwendet.
In den nachfolgenden Abschnitten werden zunächst die grundlegenden Elemente in
der Data Vault Modellierung erklärt. Diese sind „Hub“, „Link“ und „Satellit“. Weiter
werden die Unterschiede zu bisherigen Modellierungstechniken aufgezeigt. Abschlie-
ßend wird eine Bewertung des Data Vault Ansatzes durchgeführt.
Der natural business key muss die Instanz des Geschäftsobjektes im gesamten Ge-
schäftsbereich eindeutig identifizieren. Der Schlüssel ist nicht von Quell-Systemen ab-
hängig, sondern wird geschäftsbasiert gebildet. Dies ist notwendig, um Daten aus meh-
reren unterschiedlichen Quellen in integrierter Form speichern zu können. Die sequence
ID wird vom data warehouse gebildet und stellt den Primärschlüssel eines Hubs dar.
1
Eigene Übersetzung: „The underlying premise behind data vault is Unified Decomposition“,
[Hul12], S. 21
33
4. Theorie zur Modellierung mit Data Vault
Sie wird zur Verknüpfung von Beziehungen genutzt. Die sequence ID steht in eins-zu-
eins-Beziehung zum natural business key und ist „eine einheitlich erstellte, verwaltete
und kontrollierte Version des business keys“2 . Der load date time stamp wird zur
Speicherung der Zeit verwendet, an dem der Datensatz in das data warehouse geladen
wurde. Dieser Zeitstempel dient lediglich diesem einen Zweck und stellt kein spezielles
Attribut dar, welches zur Umsetzung von temporalen Aspekten genutzt werden kann.
Er ist somit Teil der Metadaten. Ein weiteres Attribut enthält Informationen zu den
Datenquellen als Teil der Metadaten. Hier ist auch eine größere Menge an Attributen
möglich, falls dies zur Beschreibung der Quelle nötig sein sollte. Jedoch empfiehlt sich
dann die Verwendung eines Metadatenmodells, in dem die Informationen gespeichert
werden. Es dürfen nur Attribute hinzugefügt werden, die zusätzliche Daten darstellen
und keine Bedeutung für den Geschäftsbetrieb haben. Die beiden letzten Attribute
sind technisch nicht relevant für die Funktion des Hubs, werden aber aus Komfort-
gründen hier abgespeichert [Hul12]. Der Hub enthält keine weiteren beschreibenden
Informationen und keine Fremdschlüssel.
In Abbildung 4.1 sind beispielhaft die Geschäftsobjekte Kunde und Vertrag als Hubs
modelliert. Die Attribute Kunde_Key bzw. Vertrag_Key sind natural business keys.
Sie werden aus den bisher genutzten Beispieltabellen mit K-ID und V-ID übernommen.
Die sequence ID wird jeweils vom data warehouse erstellt.
34
4.2. Modellierung von Beziehungen: der Link
Jede sequence ID der beteiligten Elemente wird als Fremdschlüssel modelliert. Ein
Link stellt nicht nur Beziehungen zwischen den Hubs dar, auch Beziehungen zwischen
Link und Link sind möglich. Der Link selbst besitzt als Primärschlüssel eine eigene
sequence ID. Diese steht in eins-zu-eins-Beziehung zur Instanz einer Geschäftsobjekt-
Beziehung. Die beiden letzten Attribute werden analog wie im Hub eingesetzt. Der
Link speichert eine Beziehung, sobald sie das erste Mal im data warehouse auftaucht.
Es müssen mindestens zwei Elemente an der Beziehung teilnehmen, eine Obergrenze
für Beziehungsteilnehmer existiert nicht.
Die Abbildung 4.2 zeigt beispielhaft die Beziehung zwischen Kunde und Vertrag.
Die sequence IDs der beiden beteiligten Hubs sind als Fremdschlüssel deklariert. Die
sequence ID wird wie beim Hub vom data warehouse erstellt.
35
4. Theorie zur Modellierung mit Data Vault
beide Objekte vom selben Typ sind. Der HAL beschreibt eine hierarchische Bezie-
hung, zum Beispiel eine Eltern-Kind-Beziehung. Die Fremdschlüssel müssen dement-
sprechend benannt werden, um die jeweilige hierarchische Ebene erkennen zu können
(z.B. wer ist das Elternteil, wer ist das Kind). Eine Bezeichnung des Links mit HAL
oder SAL ist wichtig, da beide technisch eine identische Darstellung besitzen [Hul12].
Der Primärschlüssel eines Satelliten wird aus der sequence ID des zu beschreibenden
Elements und dem load date time stamp zusammengesetzt. Die sequence ID zeigt
als Fremdschlüssel auf ein Element eines Hubs oder eines Links. Der Satellit nutzt als
einziges Konstrukt im Data Vault Ansatz eine Zeitangabe als Teil des Primärschlüssels.
Damit ist er als einziger Teil des Datenmodells in der Lage eine Historisierung zu
ermöglichen. Die Informationen zur Quelle des Datensatzes werden analog wie im Hub
oder Link verwendet. Weiterhin enthält der Link Attribute, die das Geschäftsobjekt
beschreiben sollen. Es ist eine beliebige Anzahl an Attributen möglich. Die Attribute
müssen abhängig vom zu beschreibenden Element sein, genau wie in einer Tabelle
in dritter Normalform [Hul12]. Optional kann im Satelliten das Attribut des load
end date time stamp stehen. Dieses Attribut repräsentiert die assertion end time und
markiert den Zeitpunkt, an dem der Datensatz ungültig wird bzw. wurde.
In der Abbildung 4.3 sind beispielhaft die Satelliten zu den Geschäftsobjekten Kun-
de und Vertrag abgebildet. Die sequence IDs der beteiligten Entitäten werden als
Fremdschlüssel in den Primärschlüssel des Satelliten integriert.
Es können mehrere Satelliten den selben Hub oder Link beschreiben. Die Entschei-
dung, welche Attribute in welchem Satelliten gespeichert werden, kann vom Daten-
bankmodellierer getroffen werden. Diese Entscheidungsfreiheit ermöglicht ein hohes
Maß an Flexibilität. Die Attribute könnten zum Beispiel nach folgenden Kriterien
aufgeteilt werden [Hul12]: Häufigkeit der Änderung, Informationsbereich oder Quelle
der Informationen.
36
4.3. Modellierung von Kontext: der Satellit
Ein Satellit speichert die beschreibenden Informationen nicht nur beim ersten Laden
in das data warehouse, sondern auch bei jeder Änderung eines Attributs. Jede Ände-
rung resultiert somit in einer neuen Zeile in der Satelliten-Tabelle. Dies ist analog zu
der von Kimball entwickelten SCD Typ 2 [KR02].
Die gesamte Struktur des Beispiels ist in dem Data Vault Modell in Abbildung 4.4
zusammengefasst. Eine gestrichelte Verbindung stellt eine non-identifying Beziehung,
die durchgezogene eine identifying Beziehung dar. Identifying bedeutet: ein referenzie-
render Datensatz kann ohne die referenzierte Entität nicht existieren.
37
4. Theorie zur Modellierung mit Data Vault
Die Modellierung eines data warehouse mit Data Vault hat grundsätzliche Unter-
schiede zu bisherigen Modellierungsansätzen. Im Vergleich zur Modellierung in dritter
Normalform oder dem dimensional modeling werden die Tabellen strikt in business
key, Beziehungen und Kontext getrennt.
Im dimensional modeling oder der dritten Normalform würde eine Aufteilung von
Kontext-Attributen einer Entität in mehrere Tabellen zu einer Integritätsverletzung
führen: Wird ein Attribut aus einer Tabelle in dritter Normalform entfernt und in eine
andere Tabelle eingefügt, so behält die ursprüngliche Tabelle nicht mehr die dritte
Normalform. Im dimensional modeling können durch diese Umverteilung die Dimen-
sionen nicht mehr konform gehalten werden [KR02]. In der Data Vault Modellierung
spielt es hingegen für die Integrität keine Rolle, in welchem Satellit sich ein Attribut
befindet oder wie viele Satelliten an einem Element hängen. Data Vault ändert so-
mit die Sichtweise, dass alle Kontext-Attribute zu einer Entität in derselben Tabelle
stehen müssen [Hul12]. Ein weiterer Unterschied ist die Repräsentation einer Entität.
In bisherigen Modellierungsansätzen wurde eine Entität immer in genau einer Tabelle
gespeichert. In der Data Vault Modellierung werden die Informationen zu einer En-
tität auf die verschiedenen Konstrukte aufgeteilt. Somit sind sie nicht mehr in einer
Tabelle, sondern in einer Sammlung von Tabellen gespeichert [Hul12].
Im Unterschied zu anderen Modellierungen müssen laut Hultgren [Hul12] folgende
drei Eigenschaften der Konstrukte Satellit und Link beachtet werden:
Erstens definieren die Satelliten in Data Vault keine eigene Entität. Sie beschreiben
eine Entität durch ihre Attribute. Ein Satellit und somit beliebige beschreibende In-
formationen können ohne das referenzierte Element nicht existieren. Zweitens werden
alle Beziehungen durch Links modelliert. In Satelliten existieren außer dem zu be-
schreibenden Element keine Fremdschlüssel. Drittens können in Data Vault durch die
Links lediglich N:M-Beziehungen abgebildet werden. In anderen Modellierungen sind
1:M-Beziehungen hingegen möglich. Die Data Vault Modellierung erhält durch diese
Vorgehensweise jedoch keine Nachteile, da Data Vault zur Modellierung der Integrati-
onsschicht des data warehouse genutzt wird und somit lediglich eine Kopie aller Daten
darstellt, die bereits von anderen Systemen aufgenommen wurden. Das data ware-
house sei nicht dafür zuständig, Geschäftsregeln im Datenmodell abzubilden, hierfür
seien die operationalen Systeme dem data warehouse vorgelagert. Um die Kardinalität
eines Links herauszufinden, müssen Abfragen über die in Beziehung gesetzten Daten
ausgeführt werden.
Durch die Unterschiede zu bisherigen Modellierungen muss eine neue Sichtweise
eingenommen werden, um das data warehouse mit der Data Vault Modellierung auf-
zubauen. Die Vor- und Nachteile des neuen Modellierungsansatzes werden im nächsten
Abschnitt aufgeführt.
38
4.5. Bewertung der Modellierung mit Data Vault
39
4. Theorie zur Modellierung mit Data Vault
das data warehouse in ein dimensional model oder in ein data mart model übersetzt
werden. Ein weiterer Nachteil ist, dass die Modellierer die Technik von Data Vault
zunächst verstehen und die Umsetzung erlernen müssen, da Data Vault eine andere
Sichtweise auf das Datenmodell beinhaltet.
Die beste Vorgehensweise der Modellierung eines data warehouse hängt somit von
verschiedenen Faktoren ab. Vor- und Nachteile müssen je nach Projekt gegeneinander
abgewogen und für die spezielle Situation bewertet werden.
40
5. Praktische Entwicklungen zur bi-temporalen
Historisierung in Data Vault
Dieses Kapitel befasst sich mit der praktischen Anwendung der theoretischen Grund-
lagen. Das erste Ziel der Entwicklungen ist die Umsetzung der bi-temporalen Histori-
sierung in Data Vault. Dazu wird ein Datenmodell entwickelt, welches die Grundlage
für alle weiteren Entwicklungen bildet. Das Modell wird für Quellsystem und Staging-
Datenbank erstellt und in ein Data Vault Modell transformiert. Anschließend wird der
ETL-Prozess zum Integrieren der Quelldaten in das data warehouse modelliert und
ausführlich getestet. Im letzten Abschnitt soll als zweites Ziel ein Generator für SQL-
Befehle implementiert werden, der durch Analyse bestimmter Metadaten die Quell-
daten automatisiert in das Data Vault data warehouse integrieren kann. Die Schritte,
die für die Entwicklungen notwendig sind, werden im Folgenden in den einzelnen Ab-
schnitten genauer erläutert.
41
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
aktuelle Preise, als auch Preise für die Zukunft bereits in die Datenbank eintragen
werden können und der jeweilige Tagespreis nicht vor Öffnung einer Filiale in der
Produkttabelle aktualisiert werden muss. Jede Dimensionstabelle verfügt über einen
eindeutigen Primärschlüssel. Die ID´s der Tabellen werden automatisch vom Daten-
banksystem vergeben. Der Primärschlüssel der Faktentabelle Verkäufe setzt sich aus
den referenzierenden Fremdschlüsseln zusammen. Ein Datensatz der Preistabelle stellt
kein eigenes Geschäftsobjekt dar. Somit erhält diese Tabelle keinen eigenen business
key und der Primärschlüssel wird aus dem Fremdschlüssel zur Produkttabelle und
dem Gültigkeitsbeginn zusammengesetzt. Die Datentypen und die Bedingung, ob ein
Attribut NULL sein darf, wurden je nach Attribut sinnvoll vergeben. Bei den verwen-
deten Datentypen wurde kein Wert auf die Effizienz der Speicherauslastung gelegt,
da es sich bei den Testfällen lediglich um anschauliche Minimalbeispiele handelt und
die Betrachtung der Performance an dieser Stelle eine untergeordnete Rolle spielt. Die
Namen der Attribute wurden im Quellmodell nachträglich geändert, so dass keine Um-
laute und Sonderzeichen enthalten sind. Diese führten im Schritt der Implementierung
des Generators zu Fehlern beim Einlesen von Quelldateien.
Die Staging-Datenbank ist für das Laden der Daten aus den Quellsystemen zu-
ständig. Aus ihr werden die Daten anschließend in das data warehouse integriert. Im
Testbeispiel wird als Quellsystem vereinfacht lediglich eine Quelldatenbank verwendet.
Daher besitzt die Datenbank im Staging-Bereich dasselbe Datenmodell wie die Quell-
datenbank. Zusätzlich wurde in jeder Tabelle das Attribut Load Date Time Stamp
(LDTS) hinzugefügt. Dieses Attribut gibt an, zu welchem Zeitpunkt die Daten aus
der Quelldatenbank in die Staging-Datenbank geladen wurden. Diese Modellierung ist
bereits vorbereitend für die bi-temporale Historisierung in Data Vault, da anhand die-
ses Attributes, der assertion end time und des state time-Intervalls die bi-temporale
Entitätsintegrität geprüft wird.
Das data warehouse wurde als Data Vault Modell umgesetzt und ist in Anhang
B.2 dargestellt. Das Abkürzungsverzeichnis des Modells befindet sich auf der darauf
folgenden Seite in Tabelle B.1. Die Modellierung wurde mit der Software CA ERwin
Data Modeler3 durchgeführt. Der Vorteil dieser Software ist, dass die spezielle Nota-
tion für Data Vault Modelle integriert werden kann. Für große Projekte besteht die
Möglichkeit Vorlagen für Hubs, Satelliten und Links anzulegen. Mit diesen Vorlagen
lassen sich große Datenmodelle effizienter anlegen. Weiterhin kann die Software das
Modell auf Integritätsbedingungen und Namenskonflikte prüfen. Aus dem erstellten
Modell kann ein SQL-Skript4 generiert werden, mit dem das komplette Datenmodell
inklusive der Datentypen, Beziehungen und nicht-temporalen Integritätsbedingungen
in einer SQL-Datenbank aufgebaut werden kann. Mit diesem Skript wurde das Data
Vault data warehouse im SQL Server Management Studio als Datenbank erstellt. Die
3
CA ERwin Data Modeler r9.6 in der kostenlosen Community Edition
http://erwin.com/products/data-modeler/community-edition
4
Alle verwendeten Skripte sind auf der DVD gespeichert. Siehe Anhang D.
42
5.1. Das Datenmodell
Begriffe für die speziellen Zeitangaben zu assertion time und state time wurden aus
dem Theorie-Teil übernommen. Für den load date time stamp wurde der Begriff der
assertion begin time eingesetzt, um eine konsistente Benennung der Zeitangaben zu
erhalten. Im Folgenden sollen die Designentscheidungen für das Data Vault Modell
erläutert werden:
Die Verkaufstabelle wurde als Link modelliert. Dieser Link referenziert über Fremd-
schlüsselattribute die Hubs Kunde, Produkt und Filiale. Ein Datensatz im Link stellt
einen Verkauf dar. Die Informationen zu Verkaufszeitpunkt und Menge werden im Sa-
telliten des Links gespeichert. Die Kontext-Informationen zum Kunden wurden in zwei
Satelliten aufgeteilt: In die Personendaten und die Informationen über den Premium-
Status. Diese Modellierung ist aus folgenden Gründen sinnvoll: Der Premium-Status
bzw. der Rabatt eines Kunden ändert sich im Zeitverlauf voraussichtlich häufiger als
seine Personendaten. Somit ist es sinnvoll, diese selten geänderten Daten separat zu
speichern und nicht bei jeder Änderung des Premium-Status als zusätzliche Attribu-
te zu historisieren. Dadurch existiert ein Datensatz zu Personendaten nur einmal im
Personendaten-Satelliten und nicht mehrfach im Premium-Satelliten. Außerdem ist die
Abfrage, ob ein Kunde Premium-Status hat, über die Premium-Tabelle schneller als
über alle Kunden, da der Anteil an Premiumkunden sehr gering ist. Der Satellit für die
Premium-Informationen wurde bi-temporal modelliert. Das state time-Intervall dieses
Satelliten drückt die Zeit aus, in welcher der Kunde den Premium-Status besitzt. Die
Satelliten zu Preis, Produkt und Filiale wurden ebenfalls bi-temporal modelliert. Die
state time des Preises drückt aus, wann der Preis für das jeweilige Produkt gültig ist.
Für das Produkt drückt die state time aus, in welchem Zeitraum das Produkt verkauft
wird. Die state time der Filiale beschreibt das Zeitintervall von Öffnung bis Schließung
der Filiale. Das assertion time-Intervall drückt in jeder Tabelle aus, in welchem Zeit-
raum der Datensatz in der Datenbank als gültig angesehen wird. Die Satelliten zu
Verkauf, Kunde und Adresse wurden uni-temporal modelliert, da für deren Informa-
tionen keine state time-Angabe existiert. Durch die uni-temporale Modellierung wird
auch in diesen Tabellen eine vollständige Historisierung ermöglicht. Der Satellit für die
Adresse wurde bewusst nicht aufgeteilt, da die enthaltenen Informationen semantisch
stark zusammenhängen.
Nach der Erstellung des data warehouse wurden mit einem SQL-Skript die Default-
Werte für die assertion time, die state end time und die Quellinformationen in allen
Tabellen geändert. Der Default-Wert für das Attribut der assertion begin time ist der
Zeitpunkt der Transaktion, die den Datensatz in das data warehouse lädt. Im SQL
Server kann dies mit der Funktion getDate() umgesetzt werden. Für die assertion end
time und die state end time wird standardmäßig der maximale Wert für das datetime-
Attribut eingesetzt. Im SQL Server ist dies der Wert 9999-12-31 23:59:59.997. Mit
dieser Implementierung wird angenommen, dass Informationen von neu eingetragenen
Datensätzen, welche keine state end time-Angabe besitzen, auf unbestimmte Zeit gül-
tig bleiben. Der Default-Wert für die Quellinformationen wird auf die Quelle der Daten
eingestellt. Für das data warehouse ist dies im Testbeispiel die Staging-Datenbank.
43
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
Der Einsatz dieser Default-Werte dient zur Vereinfachung der Anfragen zum Laden
der Daten in das data warehouse. In einem System mit mehreren Quelldatenbanken
müssen diese Informationen dynamisch je nach Quelle eingetragen werden.
Nach der Erstellung der Datenbanken konnten erste Beispieldaten in das System
eingepflegt werden. Die Daten wurden manuell lediglich in die Quelldatenbank ein-
gefügt. Für die Staging-Datenbank und das data warehouse sollen die Daten über
SQL-Anfragen automatisch geladen und in das jeweilige System eingefügt werden. Die
Daten sind fiktiv und als Testbeispiele erstellt worden, ein Bezug zu realen Personen,
Firmen, Adressen oder sonstigen Informationen wird ausgeschlossen.
Die Staging-Datenbank wird dazu genutzt, die Daten aus den Quellsystemen zu
sammeln. Da im Testbeispiel nur eine Quelldatenbank der Firma existiert, können
die Quelldaten über ein SQL-Skript aus der Quelldatenbank direkt in die Staging-
Datenbank eingefügt werden. Wichtig bei diesem Schritt ist, dass vor dem Einfügen
von referenzierenden Datensätzen zuerst die referenzierten Datensätze in der Daten-
bank enthalten sein müssen, da ansonsten die referentielle Integrität verletzt wird und
kein referenzierender Datensatz eingefügt werden kann. Da die Staging-Datenbank
dasselbe Datenmodell wie die Quelldatenbank nutzt, muss keine syntaktische oder
semantische Transformation stattfinden. Der Ladeprozess wird asynchron durch den
Start des Skripts durchgeführt, um die manuellen Veränderungen an den Quelldaten
44
5.2. Der ETL-Prozess
direkt nachvollziehen zu können. Im Testbeispiel wird vereinfacht nur von einer Quell-
datenbank und von bereits korrekten Daten ausgegangen, um sich voll auf die Trans-
formation in ein Data Vault Modell und die Integration der bi-temporalen Aspekte
konzentrieren zu können.
Die Schritte transform und load sollen in einem SQL-Skript zusammengefasst wer-
den. Ein Transformieren der Daten muss stattfinden, da das Datenmodell des data
warehouse mit der Data Vault Modellierung eine andere Form als in der Staging-
Datenbank besitzt. Die Daten werden wie in der Theorie beschrieben in die Elemente
Hub, Link und Satellit aufgeteilt. Im Ladeprozess wird das Prinzip des „Integrity
Load“ genutzt: Beim Laden von Satelliten und Links können referenzierte Datensätze
im data warehouse erstellt werden (falls sie noch nicht existieren), damit die referen-
tielle Integrität eingehalten wird. Dadurch ist die Reihenfolge, in der die Elemente
geladen werden, sehr flexibel.
In dieser Arbeit wird nur eines der SQL-Skripte erläutert, da eine Erklärung aller
Skripte sehr viel Platz in Anspruch nehmen würde. Für das Laden von Hub, Link und
uni-temporalem Satellit wurde jeweils ein ausführlich kommentiertes Beispiel-Skript
erstellt5 . Eine Dokumentation in Kommentar-Form ist in jedem Skript vorhanden. Als
Beispiel für ein SQL-Skript, welches Daten von der Staging-Datenbank in das data
warehouse lädt, wurde das Skript zum Laden der Kundendaten ausgewählt6 . Dieses
Skript wurde ausgewählt, da es alle in der Theorie beschriebenen Inhalte praktisch
umsetzt. Dies sind die Transformation in das Data Vault Modell, das Einfügen von
Hub-, Link- und Satelliten-Datensätzen sowie die uni- und bi-temporale Historisierung.
Für ein besseres Verständnis wird empfohlen für den folgenden Abschnitt das Skript
zu öffnen, um die referenzierten Schritte direkt nachverfolgen zu können.
Der erste Schritt (Schritt 1) im Ladeprozess ist die Erstellung der Hub-Datensätze,
da sowohl Links als auch Satelliten auf diese referenzieren. Die erste Insert-Anfrage
legt daher neue Datensätze im Kunden-Hub an. Um die Entitätsintegrität einhalten zu
können, wird ein neuer Hub-Datensatz nur erstellt, wenn das abgebildete Geschäftsob-
jekt noch nicht im data warehouse gespeichert ist. Dies wird über den natural business
key abgefragt. Die sequence ID wird automatisch von der Datenbank inkrementell ver-
geben. Die Quellinformation wird durch den Default-Wert initialisiert.
Um die Integritätsbedingungen auch für die Kontext-Informationen sicherzustellen,
wurde im nächsten Schritt (Schritt 2) ein spezieller bedingter Ausdruck definiert. Für
den Satellit Sat_Cust_Prem wird geprüft, ob eine Verletzung der bi-temporalen En-
titätsintegrität zwischen einzufügenden Daten aus der Staging-Datenbank und den
existierenden Daten im data warehouse besteht. Diese Überprüfung wird auf die gül-
tigen Datensätze im data warehouse eingeschränkt, da ungültige Datensätze für die
5
Diese wurden gekennzeichnet mit „Example-Load-“.
6
Das Skript ist als SQL-Datei auf der DVD unter „Load-customer-data-to-DWH.sql“ zu finden. Die
Datei wurde außerdem als PDF-Datei gespeichert, falls kein Programm zum Öffnen von SQL-
Dateien zur Verfügung steht.
45
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
Integrität nicht mehr relevant sind. Die Gültigkeit wird über die assertion end time
abgefragt. Anschließend werden alle Daten auf die in Abschnitt 3.4 beschriebenen
[Includes]-Beziehungen geprüft. Eine Überprüfung der [Excludes]-Beziehungen muss
nicht stattfinden, da diese keine Verletzung der Entitätsintegrität erzeugen. Im spe-
ziellen Fall der [equals]-Beziehung müssen alle Kontext-Informationen in die Abfrage
miteinbezogen werden. Im Beispielskript ist dies das Attribut Rabatt. Exakt gleiche
Datensätze sollen keine Verletzung der Integritätsbedingung verursachen. Es wird wäh-
rend der nachfolgenden bi-temporalen Historisierung bereits sichergestellt, dass gleiche
Informationen nicht erneut in das data warehouse geladen werden. Liegt als Ergeb-
nis eine Verletzung der Entitätsintegrität vor, wird eine Fehlermeldung ausgegeben
und der Ladeprozess wird abgebrochen. Diese Umsetzung wird gewählt, da ansons-
ten die problembehafteten Datensätze als neue Datensätze erkannt und somit in das
data warehouse geladen werden würden. Eine weitere Möglichkeit mit diesen Fehlern
umzugehen wäre das Laden aller Datensätze in das data warehouse und das anschlie-
ßende Lösen der Problemfälle mit speziell angepassten „business rules“. Diese Regeln
müssen für jeden Fall einzeln bewerten, welcher der sich gegenseitig ausschließenden
Datensätze als gültig angesehen werden soll. In einem Standard-Ladeprozess werden
die business rules allerdings nicht definiert.
Liegt keine Verletzung der Entitätsintegrität vor, kann der Ladeprozess der Kontext-
Informationen beginnen (Schritt 3a & 3b). Zunächst werden die Daten für den Sa-
telliten Sat_Cust geladen (Schritt 3a). Dieser Satellit ist uni-temporal modelliert.
Die uni-temporale Historisierung besteht aus zwei Teilschritten: Zunächst werden al-
le Datensätze, die durch nachträgliche Änderungen in der Quelle ungültig werden,
historisiert. Dazu wird deren assertion end time auf den load date time stamp des
aktualisierten Datensatzes der Quelle geändert, da der alte Datensatz bis zum Laden
des neuen Datensatzes gültig war. Anschließend werden in den Satelliten alle geän-
derten und neuen Kontext-Informationen eingefügt. Somit befinden sich alte (nicht
mehr gültige) und neue oder geänderte (gültige) Daten gleichermaßen im Satelliten.
Durch Abfragen über die assertion time kann der Anwender zu jeder Zeit den gültigen
Datensatz ermitteln.
Der Satellit Sat_Cust_Prem ist bi-temporal modelliert und soll im nächsten Schritt
beladen werden (Schritt 3b). Eine bi-temporale Historisierung besteht aufgrund der
Komplexität aus deutlich mehr Teilschritten als eine uni-temporale Historisierung.
Zunächst wird für jedes Geschäftsobjekt, in diesem Fall also für jeden Kunden, ein
kompletter bi-temporaler Zeitraum7 im Satelliten angelegt. Der Zeitraum beginnt im
Beispiel am 01.01.1999 und endet am 31.12.9999. Das Beginn-Datum liegt beispiel-
haft ein Jahr vor der Gründung der Firma, das Ende-Datum ist das maximale Datum
in SQL. Die Kontext-Information wird mit NULL initialisiert. Diese Modellierung
beschreibt, dass für den kompletten Zeitraum, in dem Kontext-Informationen für Pre-
miumkunden existieren können, für diesen Kunden keine Informationen existieren. In
7
Siehe Abbildung 3.3.
46
5.3. Testen des ETL-Prozesses
den nächsten vier Teilschritten werden die bi-temporalen Zeiträume wie in Kapitel 3.6
aufgebaut. Erst wird der Zeitraum links vom neuen Datensatz aufgebaut8 . Der Zeit-
raum stellt alle Datensätze dar, die vor dem neuen Datensatz gültig waren. Zweitens
wird der Zeitraum rechts vom neuen Datensatz aufgebaut, wenn der neue Datensatz
nicht bis zum maximalen Datum gültig sein sollte9 . Der Datensatz dieses Zeitraumes
sagt aus, dass in diesem Zeitraum noch keine Informationen über den Premiumstatus
des Kunden existieren. Die nächsten beiden Anfragen im Skript aktualisieren die as-
sertion end time der nicht mehr gültigen Datensätze. Diese können über die state time
und die assertion time des neuen Datensatzes ermittelt werden. Im letzten Schritt der
bi-temporalen Historisierung wird der neue bzw. geänderte Datensatz in den Satelliten
eingefügt und füllt somit den letzten verbliebenen Zeitraum10 .
Im letzten Schritt des Skripts (Schritt 4) ist der Ladeprozess für Beziehungen mo-
delliert. Im Beispielmodell hat jeder Kunde eine Adresse als Fremdschlüsselbeziehung.
Die Beziehung zwischen den zwei Tabellen wird durch den Link Link_Cust_Adress
ausgedrückt. Zunächst werden per Integrity Load nicht-vorhandene Hub-Datensätze
der referenzierten Adressen angelegt. Mit einem Look-Up über den natural business
key kann überprüft werden, ob die referenzierte Adresse bereits im data warehouse
gespeichert ist. Anschließend wird geprüft, ob im Kundendatensatz das Fremdschlüs-
selattribut geändert wurde, der Kunde also umgezogen ist. In diesem Fall wird der
Link-Datensatz, der die Beziehung zwischen Kunde und Adresse darstellt, auf die
neue Beziehung aktualisiert. Mit der letzten Anfrage werden alle neuen Beziehungen
als Link-Datensätze eingefügt. Die sequence ID´s von Kunde und Adresse können in
jedem Schritt über den natural business key selektiert werden.
Der gesamte Ladeprozess für das data warehouse wurde in mehrere Teilskripte aufge-
teilt, um eine bessere Übersichtlichkeit und Wartbarkeit zu ermöglichen. Diese Teilbe-
reiche sind das Laden der Adressdaten, Produkt- und Preisdaten, Kundendaten, Fili-
aldaten und Verkaufsdaten. Jedes Skript kann separat ausgeführt werden. Im nächsten
Abschnitt wird beschrieben, wie der Prozess mit Testdaten verifiziert wurde.
47
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
Diese Datensätze sollen nun im data warehouse gespeichert werden. Dazu wird das
Skript load-customer-data-to-DWH.sql ausgeführt. Die Auswirkungen der bi-tempo-
ralen Historisierung auf den Satelliten Sat_Cust_Prem sind in Abbildung 5.3 abge-
bildet. Alle weiteren betroffenen Elemente des Ladeprozesses Hub_Cust, Sat_Cust,
Hub_Adress und Link_Cust_Adress wurden korrekt beladen.
Abbildung 5.3.: Das Laden der ersten Daten in das data warehouse
Betrachten wir zunächst den einfachen Fall für die Kundin mit ID 2 (Nachfolgend
Kundin 2 genannt): Für diese Kundin wird im Satelliten ein Datensatz angelegt, der
sich über den komplett möglichen Zeitraum von Jahr 1999 bis 9999 erstreckt. In diesem
Zeitraum ist ihr Rabatt NULL. Der Datensatz wurde korrekt angelegt, denn die Kun-
din ist momentan noch keine Premiumkundin und erhält somit zu keinem Zeitpunkt
einen Rabatt. Nun wird die Historisierung für den Kunden mit ID 1 (nachfolgend
48
5.3. Testen des ETL-Prozesses
Kunde 1 benannt) betrachtet: Der erste Datensatz stellt analog wie bei Kundin 2 den
gesamten Zeitraum dar. Dieser Datensatz wird für jeden Kunden angelegt, daher ist er
auch für Kunde 1 eingefügt worden. Dieser erste Datensatz wurde am 22.03.2000 un-
gültig. Dies ist der Zeitpunkt, an dem die Daten für Kunde 1 in die Staging-Datenbank
geladen wurden. Zum gleichen Zeitpunkt werden die Datensätze zwei bis vier als gül-
tig erklärt. Der zweite und der vierte Datensatz decken korrekt den Zeitraum ab, in
der Kunde 1 nicht Premiumkunde ist. Daher ist in diesem Zeitraum sein Rabatt auch
NULL. Der dritte Datensatz stellt den Zeitraum dar, in dem der Kunde Premium-
kunde ist und einen Rabatt von 5% erhält. Die ersten Daten wurden somit korrekt
historisiert gespeichert.
Nun wird angenommen, dass im Jahr 2013 der Kunde 1 so viel gekauft hat, dass er
einen neuen Premiumstatus mit 8% Rabatt erhält. Da dieser Kunde ein sehr loyaler
Kunde ist, soll sein Premiumstatus auf unbestimmte Zeit gelten. Auch die Kundin 2
erhält durch mehrere kleinere Einkäufe einen Premiumstatus mit 3,5% Rabatt. Der
Status wird allerdings zunächst auf 3 Jahre begrenzt. Diese Daten existieren wie in
Abbildung 5.4 in der Staging-Datenbank. Sie wurden am 05.05.2013 geladen. Da keine
Änderungen an Personen- oder Adressdaten vorgenommen wurden, sind keine weiteren
Elemente des data warehouse von der Änderung betroffen.
49
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
Datensatz ist bis zum Jahr 9999 gültig. Für Kundin 2 wurden aufgrund des begrenz-
ten Premiumstatus drei neue Datensätze angelegt. Dies ist analog zu der Erstellung
der Datensätze für Kunde 1 beim ersten Ausführen des Skriptes. Die Daten wurden
somit korrekt bi-temporal historisiert. Zu jedem Kunden kann zu jedem Zeitpunkt
herausgefunden werden, ob und wieviel Rabatt der Kunde erhält oder erhalten hat.
Abbildung 5.5.: Der Satellit Sat_Cust_Prem nach dem Laden der neuen
Datensätze
Diese Testfälle haben gezeigt, dass die bi-temporale Historisierung korrekt durch-
geführt wird. Damit keine Datensätze in das data warehouse geladen werden, die zu
einer Verletzung der bi-temporalen Entitätsintegrität führen, wurden zusätzlich für
jedes Skript die bedingten Anfragen getestet, die neue Datensätze auf diese Verletzun-
gen überprüfen. In Anhang C sind zwei Tabellen mit Beispieldaten dargestellt, deren
Datensätze beim Laden in das data warehouse eine Verletzung der Entitätsintegrität
verursachen würden. In jedem Fall wird das Skript zum Laden der Kundendaten nicht
ausgeführt, da ansonsten die fehlerhafte Daten im data warehouse abgelegt werden
würden.
Die Einhaltung der bi-temporalen referentiellen Integrität wurde analog zu diesen
Testfällen überprüft. Alle SQL-Skripte wurden mit mehreren Testdaten in verschie-
denster Kombination und in mehreren Testschritten verifiziert. Jedes Skript lädt alle
Datensätze, die zu keiner Integritätsverletzung führen, korrekt in das data warehouse.
Die Datensätze, welche zu einer Verletzung der Integrität führen, werden von jedem
Skript erkannt und nicht in das data warehouse geladen.
Durch den Test des gesamten Ladeprozesses konnte sichergestellt werden, dass die
50
5.4. Implementierung des SQL-Generators
Datensätze im data warehouse zu jeder Zeit vollständig historisiert sind und keine
Integritätsbedingung verletzt wird.
Im nächsten Abschnitt wird eine Möglichkeit beschrieben, wie die Erstellung der
SQL-Anfragen zum Laden in ein data warehouse in Data Vault Modellierung automa-
tisiert werden kann.
51
5. Praktische Entwicklungen zur bi-temporalen Historisierung in Data Vault
52
5.4. Implementierung des SQL-Generators
14
Die Dokumentation befindet sich im Ordner SQLGenerator\doc.
53
6. Schlussteil
In diesem Kapitel werden zunächst die Ergebnisse der Arbeit zusammengefasst und ein
Fazit gezogen. Abschließend wird ein Ausblick auf weitere Entwicklungsmöglichkeiten
gegeben.
6.1. Zusammenfassung
Bereits die historischen Entwicklungen haben gezeigt, dass temporale Aspekte beim
Speichern von Daten eine zentrale Rolle spielen. Allerdings wurde bisher kein entspre-
chender Standard zur bi-temporalen Datenmodellierung entwickelt. Es wurde beschrie-
ben, warum die zwei Zeitangaben für logische und physische Zeit benötigt werden,
um eine vollständige Historisierung zu ermöglichen. Die Bedeutung und die theore-
tischen Grundlagen zu bi-temporaler Datenmodellierung wurden anhand von Defini-
tionen und Beispielen erläutert. Die verschiedenen Beziehungen zwischen zwei Zeitin-
tervallen wurden anhand der Beziehungen nach Allen [All83] definiert. Anschließend
wurde erläutert, welche Probleme und Komplexität die Entitätsintegrität und die re-
ferentielle Integrität im Fall von bi-temporalen Daten beinhalten. Um die temporalen
Aspekte in der Data Vault Modellierung beschreiben zu können, wurden zunächst die
theoretischen Grundlagen dieser Modellierungstechnik beschrieben. Die einzelnen Ele-
mente von Data Vault wurden anhand von Beispielen erläutert. Anschließend wurde
die Modellierung mit bisherigen Techniken zur Modellierung eines core data warehouse
verglichen und bewertet.
Im praktischen Teil der Arbeit wurde zunächst ein Testdatenmodell für alle weiteren
Entwicklungen aufgestellt. Das Modell wurde in einer SQL-Datenbank implementiert
und mit Beispieldaten gefüllt. Anhand dieses Datenmodells wurde die Transformation
in ein Data Vault Modell gezeigt. Anschließend wurde der ETL-Prozess modelliert,
der die Daten von der Quelldatenbank über eine Staging-Datenbank in das data ware-
house lädt. Dafür wurden mehrere SQL-Skripte geschrieben. Diese Skripte enthalten
die in der Theorie beschriebene uni- und bi-temporale Historisierung in Data Vault.
Der ETL-Prozess wurde ausführlich getestet und erfolgreich auf die Einhaltung aller
Integritätsbedingungen geprüft. Um die Generierung von SQL-Skripten für den ETL-
Prozess automatisieren zu können, wurde ein SQL-Generator in der Programmier-
sprache Java implementiert. Dieser Generator kann mit Hilfe einer Metadaten-Datei
die Insert-Befehle für Hub, Satellit und Link erstellen. Die Metadaten enthalten In-
formationen darüber, welche Attribute aus der Quelltabelle in welche Attribute der
Zieltabelle geladen werden sollen. Der Generator wurde ebenfalls erfolgreich an dem
bereits vorliegenden Datenmodell getestet.
55
6. Schlussteil
6.2. Fazit
Die Ziele der Bachelorarbeit konnten in vollem Umfang erreicht werden. Durch die
praktischen Entwicklungen wurde gezeigt, wie die Umsetzung der bi-temporalen His-
torisierung in Data Vault durchgeführt werden kann. Mit dem SQL-Generator wurde
eine Möglichkeit präsentiert, wie das Erstellen von SQL-Anfragen, die Daten in ein
Data Vault data warehouse laden, automatisiert werden kann. Durch die Kombina-
tion dieser beiden Entwicklungen können die Vorteile von Data Vault und der bi-
temporalen Datenmodellierung miteinander vereint werden. Durch das automatisch
generierte SQL-Skript müssen die SQL-Anfragen nicht mehr eigenhändig geschrieben
werden. Dadurch können Kosten durch fehlerhaft erstellte Anfragen reduziert werden.
Das Erstellen der Muster-SQL-Skripte erwies sich als sehr komplex. Bei dieser Ent-
wicklung mussten sehr viele Feinheiten und Spezialfälle beachtet werden. Für eigene
Entwicklungen wird daher empfohlen, die Skripte in kleinen Schritten zu entwickeln
und diese möglichst nach jeder Änderung zu testen, da ansonsten ein Fehler nur noch
schwer gefunden werden kann. Die bereits erstellten und getesteten Skripte haben die
Implementierung des Generators erleichtert. Das Schema einer Insert-Anfrage für Hub,
Satellit und Link konnte eins-zu-eins in die Implementierung übertragen werden.
Da es bisher keinen Standard zur bi-temporalen Historisierung in Data Vault gibt,
wird das in dieser Arbeit vorgestellte Vorgehen empfohlen. Es konnte gezeigt wer-
den, dass durch dieses Vorgehen die Daten im Data Vault data warehouse vollständig
historisiert und mit Einhaltung aller Integritätsbedingungen gespeichert sind.
6.3. Ausblick
Für das temporale Datenmanagement gibt es im Bereich der Automatisierung und Be-
nutzerfreundlichkeit ein hohes Entwicklungspotential. Der Generator könnte zur voll-
ständigen Automatisierung um die temporalen Aspekte erweitert werden. Dazu muss
der Prozess zum Erstellen von Satelliten-Inserts angepasst werden. Für eine höhere Be-
nutzerfreundlichkeit könnte für den Generator eine grafische Benutzeroberfläche imple-
mentiert werden. Es ist denkbar, dass mit dieser Oberfläche auch die Metadaten-Datei
nur durch Drag&Drop erstellt wird. Dies würde Schreibfehler in der Datei vorbeugen.
Weiterhin spielt in der Praxis auch die Betrachtung der Performance eine wich-
tige Rolle, wenn die bi-temporale Historisierung bei einer sehr großen Datenmenge
durchgeführt werden soll. Dazu könnten die Skripte an reale Datensätze angepasst
und getestet werden.
In der Zukunft sollten Datenbankhersteller in Betracht ziehen, die bi-temporale His-
torisierung durch das Datenbanksystem vollständig zu unterstützen. Hierfür könnten
beispielsweise Konstrukte entwickelt werden, welche für bi-temporale Relationen die
Integritätsbedingungen als automatisch generierte Constraints in die Datenbank inte-
grieren.
56
Literaturverzeichnis
[Dar98] Hugh Darwen. Valid time and transaction time proposals: Language design
aspects. In Temporal Databases: Research and Practice, pages 195–210.
Springer, 1998.
[Dar13] Hugh Darwen. Temporal data and the relational model. Document from
website http://www.dcs.warwick.ac.uk/~hugh/ (accessed 2015-05-08), pu-
blished 2013.
[DD97] Chris J Date and Hugh Darwen. A Guide To Sql Standard, volume 3.
Addison-Wesley Reading, 1997.
[DDL03] Christopher John Date, Hugh Darwen, and Nikos A Lorentzos. Temporal
data and the relational model: a detailed investigation into the application
of interval and relation theory to the problem of temporal database mana-
gement. Morgan Kaufmann, 2003.
[DL+ 02] Hugh Darwen, Nikos Lorentzos, et al. Temporal data & the relational model.
Elsevier, 2002.
[DM88] Barry A. Devlin and Paul T. Murphy. An architecture for a business and
information system. IBM systems Journal, 27(1):60–80, 1988.
[GRF00] Dov Gabbay, Mark Reynolds, and Marcelo Finger. Temporal Logic: Mathe-
matical Foundations and Computational Aspects Volume 2. Oxford Logic
Guides 40, 2000.
[Hul12] Hans Hultgren. Modeling the Agile Data Warehouse with Data Vault. New
Hamilton, 2012.
57
Literaturverzeichnis
[Inm92] William H Inmon. Building the Data Warehouse. John Wiley & Sons, Inc.,
1992.
[Inm02] William H Inmon. Building the Data Warehouse. John Wiley & Sons, Inc.,
third edition, 2002.
[ITG] Firma ITGAIN. Daten-modellierung mit data vault. Information from web-
site http://www.itgain.de/leistungen/informationsmanagement/daten-
modellierung/data-vault/ (accessed 2015-06-09).
[JCG+ 92] Christian S Jensen, James Clifford, Shashi K. Gadia, Arie Segev, and Ri-
chard Thomas Snodgrass. A glossary of temporal database concepts. ACM
Sigmod Record, 21(3):35–43, 1992.
[JDB+ 98] Christian S Jensen, Curtis E Dyreson, Michael Böhlen, James Clifford,
Ramez Elmasri, Shashi K Gadia, Fabio Grandi, Pat Hayes, Sushil Jajo-
dia, Wolfgang Käfer, et al. The consensus glossary of temporal database
concepts - february 1998 version. Springer, 1998.
[Joh14] Tom Johnston. Bitemporal Data: Theory and Practice. Morgan Kaufmann,
2014.
[JW10] Tom Johnston and Randall Weis. Managing time in relational databases:
how to design, update and query temporal data. Morgan Kaufmann, 2010.
[KC04] Ralph Kimball and Joe Caserta. The data warehouse ETL toolkit. John
Wiley & Sons, 2004.
[Kim96] Ralph Kimball. The data warehouse toolkit: practical techniques for buil-
ding dimensional data warehouse. NY: John Willey & Sons, 248:4, 1996.
[KM12] Krishna Kulkarni and Jan-Eike Michels. Temporal features in sql: 2011.
ACM Sigmod Record, 41(3):34–43, 2012.
58
Literaturverzeichnis
[KR02] Ralph Kimball and Margy Ross. The Data Warehouse Toolkit: The Com-
plete Guide to Dimensional Modeling. John Wiley & Sons, Inc., 2002.
[LG11] Dan Lindstedt and Kent Graziano. Super Charge Your Data Warehouse:
Invaluable Data Modeling Rules to Implement Your Data Vault. Create-
Space, 2011.
[LGH08] Dan Linstedt, Kent Graziano, and Hans Hultgren. The new business su-
permodel, the business of data vault modeling. Lulu. com, 2008.
[Lin02] Dan Linstedt. Data vault series 1 - data vault overview. TDAN. com, 2002.
[Lin12] Dan Lindstedt. The Official Data Vault Standards Document. Amazon
Media EU S.Ã r.l., 2012.
[SAA+ 94] Richard Thomas Snodgrass, Ilsoo Ahn, Gad Ariav, Don S Batory, James
Clifford, Curtis E Dyreson, Ramez Elmasri, Fabio Grandi, Christian S Jen-
sen, Wolfgang Käfer, et al. Tsql2 language specification. Sigmod Record,
23(1):65–86, 1994.
59
Anhang A.
Informationen zur Firma ITGAIN
ITGAIN Consulting Gesellschaft für IT-Beratung mbH
Essener Straße 1
D-30173 Hannover
Internetadresse: www.itgain.de
61
Anhang B.
Datenmodelle von Quellsystem und data warehouse
% # # &' (#
% # # &' (#
! "#$
* / '
2 )
% # # &' (#
+ ,,,
-
% # # &' (#
- . / ,,,
0.
1 ,,,
)
*
*
% # # &' (#
% # # &' (#
) **
) **
3 &
63
Anhang B. Datenmodelle von Quellsystem und data warehouse
64
B.2. Datenmodell des Data Vault data warehouse
65
Anhang B. Datenmodelle von Quellsystem und data warehouse
Folgende Tabelle enthält die Bedeutung der Abkürzungen, die im Data Vault Da-
tenmodell verwendet wurden:
Abkürzung Bedeutung
ABDTS Assertion Begin Date Time Stamp
AEDTS Assertion End Date Time Stamp
Cust Customer
DTS_Sale Date Time Stamp of Sale
House_No House number
House_No_Add Addition to the house number
RecordSRC Record Source
SBDTS State Begin Date Time Stamp
SEDTS State End Date Time Stamp
SID Sequence ID
66
Anhang C.
Testdaten
Die folgenden zwei Tabellen enthalten Testdaten, die durch den Ladeprozess im da-
ta warehouse zu einer Verletzung der bi-temporalen Entitätsintegrität führen wür-
den. Die Beziehungen sind analog zu Kapitel 3.4 aufgebaut worden. Es werden nur
[Includes]-Beziehungen betrachtet, da [Excludes]-Beziehungen keine Integritätsverlet-
zung verursachen. Verglichen wurden die neuen Datensätze mit der Tabelle, die in
Abbildung 5.5 dargestellt ist.
FK_
verletzende Kunde_ Premiumkunde_ Premiumkunde_
Geschlecht Vorname Nachname Titel Adresse_ Rabatt LDTS
Beziehung ID seit bis
ID
2000-02-03 2001-05-25 2007-04-01
[starts] 1 True Peter Müller Dr. 3 4,55
00:00:00.000 00:00:00.000 00:00:00.000
Erklärung starts: steht in Konflikt mit Rabatt 5% von 2000 bis 2012
Erklärung finishes: steht in Konflikt mit Rabatt 5% von 2000 bis 2012
Erklärung during: steht in Konflikt mit Rabatt 8% von 2013 bis 9999
Erklärung overlaps: steht in Konflikt mit Rabatt 8% von 2013 bis 9999
Erklärung equals: steht in Konflikt mit Rabatt 5% von 2000 bis 2012
67
Anhang C. Testdaten
FK_
verletzende Kunde_ Premiumkunde_ Premiumkunde_
Geschlecht Vorname Nachname Titel Adresse_ Rabatt LDTS
Beziehung ID seit bis
ID
2013-05-04 2018-05-04 2014-04-01
[starts -1] 2 False Else Schneider NULL 4 4,50
09:00:00.000 09:00:00.000 00:00:00.006
Erklärung starts -1: steht in Konflikt mit Rabatt 3,5% von 2013 bis 2016
Erklärung finishes -1: steht in Konflikt mit Rabatt 3,5% von 2013 bis 2016
Erklärung during -1: steht in Konflikt mit Rabatt 3,5% von 2013 bis 2016
Erklärung overlaps -1: steht in Konflikt mit Rabatt 3,5% von 2013 bis 2016
Erklärung equals: steht in Konflikt mit Rabatt 3,5% von 2013 bis 2016
68
Anhang D.
Inhalt der DVD
Die DVD befindet sich auf der Innenseite des hinteren Buchdeckels.
69