Bevor wir später uns in der Praxis mit der historischen Datenhaltung und -verwendung beschäftigen, müssen wir uns über manche theoretische Punkte klar sein. Sonst besteht die Gefahr, dass wir gegen die Wand laufen.
Allgemein sehe ich die historischen Daten eines Objektes sind die Eigenschaften, die sich im Leben des Objektes zu bestimmten Zeitpunkten ändern. Logisch ist es so zu sehen, dass ein geborenes Objekt ab der Geburt vorhanden ist. Die Eigenschaften sind dann immer zu einer Stichzeit sichtbar. Diese Sicht hat dann so lange Gültigkeit bis sich eine der Eigenschaften ändert oder mit einem Gültig-ab eine neue dazu kommt. Ein Objekt wird in der historischen Datenhaltung nie beendet. Nur Eigenschaften können geleert werden.
Wenn wir es gut machen, dann gibt es hier eine verlustfreie Datenhaltung. Dieses bedeutet, dass wir jede Eingabe nachvollziehen können (wer, wann, wo eingegeben) und aber auch bei Bedarf auf frühere Werte zurückgehen können. Mal sehen, sind so meine Überlegungen.
Die historischen Daten unterteilen sich in verschiedene Bereiche:
- Daten ohne Historie (es wird immer der aktuelle Wert sichtbar)
- Standard Daten mit Historie (Normale Objekte mit Eigenschaften)
- Berechnungsergebnisse (Daten zu Perioden / Zeiträumen) - mit differenzierten Periodensystem und Rückrechnung ohne Datenverlust.
Die ersten beiden Arten haben identische Datenstrukturen für Objekte
Die Berechnungsergebnisse haben eine eigene Datenstruktur im Periodensystem.
Die Datenhaltung kann in verschiedenen Formen erfolgen. Für die Verarbeitung und die laufenden Änderungen - Verwaltung der Daten - denken wir in der aktuellen Form der realtionalen Datenbanken, aber ohne Relationen. Einfach eine schnellen Datenzugriff und Speicherung. Bei den eigentlichen Daten und ggf. den ÄnderungsLogs denken wir in Dokumenten (JSON bzw. PythonWörterbuch)
Sehen wir es so, wenn ich heute zum Beispiel mit Django ein Objekt speichere bekomme ich einen Satz in der Datenbanktabelle mit der ID des Objektes. Wenn ich nun zu einer Objekt.ID aber historisch Daten in mehreren Sätzen ablegen möchte geht es so mit dem Standardvorgehen nicht mehr.
Logisch gesehen bilden das Gültig-ab mit der Objekt.ID die Id des Satzes. Zu einem Gültig-ab kann es bei einem Objekt immer nur einen Eintrag geben.
Bis hierher brauchen wir
- ID // ID der Zeile
- Gültig-ab // über die Form unterhalten wir uns später
- OID // Id des Objektes
Wir wollen es so diskutieren, dass wir allgemein keine Sätze löschen, sondern nur als gelöscht kennzeichnen. Folglich kommt
- isDeleted // True = gelöscht
hinzu.
Dieses zentrale Struktur des Standards ist bei allen Objekten identisch, nur der eigentliche Datenbereich ist unterschiedlich. Da diese dann später auch verknüpft werden und es dann so was ähnliches wie Teilobjekte sind werde ich diese als Datengruppe bezeichnen.