0

Ich möchte einen Ausgaben-Tracker erstellen und eines der Dinge, die ich herausfinden möchte, ist, wie viel ich in jedem Monat pro Kategorie ausgegeben habe.Aggregation auf FireStore/CloudDatastore. Verwenden Sie Cloud-Funktionen onCreate/Update?

Wie soll ich das in FireStore/DataStore machen?

  1. Herunterziehen der erforderlichen Daten und lokale Aggregation durchführen? Scheint sehr langsam?
  2. Aggregation jedes Mal durchführen, wenn eine Transaktion erstellt/aktualisiert und in einer Tabelle gespeichert wird? Aber das kann zu vielen Aufrufen der Funktionen führen, die teuer sein können?

Gibt es einen besseren Weg? Scheint wie 2 ist derzeit die beste Option? Aber ich frage mich, ob Theres ich sowieso Kosten reduzieren kann?

Ich bemerke, dass ich die aggregierten Daten möglicherweise nicht in Echtzeit brauche. Gibt es also eine Möglichkeit, die Ausführung der Cloud-Funktion zu entprellen? Da ich feststelle, dass ich manchmal eine Reihe von Transaktionen einfüge. Frage mich, ob es eine Möglichkeit gibt, Funktionen für bestimmte Abfragen zu deaktivieren und sie manuell aufzurufen, nachdem der Stapel zum Beispiel beendet wurde?

Antwort

0

Die beiden Ansätze, die Sie beschreiben, sind in der Tat am häufigsten.

Der beste Ansatz hängt hauptsächlich von der Anzahl der Transaktionen ab, die Sie haben. Wenn Sie wenige Transaktionen haben, ist es möglicherweise völlig in Ordnung, die Aggregation auf jedem Client durchzuführen. Aber wenn Sie mehr Transaktionen erhalten, wird der Aufwand für das Herunterladen der Daten unerschwinglich und Sie möchten eher eine laufende Summe in der Datenbank behalten.

Ich würde normalerweise empfehlen, die Gesamtsumme mit einer Transaktion auf dem neuesten Stand zu halten. Sie können dies sogar mit clientseitigem Code tun, indem Sie Transaktionen verwenden (um zu verhindern, dass mehrere Benutzer die Aktualisierungen gegenseitig überschreiben) und serverseitige Sicherheitsregeln (um böswillige Akteure daran zu hindern, ein Aggregat zu schreiben, das nicht zu ihrer Transaktion passt).

Wenn Sie in Stapeln aggregieren möchten, sollten Sie regelmäßig Code ausführen, entweder auf einem Server, den Sie steuern, oder in Cloud-Funktionen.

In Cloud-Funktionen ist nichts eingebaut, um Dokumentenschreibvorgänge zu entprellen. Sie könnten wahrscheinlich einen Entprellungszähler in Firestore behalten, aber das würde dann ein Dokument für jede Transaktion lesen/schreiben.

Angemessener scheint eine Funktion auf einen Timer zu laufen, wie in diesem Blogbeitrag beschrieben und in diesem Video gezeigt. Sie müssen jedoch sicherstellen, dass Ihre Datenstruktur in diesem Fall den Code erkennt, welche Transaktionen aggregiert werden müssen.

Eine Möglichkeit, dies zu tun, besteht darin sicherzustellen, dass die Transaktionen auf irgendeine Weise geordnet werden können, z. indem Sie ihnen eine geben und Ihren Aggregationscode behalten (wahrscheinlich in der Datenbank) des letzten Zeitstempels, den er bereits aggregiert hat. Dann, wenn der Aggregator läuft es:

  1. liest den aktuellen aggregierten Wert
  2. die Datenbank für Transaktionen abfragt, die hinzugefügt wurden, seit es zuletzt diese Transaktionen liefen
  3. Schleifen über, den aggregierten Wert der Aktualisierung
  4. schreibt den aggregierten Wert und den letzten Zeitstempel zurück in die Datenbank in einer Transaktion (um sicherzustellen, dass entweder beide geschrieben oder keine geschrieben werden)
Verwandte Themen