Взгляните на Создание масштабируемых, сложных приложений на App Engine ( pdf ), захватывающий доклад, сделанный в Google I / O Бреттом Слаткиным Он решает проблему создания масштабируемой службы обмена сообщениями, такой как Twitter.
Вот его решение с использованием свойства списка:
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
class MessageIndex(db.Model):
#parent = a message
receivers = db.StringListProperty()
indexes = MessageIndex.all(keys_only = True).filter('receivers = ', user_id)
keys = [k.parent() for k in indexes)
messages = db.get(keys)
Этот запрос только ключа находит индексы сообщений с получателем, равным указанному вами, без десериализации и сериализации списка получателей. Затем вы используете эти индексы, чтобы захватывать только те сообщения, которые вам нужны.
Вот неправильный способ сделать это:
class Message(db.Model):
sender = db.StringProperty()
receivers = db.StringListProperty()
body = db.TextProperty()
messages = Message.all().filter('receivers =', user_id)
Это неэффективно, поскольку запросы должны распаковывать все результаты, возвращаемые вашим запросом. Таким образом, если вы вернули 100 сообщений с 1000 пользователей в каждом списке получателей, вам придется десериализовать 100 000 (100 x 1000) значений свойств списка. Слишком дорого в задержке хранилища данных и процессоре.
Поначалу я был довольно смущен всем этим, поэтому я написал краткое руководство по использованию свойства list . Наслаждайтесь:)