Gibt es Richtlinien oder Faustregeln, die festlegen, wann Aggregatwerte gespeichert und wann sie im laufenden Betrieb berechnet werden sollen?
Angenommen, ich habe Widgets, die Benutzer bewerten können (siehe Schema unten). Jedes Mal, wenn ich ein Widget anzeige, kann ich die durchschnittliche Benutzerbewertung aus der Ratings
Tabelle berechnen . Alternativ könnte ich die Durchschnittsbewertung auf dem Widget
Tisch speichern . Dies erspart mir die Berechnung der Bewertung jedes Mal, wenn ich das Widget anzeige. Dann müsste ich die durchschnittliche Bewertung jedes Mal neu berechnen, wenn ein Benutzer ein Widget bewertet.
Ratings Widgets
--------- -------
widget_id widget_id
user_id name
rating avg_rating <--- The column in question
Wie oft müssen Sie die Werte berechnen / anzeigen, um festzustellen, wie oft die zugrunde liegenden Zahlen geändert / aktualisiert werden.
Wenn Sie also eine Website mit 10.000 täglichen Treffern haben, die einen Wert anzeigt, der sich nur einmal pro Stunde ändert, würde ich ihn berechnen, wenn sich die zugrunde liegenden Werte ändern (was auch immer ein Datenbankauslöser sein könnte).
Wenn Sie ein Tool haben, mit dem Sie Statistiken anzeigen können, die sich im Sekundentakt ändern, aber nur drei Personen Zugriff haben und die nur ein paar Mal am Tag angezeigt werden, ist die Wahrscheinlichkeit höher, dass ich rechne es im laufenden Betrieb. (es sei denn, es dauert ein paar Minuten, um zu berechnen, dass es keine große Sache ist, veraltete Daten zu haben ... und mein Chef sagt mir, ich soll das Ding einfach jede Stunde aus cron generieren, also hat er es nicht abwarten, wann er es sich ansehen will.)
quelle
Verwenden Sie die StaleWidgets-Tabelle als Warteschlange für "ungültige" (neu zu berechnende) Widgets. Verwenden Sie eine andere (asynchrone) Thread-Task, die diese Werte neu berechnen kann. Der Zeitraum oder Zeitpunkt der Neuberechnung hängt von den Systemanforderungen ab:
quelle
Ich würde vorschlagen, on fly zu berechnen, wenn die Berechnung nicht zu umständlich ist und wenn Sie komplexe Berechnungen und häufige Aktualisierungen haben, aber nicht, dass die Frequenz gelesen wird, als Sie berechnete Daten speichern können und über eine zusätzliche Spalte (bool) verfügen, in der gespeichert wird, ob eine Neuberechnung erforderlich ist oder nicht . Setzen Sie diese Spalte beispielsweise auf true, wenn eine Neuberechnung durchgeführt werden soll, aber führen Sie keine Neuberechnung durch, und setzen Sie diese Spalte bei einer Neuberechnung auf false (dies stellt dar, dass der berechnete Wert aktuell und nicht veraltet ist).
Auf diese Weise müssen Sie nicht jedes Mal neu berechnen, sondern nur, wenn Sie den Spaltenwert lesen und neu berechnen müssen. Auf diese Weise sparen Sie viel Neuberechnung.
quelle
Insbesondere für den Fall gibt es eine andere Lösung, bei der Sie nicht alle Bewertungen addieren und durch die Summe dividieren müssen, um den Durchschnitt zu ermitteln. Stattdessen können Sie ein anderes Feld verwenden, das die Gesamtsumme der Bewertungen enthält. Wenn Sie also eine Bewertung hinzufügen, berechnen Sie den neuen Durchschnitt mit (avg_rating × total + new_rating) / total. Dies ist viel schneller als aggregiert und reduziert die Festplattenlesungen seit Ihnen Sie müssen nicht auf alle Bewertungswerte zugreifen. Ähnliche Lösungen können auch für andere Fälle gelten.
Der Nachteil dabei ist, dass es sich nicht um eine Säuretransaktion handelt, sodass Sie möglicherweise mit einem veralteten Rating abschließen. Sie können dies jedoch mithilfe von Triggern in der Datenbank lösen. Das andere Problem ist, dass die Datenbank nicht mehr normalisiert ist, aber keine Angst davor haben, Daten im Austausch mit der Leistung zu denormalisieren.
quelle