German Richtiger Umgang mit einer Datenbank (mehr oder weniger speichern)

pjo12345

Active Member
Licensed User
Longtime User
Hallo!

Mal eine Frage zu Datenbanken. Ich hatte mal gelesen, dass man in Datenbanken keine Werte speichert, welche berechnet werden können. Gilt das noch bzw. auch für Android?

In meiner App erfasse ich zwei Zeiten. Beide speicher ich in einer Datenbank. Aus diesen Zeiten werden andere Werte berechnet. So z.B.: die Differenz und daraus ein weiterer Wert und noch 4-5 andere Zeiten zur Anzeige. Ist es nun ratsam, alle Werte in die Datenbank zu schreiben und zur Anzeige aus der Datenbank auszulesen? Oder lieber weniger Werte speichern und den Rest berechnen?
 

pucki

Active Member
Licensed User
Ich persönlich halte nix von "in der Datenbank" rechnen. Es gibt aber auch Ausnahmen. Z.B. eine Preiserhöhung wo man den neuen Preis eintragen will. Da ist es einfacher den neuen Preis in der Datenbank per Befehl zu berechnen. Ich gehe dann so vor.
1:) Feld preis in alten_preis umbenennen / bzw kopieren (Wegen Nachvollziehbarkeit)
2.) Feld preis anlegen (Nur bei umbenennen)
3.) Feld Preis neu berechnen

Das ganze geht mit 3 Befehlen und ist superschnell

Wenn man aber NUR die Daten aus nur einen Datensatz braucht beim Berechnen dann rechne ich per Programm jedes mal neu.

Was ich damit sagen will ist, es kommt immer auf Effizienz an und wichtig auf Nachvollziehbarkeit. Bei mein Beispiel z.b. weiß ich warum der neue_preis plötzlich diese Summe hat (alter_preis + Preiserhöhung). Und ich habe den Backup-Effekt (Preiserhöhung falsch ist egal, da ich den alten Preis als Backup habe)

Was dein Problem angeht, würde ich NIX in der Datenbank berechnen wenn es sich dabei um die Anzeige EINZELNER Datensätze handelt. Willst du aber Tabellen machen die schnell gescrollt werden sollen, kann es je nach Anzeigemodul durchaus sinnvoll sein diese (berechneten) Werte in der Datenbank abzulegen. Effizienz halt. Anzeigemodule sind keine guten Rechner, und Temporäre Datenbanken sind bei der Erstellung teilweise zeitintensiv.

Ich weiß das ich dir mit meinen Erklärungen nicht wirklich geholfen habe, aber ich hoffe dir klar zumachen wo der Grund für was liegt.
Mein persönlicher Tipp ist, versuch es ohne Zusatzfelder. Wenn es lahmt kannst du ja die Zusatzfelder immer noch anlegen und die Berechnungszeilen im Code löschen.

Und so nebenbei. Vergiss nicht das SQL-Datenbanken nicht gerade klein sind. ;)


Gruß

Pucki
 

MaFu

Well-Known Member
Licensed User
Longtime User
Ich nehme mal an, es handelt sich um eine lokale Datenbank!?
Grundsätzlich sollte man in Datenbanken, wenn nicht unbedingt erforderlich, Redundanzen vermeiden.
Die Ergebnisse sind redundant, da sie ja aus den Werten problemlos errechnet werden können. Und solange nur eine App darauf zugreift ist das ja auch kein Problem, die Berechnungslogik muss nur einmal implementiert werden.
Wenn natürlich möglicherweise die Ergebnisse Teil einer Datenbanksuche sein sollen, dann sieht die Sache schon anders aus. Dann macht es schon Sinn die Ergebnisse zu speichern, da die Suche sonst ev. zu langsam ist.
Auch bei einer Client/Server Datenbank, bei der ev. unterschiedliche Clients (Android, iPhone, PC, ...) auf die Datenbank zugreifen, muss man abwägen. In diesem Fall sollte die Berechnung auf dem Datenbankserver erfolgen um sie nicht in jeden Client implementieren zu müssen. Wenn das (je nach Server) nicht möglich ist, dann lieber die Ergebnisse speichern. Wenn natürlich die Eingabe auch auf verschiedenen Clients erfolgt, hat man natürlich wieder das Implementierungsproblem.

Edit: auch Pucki's Argumenten sind stichhaltig.
 
Top