モデル計算データ
Overview
多くの場合、アプリケーションはデータベースに保存されているソース データから値を生成する必要があります。 新しい 値を計算するには、特に大規模なデータセットの場合や複数のドキュメントを調査する必要がある場合に、大量の CPU リソースが必要になる可能性があります。
計算値が頻繁に要求される場合は、その値をデータベースに保存すると効率的です。 これにより、アプリケーションがデータをリクエストするときに、必要な読み取り操作は 1 回だけになります。
計算パターン
読み取りが書込みを大幅に超える場合、計算されたパターンによって計算を実行しなければならない頻度が減ります。 読み取りのたびに計算の負荷がかかる代わりに、アプリケーションは計算された値を保存し、必要に応じて再計算します。 アプリケーションは、計算値のソースデータを変更する書き込みごとに、または定期的なジョブの一部として値を再計算できます。
注意
定期的な更新では、計算された値は特定の読み取りで正確になる必要はありません。 ただし、正確な精度が必要ない場合は、このアプローチはパフォーマンスを向上させる価値があるかもしれません。
例
アプリケーションには、映画の本数
次の screenings
コレクションについて考えてみます。
db.screenings.insertMany( [ { theater : "Alger Cinema", location : "Lakeview, OR", movie_title : "Reservoir Dogs", num_viewers : 344, revenue : 3440 }, { theater : "City Cinema", location : "New York, NY", movie_title : "Reservoir Dogs", num_viewers : 1496, revenue : 22440 }, { theater : "Overland Park Cinema", location : "Boise, ID", movie_title : "Reservoir Dogs", num_viewers : 760, revenue : 7600 } ] )
ユーザーは多くの場合、特定の映画を何人見ているか、その映画が構築した: この例では、 num_viewers
とrevenue
を合計するには、「リザーバード」というタイトルの映画を公開した映画館に対して読み取りを実行し、それらのフィールドの値を合計する必要があります。 情報が要求されるたびにその計算を実行しないようにするには、合計値を計算し、映画レコード自体とともにmovies
コレクションに保存します。
db.movies.insertOne( [ { title : "Reservoir Dogs", total_viewers : 2600, total_revenue : 33480, ... } ] )
低書込み環境では、 screenings
データの更新と組み合わせて計算を実行できます。
より定期的な書込み (write) がある環境では、計算は定義された間隔で、たとえば 1 時間ごとに実行されます。 screenings
のソースデータはmovies
コレクションへの書込みの影響を受けないため、いつでも計算を実行できます。
これは、CPU ワークロードを削減し、アプリケーションのパフォーマンスを向上させる一般的な設計パターンです。 同じ計算を繰り返し実行し、読み取りと書込みの比率が高い場合は、 計算パターン を検討してください。
その他のサンプルユースケース
映画データベースの例の総売上額や投票数など、合計が頻繁に要求されるケースに加えて、計算されたパターンは、データに対して計算を実行する必要がある場合に適しています。 例:
車両データに対して大規模な集計クエリを実行し、データが再計算されるまでの数時間表示する結果を保存する自動車会社。
複数の異なるソースのデータを編集して、「ベストレビュー ガジェット 100」のようなランク順のリストを作成する消費者レポート作成会社。 リストは定期的に再生成され、基礎となるデータは個別に更新されます。