Sistema di messaggistica del motore app con stato del messaggio - modello di progettazione
-
27-10-2019 - |
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.
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
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.