Stammdaten-Tabelle mit 2 weiteren Zeitdimensionen

kleinUNDhilflos

Benutzer
Beiträge
5
Hallo Zusammen,

ich habe seit ca. 12 Jahren mit Software rund um Datenbanken zu tun. Hiervon wahr jedoch das Meiste recht rudimentärer kram (SELECT x FROM y, INSERT..., etc.). Seit kurzer Zeit darf ich mich mit der Konfiguration eines MSSQL Servers beschäftigen. Ein Buch von Klemens Konopasek, welches einen schnellen Einstieg verspricht, hat mir hier auch sehr weiter geholfen. Ich glaube jedoch immer noch etwas sehr an der Oberfläche zu schwimmen was die Möglichkeiten in MSSQL betrifft. Daher wäre ich für Lösungsvorschläge bei folgender Problemstellung dankbar:

Erstellt werden soll eine Stammdatentabelle:

Anlage: Standort: Nennleistung:
-------- ---------- ----------------
31416 Hamburg 16000 kW
31417 Berlin 20000 kW
31418 Rostock 25000 kW

(Wenn ich hier von Tabelle spreche, meine ich nicht zwangsläufig eine Tabelle im Sinne von SQL-Tabelle)

Eine solche Tabelle wäre sicherlich kein Problem ;)

Diese Tabelle verändert sich aber nun im laufe der Zeit, z.B. weil eine Anlage umgebaut wird. - Diese Darstellung: [] soll eine Tabelle darstellen.

>>> [] >>>>>> [] >>>>>> [] >>>>>> [] >>>>>> []
21.02.2010 25.06.2010 02.07.2011 08.08.2011 24.12.2013

Ich muss also den kompletten zeitlichen Verlauf der Stammdaten darstellen können. Um im Fehlerfall aber auch eine Aussage liefern zu können, wann was falsch eingetragen wurde und evtl. auch um im Zuge einer Jahresendabrechnung falsche Abrechnungen automatisch korrigieren zu können, benötige ich eine weitere Zeitdimension -> "Wann wurde die Änderung in die Stammdaten eingetragen".

[] [] [] [] [] [] []
[] [] [] [] [] [] []
[] [] [] [] [] [] []
[] [] [] [] [] [] []

So könnte z.B. bei einer aktuellen Abrechnung automatisch kontrolliert werden ob es seit der letzten Abrechnung Änderungen gegeben hat, und ob sich diese auf einen bereits abgerechneten Zeitraum beziehen und ggf. eine Differenzzahlung sofort mit aufgenommen werden.

Ich hatte schon mal überlegt eine SQL-Tabelle nach dem Muster:
lfdNr, DatenSatz, DatenFeld, DatenWert, gueltigVon, gueltigBis, eingetragenVon, eingetragenWann, deaktiviertVon, deaktiviertWann
zu erstellen und so jedes Feld in der Stammdatentabelle durch eine Zeile in der SQL-Tabelle darzustellen. Schlecht wäre natürlich, dass im eigentlichen Inhaltsfeld "DatenWert" man sich auf einen Datentyp beschränken müsste, oder je Datentyp ein eigenes "DatenWertString" etc. machen müsste.
Der Hauptgrund warum mir diese Lösung nicht gefällt ist, dass ich momentan nicht wüste wie ich eine Sicht oder etwas derartiges erstellen sollte, so dass man auf das ganze Konstrukt ähnlich einfach wie auf eine Tabelle zugreifen kann (z.B. in Office AddIns).

Ja, puh... viel Text... der Kern ist also:
- Es gibt eine Tabelle (z.B. wie Excel) in der Daten stehen.
- Die eine weitere Zeitdimensionen ist: Wann haben sich Daten geändert.
- Die zweite weitere Zeitdimension ist: Wann habe ich von der Änderung erfahren.
Und das alles soll irgendwie in einer Datenbank dargestellt werden...

Bin für alle Denkanstöße dankbar ;)


Gruß Uwe
 
Werbung:
Hallo Andreas,

dies wäre dann ja aber nur eine weitere Zeitdimension, oder sehe ich das falsch? Es wäre ja durchaus möglich, dass mir jetzt ein Fehler in den Daten für letztes Jahr auffällt, der die aktuellen Daten aber nicht betrifft.

Gibt es eine Möglichkeit eine etwas umfangreichere Sicht zu erstellen, in der man evtl. auch Schleifen programmieren kann?

Gruß Uwe
 
Hallo Andreas,

dies wäre dann ja aber nur eine weitere Zeitdimension, oder sehe ich das falsch? Es wäre ja durchaus möglich, dass mir jetzt ein Fehler in den Daten für letztes Jahr auffällt, der die aktuellen Daten aber nicht betrifft.

Eine weitere Logtabelle für die Logtabelle? ;-)

Gibt es eine Möglichkeit eine etwas umfangreichere Sicht zu erstellen, in der man evtl. auch Schleifen programmieren kann?

Gruß Uwe


Bestimmt.


Andreas
 
Werbung:
Möglich ist so einiges. Allerdings mit unter sehr komplex oder sehr rechen- bzw. speicherintensiv umzusetzen. Zunächst sollten wir uns die Frage stellen, wie oft ändert sich so ein Datensatz und wie groß ist der Datensatz und die Veränderung. Beim Logging kannst du dann erstmal zwei Wege gehen:

a) Du schreibst den Datensatz nochmal komplett neu entweder in die selbe oder in einer andere Tabelle gleichen Formats. Das erleichtert die Auswertung, ist aber nur bei wenig Änderungen und / oder einem hohen Anteil der geänderten Informationen am gesammten Datensatz sinnvoll. Beispiel: von 20 Atributen ändern sich gleichzeitig 10 und das nur einmal im Jahr. Hier wäre ein weiterer kompletter Datensatz kein Beinbruch.

b) Dynamischer ist es natürlich, nur das sich ändernde Feld wirklich zu loggen. Wenn man damit aber arbeiten möchte kommt man schnell an den Punkt, wo man das Format erhalten will. Dann muss man entweder verschiedene Log-Tabellen für verschiedene Datentypen ansprechen oder mehrere Spalten für verschiedene Formate vorhalten. Natürlich ist der Aufwand, die Information rückwirkend zu vergleichen ungleich größer.

Ich habe bei uns mehrere Trigger im Einsatz die für jedes sich verändernde Feld einen eigenen Eintrag in eine Log Tabelle schreiben. Die Tabelle hat auch noch zusätzliche Spalten für Uniqueidentifier, Integer oder Datetime Werte, so das ich notfalls damit auch "rechnen" kann. Je nach Datentyp des Ursprungsfeldes kopiere ich dann einfach nur einen Schnipsel Code in den entsprechenden Trigger, aber es ist schon viel Code. Dafür ist das Ergebnis in der Log Tabelle gut lesbar.

Eine Funktion zum Vergleich von Daten zu verscheidenen Zeitpunkten habe ich allerdings noch nicht im Einsatz, halte ich aber für machbar.
 
Zurück
Oben