0

Google App Engine を使用していますが、一部のデータ クエリでパフォーマンスが低下しています。App Engine データストアの設計は、SQL データベースでの作業とは異なる考え方であると読みましたが、これが最善の方法であるかどうか確信が持てません。正しい軌道に乗るために、2 つの質問があります。

具体的には:

FooタイプとタイプがありUserFooます。それぞれUserFooが対応する の「インスタンス」であり、Fooそのインスタンスに固有のデータを保持します。私のFooタイプにはfooCode一意の識別子であるプロパティがあり、それらのプロパティを使用してUserFooそれぞれをマップします。次に、次のようなコードで各 Foo を操作します。FoofooCode

foos = Foo.all().filter('bar =', bar)
for foo in foos:
    userFoo = UserFoo.all().filter('userKey =', user).filter('fooCode =', foo.fooCode)

注:fooCode新しい を簡単に削除して再追加Fooし、対応するすべての を再マップする必要がないように、参照キーを使用していUserFooます。

一般に:

GAE データストア テーブルを設計するための一般的なアプローチと、それらを使用するためのベスト プラクティスは何ですか?

4

3 に答える 3

1

次の変更をお勧めします。

  1. UserFooのReferencePropertyを使用して、そのFooを参照するか、必要に応じて子エンティティにします。既存のエンティティの再マッピングについてのあなたのコメントを理解していません-それは決して必要ではないはずです。
  2. 'bar'プロパティのコピーを各UserFooに追加します
  3. UserFoo.all()。filter('bar ='、bar).order('userKey')に対して単一のクエリを実行します。結果はバーでフィルタリングされ、ユーザーごとにグループ化され、ユーザーごとに1つではなく、1つのクエリのみが必要になります。
  4. 結果を反復処理するのではなく、クエリで.fetch()を呼び出すことにより、結果を一度にフェッチします。これははるかに効率的です。
  5. 必要に応じて、 ReferencePropertyプリフェッチを使用して各UserFooのFooオブジェクトを取得します。
于 2010-08-04T12:14:41.633 に答える
1

一般に:

  • 可能な限り非正規化します。

  • 可能な限りキーを介してエンティティを参照します。これは、データストアからデータを取得する最速の方法です。

具体的には、コードをフィルターに入れるのではなく、ReferenceProperty を使用して関係を確立すると、パフォーマンスが大幅に向上する可能性があります。UserFoo の Foo のクエリは、Foo の削除と再マッピングよりも頻繁に行われると思います。その場合、実際的かつデータストアに関して行うべきことは、参照プロパティを使用することです。

また、Foo-UserFoo 関係を単一のエンティティに非正規化できる場合は、一連のクエリ全体の必要性が完全になくなります。

于 2010-08-03T20:01:27.820 に答える
1

これがgets anti-patternの階段です。解決策はReferenceProperty プリフェッチです。

問題は、ReferenceProperty を使用しないことにしたことです。この選択を再考することをお勧めします。

注: 新しい Foo を簡単に削除して再追加し、対応するすべての UserFoo を再マップする必要がないように、参照キーに対して fooCode を使用しています。

エンティティ キーは、そのパスのエンコードされた表現にすぎないことに注意してください。エンティティとその祖先の種類と名前または ID です。を削除してから再作成したFoo場合、別の名前または ID が与えられた場合にのみ別のキーを持つことになります。古いエンティティと新しいエンティティにfooCode同じ.fooCodeFoo

于 2010-08-03T20:05:13.207 に答える