6

次のような場合に、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クラスに新しいフィールドを追加することで作業が簡単になる場合は検討したいと思います。

4

2 に答える 2

5

エレガントな解決策はないと思いますが、これを試すことができます:

User モデルでは、Facebook ID をキー名として使用し、各ユーザーのリストを ListProperty に保存します。

class Thing(db.Model):
  ...

class User(db.Model):
  things = db.ListProperty(db.Key)
  ...

エンティティの作成は次のようになります。

user = User.get_or_insert(my_facebook_id)

thing = Thing()
thing.put()

user.things.append(thing.key())
user.put()

取得には 2 つのクエリが必要です。

friends = User.get_by_key_name(friend_ids)
thing_keys = []

for friend in friends:
  thing_keys.extend(friend.things)

things = db.get(thing_keys)
于 2010-10-18T21:29:24.380 に答える
3

BrettSlatkinによるこのGoogleI/ Oトークでは、あなたが対処している正確な状況について説明します。今年の彼のフォローアップトークもご覧ください。

于 2010-10-19T09:14:23.723 に答える