Система обмена сообщениями App Engine со статусом сообщения - шаблон проектирования - PullRequest
2 голосов
/ 15 июня 2011

Я создаю систему многопотоковой передачи сообщений, которая будет размещена на Google AppEngine

Я смоделировал ее по методике, описанной Бреттом Слаткиным в Создание масштабируемых, сложных приложений на App Engine

class Message(db.Model):
  sender = db.StringProperty()
  body = db.TextProperty()

class MessageIndex(db.Model):
  receivers = db.StringListProperty()

Проблема в том, что мне нужно определить наиболее эффективный способ отслеживания состояния сообщения для пользователя.Например, это сообщение read, archived, deleted для конкретного пользователя.

Вот решение, которое я нашел до сих пор.

Я использую Datastore + StructuredProperty для добавления состояния к сообщению MessageIndex

class Message(model.Model):
  sender = model.StringProperty()
  body = model.TextProperty()

class _DisplayState(model.Model):
  user_key = model.KeyProperty()
  state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

class MessageIndex(model.Model):
  receivers = model.StructuredProperty(_DisplayState, repeated=True)

Это решение, хотя и простое, сводит на нет преимущества MessageIndex.Кроме того, так как MessageIndex находится в той же группе объектов, что и записи в хранилище данных сообщений, будет ограничено.

Полный исходный код

Какой самый эффективный способ выполнитьэтот?Было бы лучше добавить дополнительную группу объектов?

class MessageState(model.Model):
  user_key = model.KeyProperty()
  message_key = model.KeyPropery()
  message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

1 Ответ

2 голосов
/ 15 июня 2011

Для самых простых запросов - разбейте список «получателей» на четыре разных списка - «непрочитанные», «прочитанные», «архивные», «удаленные» и перетасуйте запись получателя между списками, в зависимости от ситуации.

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