Система обмена двигателями приложений со состоянием сообщения - шаблон проектирования

StackOverflow https://stackoverflow.com/questions/6349529

Вопрос

Я строю систему обмена сообщениями, которая будет размещена в Google Appengine

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

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

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

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

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

я использую Datastore+Структурированная Пропертизация добавления состояния в сообщение 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)

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

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

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

class MessageState(model.Model):
  user_key = model.KeyProperty()
  message_key = model.KeyPropery()
  message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top