Есть ли какой-нибудь умный способ избежать выполнения дорогостоящего запроса с предложением 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 выполнил бы подзапрос для каждого идентификатора в friend_ids
, вероятно, превысив максимальное количество подзапросов, которое может вызвать любой запрос (30).
Есть ли лучший способ сделать это (то есть свести к минимуму количество запросов)?
Я понимаю, что нет отношений и объединений, использующих хранилище данных, но, в частности, я хотел бы рассмотреть возможность добавления новых полей в класс User
или Thing
, если это поможет упростить задачу.