0

できるだけ効率的に計画を立てたいと思います。Google App Engineを使用する場合、読み取りと書き込みのコストが重要になるため、これらを最小限に抑えたいと思います。データストアの「キー」の概念を理解していません。私が知りたいのは、ある種のフィルターでフェッチするよりも、それが何であるかを知っていることを考えると、そのキーでエンティティをフェッチする方が効率的でしょうか?

Userというモデルがあり、ユーザーがcommentIdの配列(リスト)を持っているとします。ここで、このユーザーのコメントをすべて取得したいと思います。私には2つの選択肢があります:

  1. ユーザーのcommentIdの配列はキーの配列であり、各キーはCommentエンティティへのキーです。私はすべてのキーを持っているので、それらのキーによってすべてのコメントをフェッチすることができます。

  2. ユーザーのcommentIdの配列は、私がカスタムメイドした識別子です。この場合、通常の整数を自動インクリメントし、データストア内の各コメントには一意のcommentIntegerIdがあります。したがって、すべてのコメントを取得したい場合は、IDの配列にあるIDを持つすべてのコメントに基づいてフィルター処理されたフェッチを実行します。

どの実装がより効率的で、なぜですか?

4

2 に答える 2

4
  1. キーによるフェッチは、最も直接的な操作であり、インデックスルックアップを実行する必要がないため、データストアからエンティティを取得するための最速の方法です。
  2. エントリを作成するたびに(key_nameを指定しない限り)、App Engineは一意の(親エンティティごとに)数値IDを生成します。これは、コメントのIDとして使用する必要があります。
于 2012-04-15T18:14:56.880 に答える
1

使用パターンに基づいてNoSqlデータベース(= GAEデータストア)を設計する必要があります。

すべてのユーザーのコメントを一度に取得する必要があり、いくつかの基準に基づいて1つまたは一部を取得する必要がない場合(クエリなど)、速度とコストの観点から、すべてのコメントを次のようにシリアル化するのが最も効率的な方法です。エンティティ内のバイナリblob(またはBlobstoreに保存)。

しかし、コメントは通常、ユーザーと投稿の両方に関連付けられているため、そうではないと思います。この場合、上記のアドバイスは実行可能ではありません。

タイトルの質問に答えるにgetは、キーによるものはプロパティによるものよりも常に高速queryです。クエリは最初にインデックスを通過してプロパティの条件を満たすため、キーを取得し、次にgetこのキーを使用して実行するためです。

于 2012-04-15T19:01:11.620 に答える