Domanda

Sto costruendo un sistema di messaggistica filettata che sarà ospitato su Google AppEngine

L'ho modellato dopo la tecnica descritta da Brett Slatkin Costruire app scalabili e complesse sul motore app

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

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

Il problema che devo determinare il modo più efficiente per tracciare lo stato del messaggio per un utente. Ad esempio è un messaggio read, archived, deleted per un determinato utente.

Ecco la soluzione che ho escogitato finora.

sto usando DataStore+StrutturadProperty per aggiungere uno stato al messaggio 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)

Questa soluzione, sebbene semplice, nega il vantaggio di MessageIndex. Inoltre, poiché il MessageIndex è nello stesso gruppo di entità come le scritte di Message DataStore saranno limitate.

Codice sorgente completo

Quale sarebbe il modo più efficiente per raggiungere questo obiettivo? L'aggiunta di un gruppo di entità aggiuntivo sarebbe una soluzione migliore?

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

Soluzione

Per la query più semplice: dividere l'elenco "ricevitori" in quattro diversi elenchi: "non letto", "leggi", "archiviato", "cancellato" e mescolare il record del ricevitore tra gli elenchi, come appropriato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top