Я создаю систему многопотоковой передачи сообщений, которая будет размещена на 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