In den letzten Artikeln, die ich hier veröffentlicht habe, ging es immer auch darum, wie man die Wirklichkeit betrachtet. Welche Strukturen legt man über die wirklichen Dinge, die man beobachtet, um Gemeinsamkeiten oder Unterschiede zwischen den beobachteten Dingen zu erkennen? Welche Muster glaubt man zu erkennen?
Was ist der Vorteil davon, wenn man ein vereinfachendes Modell über die komplexe Realität legt? Solch ein Modell ist doch niemals in der Lage die Realität “richtig” abzubilden.
In diesem Artikel möchte ich versuchen zu beschreiben, was die Vorteile davon sind, vereinfachte Modelle der komplexen Realität zu nutzen.
All models are wrong, but some are useful.
George Box, zitiert nach https://en.wikipedia.org/wiki/All_models_are_wrong
Das ist einer meiner Lieblingssätze. Für mich zeigt er erstens, dass jede Beschreibung der Realität diese Realität nicht vollständig richtig erfassen kann, sie ist immer eine Vereinfachung, indem sie nicht restlos alle Aspekte der Realität fehlerfrei abbildet. Fazit: “All models are wrong!”
Das ist aber gar kein Problem, denn für manche Aspekte der abgebildeten Realität beschreibt das Modell die Realität gut genug, um daraus Erkenntnisse zu gewinnen – vielleicht gerade deshalb, weil man in diesem Modell die wichtigen Zusammenhänge besser erkennen kann als in der Realität, wo man vielleicht “vor lauter Bäumen den Wald nicht mehr sieht”. Und so zeigt der Satz zweitens, dass manche dieser (falschen) Modelle nützlich sind. Fazit: “Some models are useful!”
Ich versuche das mal mit einem Beispiel zu verdeutlichen: In meiner Doktorarbeit habe ich versucht, die Energie und die Polarisierbarkeit von kleinen Oxo-Anionen zu berechnen. Dazu verwendete ich Methoden der “Ab Initio”-Quantenchemie. Dabei nutzt man eine Berechnung, die die Realität möglichst genau und detailliert als positiv geladene Atomkerne umgeben von negativ geladenen Elektronenhüllen in Orbitalen beschreibt. So kann man mit sehr großem Rechenaufwand die Energie und die Polarisierbarkeit des Moleküls berechnen. Dummerweise führt so eine “Ab Initio”-Rechnung von isolierten Oxo-Anionen zu Ergebnissen, die die Realität von Oxo-Anionen in wässriger Lösung nur sehr schlecht abbilden. D.h. obwohl die Berechnungsmethode kompliziert und schwierig anzuwenden ist, liefert sie schlechte Ergebnisse. Deshalb verwendete ich in der Arbeit ein weiteres, viel einfacheres Modell, das “Currant Bun”-Modell. Dieses “Rosinenbrötchen-Modell” beschreibt die Moleküle als positive Ladungen, die “Rosinen”, die in einer einzigen negativ geladenen kugelförmigen Elektronenwolke, dem “Brötchen” angeordnet sind. Und obwohl dieses Modell die Realität grotesk vereinfacht, also echt falsch ist, kann es die Polarisierbarkeit von Oxo-Anionen in wässriger Lösung gar nicht so schlecht und mit ganz wenig Aufwand berechnen.
Die Abbildung der Realität in einem ganz einfachen Modell, mit ganz wenigen Parametern, ermöglicht hier die Berechnung der Polarisierbarkeit des Moleküls, obwohl ein Molekül ganz bestimmt nicht wie ein Rosinenbrötchen aufgebaut ist. Offensichtlich enthält diese Vereinfachung aber immer noch genug Informationen aus der Realität, dass der Aspekt der Polarisierbarkeit gut genug abgebildet ist. Das Modell lässt damit die für die Fragestellung unbedeutenden Aspekte der Realität weg und fokussiert sich auf die wichtigen Parameter.
Die Beschreibung der Realität durch ein vereinfachtes Modell ist also eine Form der Abstraktion, die ich als sehr nützlich ansehe. Das Modell beschreibt nicht alle Aspekte der Realität vollständig, aber manche doch sehr gut. Hier wird die Komplexität der Realität reduziert, indem man bestimmte Teile ausblendet, nicht mehr darüber nachdenkt und sich auf die verbleibenden Aspekte fokussiert.
Die Idee, etwas als einfacher zu betrachten, als es tatsächlich ist, ist ein guter Ansatz, um dieses “Etwas” besser zu durchschauen.
So, wie im obigen Beispiel, wo ich diese Idee auf die Beschreibung von Oxo-Anionen angewandt habe, kann man auch beim Aufbau eines Data Warehouse vorgehen.
Die Verwendung der Modellierungstechnik von Data Vault 2.0, die ich im Beitrag Data Vault 2.0 beschrieben habe, ist schon ein erster Schritt in diese Richtung. Man beschreibt die Daten immer als Hubs, Links und Satellites. Und diese Struktur ermöglicht es einem, diese einzelnen Tabellen des Data Warehouse sehr einfach zu beschreiben. So ist z.B. die Tabellenstruktur einer Hub-Tabelle immer gleich. Nur der Name des Hubs, der Name des Natural Keys und der Name der Staging-Dateien, aus denen der Hub gefüllt wird, ändern sich von Hub zu Hub.
Der zweite Schritt ist dann, dass man die SQL-Statements für die Hub-Tabellen nicht mehr selbst schreibt, sondern dass man sich diese generieren läßt. In AutomateDV, einem Tool zum Erstellen eines Data Warehouse nach Data Vault 2.0 sieht das dann für einen Hub hub_kunden z.B. so aus:
{%- set source_model = ["stg_kunden", "stg_vertraege"] -%}
{%- set src_pk = "KUNDE_PK" -%}
{%- set src_nk = "KUNDE_KEY" -%}
{%- set src_ldts = "LOAD_DATE" -%}
{%- set src_source = "RECORD_SOURCE" -%}
{{ automate_dv.hub(src_pk=src_pk, src_nk=src_nk,
src_ldts=src_ldts,
src_source=src_source,
source_model=source_model) }}
Damit nicht genug könnte man sich einen Generator bauen, der den AutomateDV-Code für einen Hub aus einer noch kleineren Steuerdatei erzeugt, die z.B. in XML so aussehen könnte:
<hub name="hub_kunde">
<stages>
<stage name="stg_kunden"/>
<stage name="stg_vertraege"/>
</stages>
<nat_key name="KUNDE"/>
</hub>
Aus dieser kompakten Darstellung wird alles abgeleitet, was zur Definition und zum Befüllen des Hubs hub_kunde benötigt wird.
Analog lassen sich so auch kompaktere Darstellungen z.B. für die Links und die Satellites finden. In den nächsten Beitragen möchte ich zeigen, wie einem solche Strukturen dabei helfen können, die komplizierte Welt eines Data Warehouse zu beschreiben und verwalten zu können.
Schreibe einen Kommentar