次のような場合に、IN 句を使用してコストのかかるクエリを作成しないようにする賢い方法はありますか?
Google App Engine を使用して Facebook アプリケーションを構築していますが、ある時点で (明らかに) データストアにクエリを実行して、特定のユーザーの Facebook の友人のいずれかに属するすべてのエンティティを取得する必要があります。
次のようにモデル化されたエンティティがいくつかあるとします。
class Thing(db.Model):
owner = db.ReferenceProperty(reference_class=User, required=True)
owner_id = db.StringProperty(required=True)
...
と
class User(db.Model):
id = db.StringProperty(required=True)
...
ある時点で、特定のユーザーの友達のリストを取得するために Facebook にクエリを実行し、次のクエリを実行する必要があります。
# get all Thing instances that belong to friends
query = Thing.all()
query.filter('owner_id IN', friend_ids)
私がそれを行った場合、AppEngine は の各 ID に対してサブクエリを実行しfriend_ids
、おそらくクエリが生成できるサブクエリの最大数 (30) を超えます。
これを行うためのより良い方法はありますか (つまり、クエリの数を最小限に抑える)? データストアを使用したリレーションや結合がないことは理解していますが、特に、User
またはThing
クラスに新しいフィールドを追加することで作業が簡単になる場合は検討したいと思います。