Система обмена двигателями приложений со состоянием сообщения - шаблон проектирования
-
27-10-2019 - |
Вопрос
Я строю систему обмена сообщениями, которая будет размещена в 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
Решение
Для самых простых запросов - разделите свой список «приемников» на четыре различных списка - «непрочитан», «читать», «архивировано», «удалено» и перетасовывайте запись приемника между списками в зависимости от необходимости.