Есть ли какой-нибудь умный способ избежать дорогостоящего запроса с предложением 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
, если это поможет упростить задачу.