Pregunta

Estoy construyendo un sistema de mensajería enhebrado que se alojará en Google Appengine

Lo modelé después de la técnica descrita por Brett Slatkin en Construyendo aplicaciones complejas y escalables en el motor de aplicaciones

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

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

El problema que tengo que determinar la forma más eficiente de rastrear el estado del mensaje para un usuario. Por ejemplo es un mensaje read, archived, deleted para un usuario en particular.

Aquí está la solución que se me ocurrió hasta ahora.

Estoy usando DataStore+S StructuredProperty para agregar un estado al mensaje 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)

Esta solución, aunque simple, niega el beneficio del MessageIndex. Además, dado que el MessageIndex está en el mismo grupo de entidad que el Mensaje DataStore será limitado.

Código fuente completo

¿Cuál sería la forma más eficiente de lograr esto? ¿Agregar un grupo de entidad adicional sería una mejor solución?

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

Solución

Para la consulta más fácil, divida su lista de 'receptores' en cuatro listas diferentes: 'no leído', 'leer', 'archivado', 'eliminado' y baraja el registro del receptor entre las listas según corresponda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top