11

現在、私のコードの多くは祖先を広範囲に使用してオブジェクトを配置およびフェッチしています。しかし、私はいくつかのものを変えようとしています。

私は当初、探しているエンティティの祖先が誰であるかを知っていれば、祖先がクエリを高速化するのに役立つと考えていました。しかし、祖先は主にトランザクションのサポートに役立つことがわかったと思います。私はトランザクションを利用しないので、先祖は助けというよりも、ここのシステムに負担をかけているのではないかと思っています。

私が持っているのは、ユーザーエンティティと、コメント、タグ、友達などの他の多くのエンティティです。ユーザーは多くのコメント、タグ、およびフレンドを作成できるため、ユーザーが作成するたびに、これらすべての新しく作成されたオブジェクトの祖先をユーザーとして設定します。

したがって、コメントを作成するときに、祖先をユーザーとして設定します。

comment = Comment(aUser, key_name = commentId)

私がこれを行っている唯一の理由は、厳密にクエリの目的のためです。特定のユーザーによるすべてのコメントを取得したい場合は、authorEmail = userEmail のすべてのコメントをクエリするよりも、共通の祖先を持つすべてのコメントを取得する方が速いと思いました。

したがって、特定のユーザーによるすべてのコメントを取得したい場合は、次のようにします。

commentQuery = db.GqlQuery('SELECT * FROM Comment WHERE ANCESTOR IS :1', userKey)

だから私の質問は、これは先祖の良い使い方ですか?代わりに、各コメントに、コメントを作成したユーザー オブジェクトを参照する ReferenceProperty を持たせ、それによってフィルター処理する必要がありますか?

(また、インデックス付きの ReferenceProperty の代わりに先祖を使用すると、書き込みコストが節約されると考えていました。ここで間違っていますか?)

4

1 に答える 1

8

書き込みコストについては正しいです。先祖は「無料」のキーの一部です。参照プロパティがインデックス化されている場合、参照プロパティを使用すると書き込みコストが増加します。
その参照プロパティに対してクエリを実行するため、インデックスを作成する必要がある場合。

祖先はトランザクションにとって重要なだけではありません。HRD (デフォルトのデータストア実装) では、同じ祖先で各コメントを作成しないと、クワイアの一貫性が強くありません。

-- ニックのコメントを追加 ---
同じ親を持つすべてのエンティティは同じエンティティ グループに属し、エンティティ グループへの書き込みはシリアル化されるため、ここで祖先を使用すると、複数のエンティティを同時に書き込む場合に速度が低下します。ただし、グループ内のすべてのエンティティは、インスタンス内のグループのルートを形成するユーザーによって「所有」されるため、これは問題にはなりません。実際、あなたが行っていることは、実際には推奨される設計パターンです。 .

于 2012-08-25T16:41:29.603 に答える