私は Google I/O 2009 の次のビデオを見てきました: http://www.youtube.com/watch?v=AgaL6NGpkB8ブレットがマイクロブログの例を示しています。
彼は2つ
のデータストアスキーマについて説明しています
。この例でデータストアの動作が異なる理由がわかりません。どちらの場合も、レシーバーは単なる StringListProperty です。それを説明できますか?
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
receivers = db.StringListProperty()
class Message(db.Model):
author = db.StringProperty()
message = db.TextProperty()
class MessageIndex(db.Model)
receivers = db.StringListProperty()
2 に答える
彼の講演では、クエリを実行するときに、メッセージの内容 (「送信者」と「本文」) を取得したいと想定しています。App Engine では、エンティティは全体として逆シリアル化されます。特定のフィールドだけをロードすることはできません。そのため、最初の例でクエリを実行すると、レシーバのリスト全体をロードする必要があります。
2 番目の例では、MessageIndex に対してキーのみのクエリを実行し、対応する Message エンティティをフェッチしてロードできます。MessageIndex プロパティをメモリにロードすることはないため、それらに関連付けられた大きくて高価なリスト プロパティを逆シリアル化する必要はありません。
新しい機能である射影クエリがあることに注意してください。これにより、エンティティの部分的なビューを取得できますが、インデックス付きプロパティでのみ取得できます。
https://developers.google.com/appengine/docs/python/datastore/projectionqueries
内部でどのように機能するかは、エンティティ、キー、およびインデックスがすべて異なるテーブルに格納されていることです。エンティティ全体を取得する場合は、メイン エンティティ テーブルでルックアップを実行する必要があります。これは、全体を逆シリアル化する必要があるためコストがかかります (そして、そのテーブルをいじる他のプロセスのコンテンツ)。
プロジェクション クエリはキー クエリに似ていますが、エンティティ キーの代わりにインデックス付きの値のセットをキーとして使用する点が異なります (インデックス テーブルが内部で動作するため)。データのサブセットが必要で、インデックスを作成するために料金を支払うことを正当化できる場合 (または既にインデックスが作成されている場合)、射影クエリは高速で安価です。インデックス テーブルのみを検索し、エンティティまたはキー テーブルに触れる必要はありません。