0

私は費用トラッカーを作成したいと思います。私が探したいものの1つは、カテゴリーごとにどれくらい毎月費やしたかです。FireStore/CloudDatastoreでの集約。作成/更新時にクラウド機能を使用しますか?

FireStore/DataStoreではどのようにすればよいですか?

  1. 必要なデータをプルダウンして、集約をローカルに行いますか?非常に遅く見えますか?
  2. トランザクションが作成/更新されるたびに集約を実行し、それをテーブルに保存しますか?しかし、これは多くの機能を呼び出す結果となるかもしれませんが、コストがかかるかもしれません。

良い方法はありますか?現在、2のような選択肢がベストですか?しかし、どうも私はコストを減らすことができるのだろうか?

私は、集計されたデータがリアルタイムである必要はないかもしれないことに注意してください。だから、クラウドの実行をデバウンスする方法はありますか?私は時々、私は一括してトランザクションのバッチを挿入することに注意しているので。特定のクエリの機能を無効にし、バッチが終了した後に手動で呼び出す方法があるかどうかは疑問ですか?

答えて

0

あなたが説明する2つのアプローチが実際に最も一般的です。

最良のアプローチは、お持ちのトランザクションの数によって異なります。トランザクションがほとんどない場合は、各クライアントで集約を行うことは完全に可能です。しかし、トランザクションが増えるにつれて、データをダウンロードする際のオーバーヘッドが非常に大きくなり、データベース全体の稼働率を維持したい可能性が高くなります。

通常、どの取引でも最新の状態に保つことをお勧めします。クライアント側のコードでも、複数のユーザーがお互いの更新を上書きするのを防ぐためにトランザクションを使用したり、悪意のあるアクターがトランザクションに一致しない集計を書くのを防ぐためにサーバー側のセキュリティルールを使用して、そのことを行うこともできます。

バッチで集計する場合は、制御するサーバーまたはクラウド機能で定期的にコードを実行することをお勧めします。

ドキュメント書き込みをデバウンスするためのクラウド機能には何も組み込まれていません。 Firestoreにデバウンスカウンタを置いておくこともできますが、それは各トランザクションでドキュメントを読み書きすることになります。

このブログの記事で説明されているように、このビデオに表示されているように、もっと妥当な機能はタイマーで実行されているようです。しかし、その場合のデータ構造によって、コードが集約する必要のあるトランザクションを検出できるようにする必要があります。

これを行う1つの方法は、トランザクションを何らかの方法で注文できるようにすることです。それらにtimestampを与え、アグリゲーションコードがすでに集計されている最後のタイムスタンプを追跡する(おそらくデータベース内にある)ようにします。その後、アグリゲータそれは、実行されるたび:

  1. が集計値
  2. を更新し、
  3. はそれが最後のそれらのトランザクションにわたって
  4. ループを実行した以降に追加されたトランザクションのデータベースを照会し、現在の集計値を読み出し集計値と最後のタイムスタンプをトランザクション内のデータベースに書き戻します(両方が書き込まれているか、どちらも書き込まれていないことを確認するため)
関連する問題