0

多くの人と同じように、私は NoSQL の世界に慣れていません。私は多くの調査を行いましたが、適切な答えが見つからない点が 1 つだけあります。

システムの簡単な説明:

さまざまな Web サイトで訪問者のデータを収集するシステムを構築しています。各訪問は、デバイス タイプ、IP、訪問時間などのプロパティを持つ、データストア内のエンティティです。

データストアには何百万もの訪問があります。

私の質問は、このデータをクライアントに提供する方法です。私のデータは、「訪問」エンティティとしてデータストアに設定されています。

顧客がログインしたときに、何百万ものレコードを表示したくありません。たとえば、一般的な統計を表示したいと思います。モバイル デバイスでの訪問数、ある期間における特定の国からの訪問数などです。

NoSQL データベースは初めてなので、クライアントのダッシュボードにこれらの統計を表示する方法がわかりません。

私が知っているように、Datastore は集計をサポートしていません。たとえば、クエリ結果の数を取得することもできません。

私は BigQuery を見ましたが、BigQuery はデータストアの「バックアップ」で動作します。手動でバックアップを行う必要なく、リアルタイムでデータを提供する必要があります。

また、カウンターとシャーディングカウンターについて読みましたが、これは適切なアプローチですか? 各追跡グループの各プロパティの各クライアントのカウンターを持っていますか? このように合計数を表示しますか?単純な目的には多すぎるように思えます。

私を正しい方向に導くことができる入力や説明は、高く評価されます。

よろしくお願いします

4

2 に答える 2

0

私が知っているように、Datastore は集計をサポートしていません。たとえば、クエリ結果の数を取得することもできません。

本当じゃない。1 行のコードで、クエリによって返される多数のエンティティを取得できます。クエリ自体はキーのみにすることができ、これは非常に高速で基本的に無料です。

于 2016-04-29T00:29:50.503 に答える
0

はい、カウンターは、パフォーマンスの点で問題への優れたアプローチです。ただし、ストレージのサイズや、新しいタイプの統計を導入するたびにカウンターを作成する必要があるという事実など、いくつかの欠点があります。

現在の「訪問」エンティティに加えて、集計データをデータストアのシャード カウンターに格納することを選択できます。これらのカウンターは、リアルタイムで、またはタスク キューの 1 つのタスクを介して更新できます。現在の Visit エンティティのさまざまなカウンターを作成する Task を作成するのは、かなり簡単です。

シャーディングは、複数の「基礎となる」エンティティを作成する方法であり、それらを組み合わせると意味のあるデータを表します。シャーディングは、同時更新によるパフォーマンスの問題がないことを確認するために行われます。

Google ドキュメントから:

カウンターである単一のエンティティがあり、更新レートが速すぎる場合、シリアル化された書き込みがスタックしてタイムアウトし始めるため、競合が発生します。リレーショナル データベースを使用している場合、この問題を解決する方法は少し直感に反します。このソリューションは、App Engine データストアからの読み取りが非常に高速で低コストであるという事実に依存しています。競合を減らす方法は、シャード カウンターを構築することです。つまり、カウンターを N 個の異なるカウンターに分割します。カウンターをインクリメントしたい場合は、シャードの 1 つをランダムに選択してインクリメントします。合計カウントを知りたい場合は、すべてのカウンター シャードを読み取り、個々のカウントを合計します。シャードが多いほど、カウンターのインクリメントのスループットが高くなります。

詳細と役立つ例については、リンクを参照することをお勧めします。

于 2016-07-12T09:06:05.847 に答える