すべてのCloud Datastoreクエリは、インデックスのプロパティで指定された順序でエンティティキーを含む1つ以上のインデックスを使用して結果を計算します。オプションでエンティティの祖先もオプションです。索引は、アプリケーションがエンティティーに対して行う変更を反映するために段階的に更新されます。これにより、すべての照会の正しい結果が利用可能になり、それ以上の計算は必要ありません。データストア効率、低レベルAPI
一般的に、私は
datastore.get(List<Key> listOfKeys);
が速くまたはクエリより遅い(同じ結果を)用意したインデックスファイルであるかどうかを知りたいです。
Query q = new Query("Kind")(.setFilter(someFilter));
私の現在の問題:
私のデータは、レイヤーとのポイントで構成されています。ポイントは1つのユニークなレイヤにのみ属し、レイヤ内でユニークなIDを持ちます。いくつかの点でポイントをロードすることができます:
1)「レイヤー名」プロパティを持つポイントを持ち、フィルターを使用して照会します。 - ここでは、レイヤ名が動的に変更されるため、データストアに結果が用意されるかどうかはわかりません。
2)キーのみを使用してください。層はポイントIDを格納する必要があります。私は実際には一般的な種類の「ポイント」を必要としない、より具体的な可能性:
KeyFactory.createKey("Layer", "layer name");
KeyFactory.createKey("Point", "layer name"+"x"+"point id");
3)フィルタなしでクエリを使用してください種類は次のようになります(「レイヤー名」+「ポイントID」) - 何ですかより多くの種類を作成するためのコスト?これが最速の方法でしょうか?
実際にデータストアがどのように詳細に機能しているかを実際に調べることはできますか?
整合性の問題を指摘していただきありがとうございます。私は、私のレイヤーが編集されて、ほんの一握りのユーザーに表示されるべきだということを含めるべきでした...そして、なぜ私はエンティティ名として '名前'について心配すべきですか?私は人々が既に使用されている名前のレイヤーを保存することを防ぎます...私は非常に簡単にキーを再作成できます。 – thehorseisbrown
最終的な一貫性は設計制約であり、ユーザー数の関数ではありません。その意味を理解するには、アプリエンジンにデプロイし、保存してリロードしてください。ほとんどの場合、保存したポイントはほとんど表示されません。この問題を解決する必要があります。 – Nick
エンティティ名としてnameを使用した場合、名前変更は新しいレコードのput、古いもののdeleteで、レイヤを参照するすべてのエンティティを更新する必要があります。これは、リレーショナルデータベースのpkとして名前を使用するのと同じです。論理的に接続されたすべてのエンティティに影響を与えます。そのトランザクションを実行しようとすると、XGトランザクションあたり25エンティティの制限があります。したがって、このモデルでは、レイヤに23ポイントを超えていれば問題が発生します。私はあなたに対処したくない痛みのレベルだと約束します。 – Nick