メッセージステータスを備えたアプリエンジンメッセージングシステム - デザインパターン

StackOverflow https://stackoverflow.com/questions/6349529

質問

Google Appengineでホストされるスレッドメッセージングシステムを構築しています

Brett Slatkinが説明したテクニックをモデルにしました アプリエンジンにスケーラブルで複雑なアプリを構築します

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

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

ユーザーのメッセージ状態を追跡する最も効率的な方法を決定しなければならない問題。たとえば、メッセージです read, archived, deleted 特定のユーザーの場合。

これが私がこれまでに思いついた解決策を紹介します。

私は使用しています DataStore+メッセージに状態を追加するための構造化されたプロパティ 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はメッセージDataStoreが書いているメッセージと同じエンティティグループにあるため、制限されます。

完全なソースコード

これを達成するための最も効率的な方法は何ですか?追加のエンティティグループを追加することはより良いソリューションでしょうか?

class MessageState(model.Model):
  user_key = model.KeyProperty()
  message_key = model.KeyPropery()
  message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived
役に立ちましたか?

解決

最も簡単なクエリの場合 - 「受信機」リストを4つの異なるリストに分割します - 「未読」、「読み取り」、「アーカイブ」、「削除」、必要に応じてリスト間で受信者レコードをシャッフルします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top