コストとスケーラビリティの観点から、大量のデータの統計を取得する最も効率的な方法は何ですか?
具体的な例を見てみましょう。1000 社の企業があり、それぞれに 10000 人以上の顧客がいます。これらの企業はすべて小売業です。より一般的に言えば、あらゆる業界のあらゆる企業であり、顧客から特定のことを知りたいと考えています。
これらの企業のうち 10 社は、自社のコール センターの業績を知りたいと考えており、顧客に 1 ~ 5 の評価を求めるメールを送信し、顧客はリンクをクリックして 1 ~ 5 の評価を付けています。
これらの企業のうち 20 社 (前の 10 社の一部を含む可能性があります) は、別のことを知りたいと考えており、1 ~ 5 の評価を求めています。
これらの企業のそれぞれに、平均評価、または同じアンケートを送信した、または重複した質問をした他の企業との比較に関するフィードバックを提供したい場合、これらの統計を計算するための最良の戦略は何でしょうか?
オプション 1: 統計専用の特別なエンティティを用意し、顧客が何かについて会社を評価するたびに、統計カウンターをインクリメントします (たとえば、投票数、投票総数の統計カウンターをインクリメントし、に基づいて投票を追跡している場合は男性/女性カウンターをインクリメントします)。性別など)このアプローチの問題は、すべてのデータエントリに対してy回の追加書き込み(nは追跡する統計レポートの数)を行うことになり、それらの統計に制限されることです。追跡したいこと。また、Peter がここで彼の応答で述べたように、書き込みは 1 回/秒に制限されます。Objectify を使用して GAE にデータを同時に書き込み ます。 x * y 回の書き込みと y 回の読み取りを行って統計を報告します。
オプション 2: 次のようにします: ofy.query(MyEntity.class).filter("field", v).count(); 落とし穴は、これらすべてのエンティティを検索していることです。エンティティの数が x になるカウントを行っている場合、GAE は読み取り x 操作に対して料金を請求しますか? また、潜在的に 20000 エントリを実行している場合、タイムアウトやクエリあたりの最大読み取り数などに関して何らかの制限に達しませんか? 統計を取得する頻度にもよりますが、制限に達しないと仮定すると、統計を取得するたびに x 回の読み取りが行われることになります。
オプション 3: 構築しようとしているすべての統計情報について、各フィードバック エントリに追加のプロパティを配置します。次に、スケジューラを毎時/日/週/...ごとに実行し、カーソルを使用して各エントリを実行し、統計列をカウント済みとしてマークし、その値を統計エンティティに追加します。フィードバック エントリの数が x であり、このデータに関する y 個のレポートを取得する場合、つまり (統計エンティティですぐにではなくメモリで計算を行うと仮定すると) x 回の書き込みで、x 回のフィードバックをマークします。レポートはカウントされ、y number は毎時 / 日 / 週ごとに書き込み、更新された統計値を保存します。これは、x 回のフィードバック レポートに対して、少なくとも 2 * x 回の書き込みと、統計を読み取るための y 回の読み取りのみを行うことを意味します。
上記のすべてが厄介なようですが、それを行うためのより良い方法はありますか? そうでない場合、上記のうちどれが、ボリュームが大規模な場合でも壊れず、読み取り/書き込み/ストレージの観点から、既存のコストよりも劇的にコストを増加させない、より良い方法です。