これは客観-のAppEngineのGoogleのグループに私の応答からコピーされます。https://groups.google.com/forum/?fromgroups#!topic/objectify-appengine/LlOyRJZRbnk
あなたが記述するもののような「集計データ」を扱うとき三つの主要なオプションがあります。
1)それが必要なときに計算してください
これはあまりにも高価だと私は思っています。
2)バッチ毎にそれを計算し、それが遅延を伴うので
非常に満足しないこの結果を格納します。さらに、毎晩あなたのデータベース全体を調べる必要もありません。
3)データが
このアプローチを変更したときに凝集を更新するには、データ変更もう少し作業を毎回必要とするが、それはほぼ確実にあなたが何をしたいのです。
各ユーザーの連絡先のコレクションを作成します。メッセージが到着したら、その受信者の送信者の連絡先が存在することを確認します。また、受信者が送信者から最後のメッセージを削除したときに連絡先を削除したい場合もあります。
エンティティグループのトランザクションレート制限(1秒あたり1回の書き込み)にぶつからないように注意してください。あなたは、各受信者に連絡先のリストを格納することができ
1):私はいくつかのオプションを順を追ってます
class Person {
@Id Long id;
Set<Key<Person>> contacts;
}
これは個別の問題だろうと言う、受信者が新しい20からメールを受け取った場合など一度にすべての人々。これはほぼ確実に悪い考えです。一方、あなたの連絡先が誰であるかを調べることは驚くほど速くて効率的です。マイナーな改善は、あなたが常にそのデータをロードしないように、人が親に別のエンティティにこれを移動するには、次のようになります。
もちろん
class Contacts {
@Parent Key<Person> owner;
@Id long id = 1; // there's only ever one of these per person, and it should have a predictable key for fetching
Set<Key<Person>> contacts;
}
、単一のエンティティのSetは、あなたに50,000エントリの制限を与えます。最初に1Mエンティティのサイズ制限に達した場合は、これよりわずかに小さいかもしれません。あなたのキーが〜20文字の場合、それはほぼ同じです。これが問題の場合は、複数の連絡先エンティティを許可することができます。その時点で、Brett Slatkinの2009 Google I/OトークのRelation Index Entityパターンのようなものがあります。http://www.youtube.com/watch?v=AgaL6NGpkB8
2)連絡先リストあなたは、単純なGET・バイ・キー、キーのみのクエリをする必要はありません - 他の方向
class Person {
@Id Long id;
@Index Set<Key<Peson>> contactOf;
}
にこれはあなたの連絡先が誰であるかを見つけるために、それは少し高価になります。しかし、エンティティの書き込み速度によって実際に制限されるわけではありません。おそらく1秒間に1つ以上のメッセージを送信する人はいないでしょう.1000件のメッセージを一括して送信すると、contactOfを1回のトランザクションで更新できます。
class Contact {
@Parent Key<Person> person;
@Id Long id;
@Index Key<Person> owner;
}
これは本当にあります。また、完全に別のエンティティにこれらの連絡先を格納することができ
class Contacts {
@Parent Key<Person> person;
@Id long id = 1; // there's only ever one of these per person, and it should have a predictable key for fetching
Set<Key<Person>> of;
}
3):
は、上記のように、あなたはおそらく別のエンティティにこのインデックスを移動したいですソリューション#2の空間効率の低い方法です。
重要なことは、すべてのメッセージの送受信時にこの構造を更新し続けることです。
包括的な回答をいただきありがとうございます。私はgoogle-appengine-groupに関するいくつかのフォローアップの質問をしています。 – spierce7
50,000ではなく5,000の制限で、おそらくタイプミスです。 – gswierczynski