Google App Engine: класс сообщений, использующий свойства списка для получателей - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть модель сообщения, и я хочу, чтобы в ней было несколько получателей, возможно, их много.Я также хотел бы иметь возможность сообщить каждому получателю, было ли сообщение просмотрено или нет (прочитано / не прочитано).Также я бы хотел, чтобы получатель мог удалить сообщение.

Возможны следующие два решения: для каждой модели сообщений у меня есть модель пользователя.

  • Для первого (используя идеи, представленные здесь http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html)

    У меня есть класс MessageReceivers, у которого есть ListProperty, содержащий пользователей, которые будут получать сообщение и устанавливать родительский элемент для сообщения. Я запрашиваю это с помощью messages = db.GqlQuery('SELECT __key__ FROM MessageReceivers WHERE receivers = :1', user) и do a db.get([ key.parent() for key in messages ]).

    Проблема, с которой я столкнулся, заключается в том, что я не уверен, как сохранить состояние сообщения: читается оно или нет, и возникает ли последующая проблема:У пользователя есть новые сообщения. Дополнительной проблемой могут быть накладные расходы на удаление сообщения (придется удалить пользователя из свойства списка получателей)

  • Для второго: у меня есть MessageReceiver для каждого получателя, на который есть ссылкидля сообщения и для пользователя, а также сохраняет состояние (чтение / непрочитанное).

Какой из этих двух подходов вы считаете, что он имеет лучшую производительностьormance?И в случае первого у вас есть какие-либо предложения по обработке статуса сообщения.

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Я реализовал первый вариант в производстве. Недостатком является то, что ListProperty ограничен 2500 записей, если вы используете пользовательский индекс. Бесстыдная вилка: смотрите мой блог bost http://bravenewmethod.wordpress.com/2011/03/23/developing-on-google-app-engine-for-production/

Читать состояние хранения. Я сделал это, реализовав сущность, которая хранила непрочитанные сообщения несколько месяцев назад, а затем просто предполагала, что старые прочитаны. Еще проще запросить сообщения в порядке дат, сохранить в сущности последнюю известную временную метку сообщения и считать все более старые сообщения прочитанными. Я не рекомендовал хранить длинную историю в сущностях с огромным свойством списка, потому что чтение и хранение таких сущностей может быть очень медленным.

Удаление сообщений стоит дорого, никак не обойтись.

0 голосов
/ 24 ноября 2011

Если вам нужно сохранить состояние для каждого сообщения, лучше всего написать по одному объекту для каждого получателя с состоянием чтения (и всем остальным, например, flags, и т. Д.), А не использовать шаблон отношения индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...