2011-11-23 9 views
0

私はメッセージモデルを持っていますが、複数の受信者が必要な場合があります。 また、メッセージが表示されたかどうか(読み取り/未読)を各受信者に伝えたいと思っています。また、受信者がメッセージを削除できるようにしたいと思います。Google App Engine:受信者のリストプロパティを使用するメッセージクラス

2つの可能な解決策は以下の通りです。私はそれぞれメッセージモデルとユーザーモデルを持っています。 (ここではhttp://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html提示のアイデアを使用して)最初の場合

  • 私がメッセージを受信したメッセージに親を設定するユーザーを含むListPropertyを持ってMessageReceiversクラスを持っています。私はこれをmessages = db.GqlQuery('SELECT __key__ FROM MessageReceivers WHERE receivers = :1', user)と問い合わせてdb.get([ key.parent() for key in messages ])と照会します。

    メッセージの状態を保存する方法がわからないという問題があります。メッセージの状態が読み込まれているかどうか、ユーザーに新しいメッセージがあるかどうかは問題です。追加の問題は、メッセージを削除するオーバーヘッドです(ユーザーを受信者リストのプロパティから削除する必要があります)

  • 2番目の場合:メッセージとユーザーへのリンクを持つMessageReceiverがあり、 (読み取り/未読)。

どちらの方がパフォーマンスが優れていると思われますか?そして最初の場合には、メッセージのステータスを処理するための提案があります。

答えて

1

私は本番環境で最初のオプションを実装しました。欠点は、カスタムインデックスを使用する場合、ListPropertyが2500エントリに制限されていることです。恥知らずのプラグイン:私のブログを参照してください。http://bravenewmethod.wordpress.com/2011/03/23/developing-on-google-app-engine-for-production/

読み取り状態を保存します。私は未読のメッセージを数ヶ月まで保存したエンティティを実装し、古いメッセージを読み込んだと仮定してこれを行いました。さらに簡単なのは、メッセージを日付順に照会し、最後の既知のメッセージ・タイム・スタンプをエンティティーに保管し、すべての古いメッセージを読み取ったものとみなすことです。このようなエンティティの読み込みと格納が本当に遅くなる可能性があるので、巨大なリストプロパティを持つエンティティで長い歴史を保つことはお勧めしません。

メッセージの削除は費用がかかり、回避することもできません。

0

メッセージごとに状態を格納する必要がある場合は、インデックス関係パターンを使用するのではなく、読み取り状態(およびフラグなどのその他のもの)を含む1つのエンティティを1つの受信者ごとに書き込むことをお勧めします。

関連する問題