3

次のようなモデルの場合:

class Thing(ndb.Model):
    visible = ndb.BooleanProperty()
    made_by = ndb.KeyProperty(kind=User)
    belongs_to = ndb.KeyProperty(kind=AnotherThing)

基本的に「or」クエリを実行しますが、さまざまなプロパティを比較するため、組み込みの OR を使用できません...現在のユーザーに設定されているか、現在のユーザーであるすべてのThing(特定の に属する)を取得したい。AnotherThingvisibleTruevisibleFalsemade_by

どちらがデータストアへの要求が少なくなります (つまり、経済的なコストが少なくなります):

  1. クエリを実行してすべてを取得します。つまり Thing.query(Thing.belongs_to == some_thing.key)、結果を繰り返し処理し、表示されているものと、表示されていないが現在のユーザーによって作成されたものを格納します。

  2. 表示されているものを取得するためのクエリ、つまりThing.query(Thing.belongs_to == some_thing.key, Thing.visible == "True")、現在のユーザーが非表示のものを取得するために個別にクエリを実行します。つまり、Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "False", Thing.made_by = current_user)?

番号 1. 他のユーザーによる不可視Thingの s など、多くの不要な結果が得られます。これは、データストアの読み取りが多いと思いますか? 2. 2 つの完全なクエリですが、これも不必要に重い可能性がありますね。私はまだ、データベースとのどのような相互作用がどのような種類のコストを引き起こすのかを解明しようとしています.

関連する場合に備えて、必要に応じてndb、タスクレット、およびmemcacheを使用しています。

4

2 に答える 2

3

2つ目は、2つの理由で経済的に少なくなるでしょう。最初に、データストアの読み取りごと、およびクエリで返されたエンティティごとに料金を支払います。したがって、すべてのデータを読み取り、すべてのデータをクエリする必要がある最初のエンティティに対して、より多くの料金を支払うことになります。必要なものだけを支払う2番目の方法。

次に、バックエンドまたはフロントエンドの時間も支払います。時間を使用して、最初の方法ですべての結果を反復処理します。2番目の方法では時間を費やす必要はありません。

最初のオプションが優れている方法がわかりません。(たぶん、エンティティが少ない場合は??)

読み取りとクエリのコストを理解するには、 https ://developers.google.com/appengine/docs/billingを少し下にスクロールします。

読み取り、書き込み、およびクエリに対して、読み取り、書き込み、およびスモールがどのように加算されるかがわかります。

また、visible=falseやowner=currentではなく、現在のユーザーが所有しているものをクエリするだけです。このようにすると、時間を節約できる複合インデックスは必要ありません。部分インデックスを表示することもできます。これにより、スペースも節約されました(falseを照会する必要がない場合は、trueの場合にのみインデックスを作成してください)。重複を削除するには、ちょっとした作業を行う必要がありますが、それはおそらく悪くはありません。

于 2012-10-01T20:15:33.710 に答える
2

おそらく、実際のデータを使用して両方のケースをベンチマークするのが最善でしょう。全体的なパフォーマンスに影響を与える可能性がある多くの微妙な点があるため、このようなことを抽象的に判断するのは困難です。

ただし、オプション2の方が優れていると思います。気にしない大量のオブジェクトをロードすることは、データストアに大きな負担をかけるだけであり、余分なクエリが匹敵するとは思えません。もちろん、それは余分なものの数などによって異なります.

于 2012-10-01T17:48:49.513 に答える