App Engine système de messagerie avec Message d'état - Design Pattern
-
27-10-2019 - |
Question
Je construis un système de messagerie hiérarchique qui sera hébergé sur Google AppEngine
Je l'ai modélisé après la technique décrite par Brett Slatkin dans bâtiment Applications évolutives, complexes sur App Engine
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
class MessageIndex(db.Model):
receivers = db.StringListProperty()
La question que je vais devoir déterminer la façon la plus efficace de suivre l'état de message pour un utilisateur.
Par exemple est un read
de message, archived
, deleted
pour un utilisateur particulier.
Voici la solution que je suis venu avec à ce jour.
J'utilise Datastore + 'de la StructuredProperty pour ajouter un état à le MessageIndex
message
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)
Cette solution, bien que simple, annule le bénéfice du MessageIndex. En outre, depuis le MessageIndex l'est dans le même groupe d'entités comme les écritures datastore de messages sont limités.
Quelle serait la façon la plus efficace d'y arriver? Plût l'ajout d'un groupe d'entités supplémentaires une meilleure solution?
class MessageState(model.Model):
user_key = model.KeyProperty()
message_key = model.KeyPropery()
message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived
La solution
Pour la meilleure interrogation - diviser votre liste « récepteurs » en quatre listes différentes -. « Non lu », « read », « archivé », « supprimé » et shuffle le record du récepteur entre les listes selon le cas