# Best Practice: Ableitbare Daten berechnen oder speichern?



## Naryxus (15. Dez 2015)

Hallo,

ich frage mich öfters, was sinnvoller wäre.
Ganz klar das Alter aus einem Geburtsdatum zu berechnen ist in konstanter Laufzeit bewältigt. Da würde ich sagen auf jeden Fall berechnen.
Ich habe aber auch momentan ein Projekt am laufen, das auf Grundlage von Bankkontentransaktionen den Kontostand berechnen soll. Klar könnte ich einfach bei dem Wert 0 anfangen und alle Transaktionen aufsummieren. Die Anzahl der Transaktionen steigt aber kontinuierlich an, sodass es irgendwann teuer wird, alle Transaktionen aufzusummieren.
Würde ich jedoch einen Kontostand redundant mitzählen, so wäre er offensichtlich einfach zugänglich, aber ich müsste die korrekte Funktionsweise meiner Methoden beweisen, da diese nun kritischer sind und ich könnte unter Umständen (wenn auch sehr unwahrscheinlich) Probleme mit dem gleichzeitigen Zugriff auf den Kontostand bekommen.
Denkbar wäre auch eine dritte Variante: Ein Hybrid aus Berechnung und Speicherung. Dass man in regelmäßigen Abständen den Kontostand aktualisiert und die bis dahin berechneten Transaktionen archiviert.

Von den drei Ansätzen fänd ich die letzte am unschönsten. Was ist denn eure Meinung, bis wann sich eine Berechnung noch lohnt und ab wann eine Speicherung notwendig wird?

Grüße


----------



## Thallius (15. Dez 2015)

Ich würde den aktuellen Kontostand schon speichern. Wichtig dabei ist natürlich, dass alle Änderungen an den Daten nur über den Kontostand laufen dürfen. Es muss also eine Controller klasse geben, die als einzige Zugriff auf die Datenbank hat und alle Änderungen an der Datenbank vornimmt und diese weis dann auch immer den aktuellen Stand und kann diesen ebenfalls speichern.

Gruß

Claus


----------



## Dukel (15. Dez 2015)

Vielleicht findest du im folgenden Artikel etwas sinnvolles:
http://www.heise.de/developer/artikel/Persistenz-mit-Event-Sourcing-1974051.html


----------



## Joose (15. Dez 2015)

Genau in den Fall mit Kontostand wäre CQRS wahrscheinlich praktikabler.
Wobei hier auch die Frage wichtig ist: Ist es eine Software wo nur alle paar Tage etwas eingetragen wird oder wo sehr oft am Tag Änderungen passieren usw.


----------



## Naryxus (16. Dez 2015)

> Vielleicht findest du im folgenden Artikel etwas sinnvolles:
> http://www.heise.de/developer/artikel/Persistenz-mit-Event-Sourcing-1974051.html



Danke für den Verweis! Also wird es vermutlich doch auf eine Mischung aus Speichern und Berechnen hinauslaufen.
Meine erste Idee wäre jetzt gewesen, die Berechnung immer über das laufende Jahr laufen zu lassen. Der Benutzer soll dann am Ende des Jahres seinen Endkontostand bestätigen (die Transaktionen werden alle jeweils per Hand eingegeben) und dann wird der Kontostand in einer anderen Tabelle gespeichert.
Die Berechnung erfolgt dann ab dem letzten Eintrag in dieser Tabelle als Grundwert mit jeweils allen neueren Transaktionen.



> Ist es eine Software wo nur alle paar Tage etwas eingetragen wird oder wo sehr oft am Tag Änderungen passieren usw.



Das kommt hier ganz auf den Benutzer an. Manche Benutzer werden da so gut wie täglich etwas eintragen. Andere Benutzer werden da nur wöchentlich was eintragen.


Grüße, Naryxus


----------



## Dukel (16. Dez 2015)

Die Frage ist, wie sind die Anforderungen?
Muss die Nachvollziehbarkeit nur mitprotokolliert sein oder muss diese auch angezeigt werden?
Ich würde evtl. nur den Kontostand erhöhen / verringern und die Transaktionen, z.B. per Trigger, in einer weiteren Tabelle mitprotokollieren.


----------



## Naryxus (16. Dez 2015)

Dukel hat gesagt.:


> Muss die Nachvollziehbarkeit nur mitprotokolliert sein oder muss diese auch angezeigt werden?



Die einzelnen Transaktionen sollen tatsächlich auch mit Datum und mit kurzer optionaler Notiz angezeigt werden können.


----------

