2

私はいくつかの関連するエンティティを持つGAE上で動作するシステムで作業していますが、データを保存する最良の方法がわかりません。この投稿は、類似の経験を持つ可能性のある他の人からのアドバイスのリクエストです。Google App Engineの非正規化アドバイスを探しています

システムには、プロフィールデータと画像を持つユーザーがいます。これらのユーザーは「イベント」を作成し、ジャーナルエントリを追加することができます。システムの目的上、「イベント」には1つまたは2つのジャーナルエントリがあり、10を超えるものは決して発生しない可能性があります。他のユーザーは、ユーザーのエントリにもコメントを追加することができます。人気のあるユーザーは、数百または数千のコメントを持つことがあります。ランダムな訪問者がシステムを使用すると、最新のイベント(最近のジャーナルエントリを持つ人によって定義された最新のイベント)を表示し、タグで検索し、基本的なテキスト検索を実行できます。次に、表示するイベントを選択すると、すべてのジャーナル・エントリとすべてのユーザー・コメントと、コメントの横にユーザー・イメージが表示されます。ユーザーは、自分のイベントを表示/変更/削除し、他のイベントで行ったコメントを表示/変更/削除するための自己管理ページも用意しておく必要があります。したがって、通常のRDBMS上でこれを行うと、いくつかのテーブルで大きな結合が行われただけでクエリが実行されます。 GAEでは、明らかに異なる方法で作業する必要があります。 - ID、名前、timstamp、タグのリスト プロパティ、ビュー数、 作成者のユーザ名、作成者のプロフィール 画像ID、ジャーナル項目の数

  • イベントエンティティ:ここでは、エンティティの設計上の私の最初の考えがあります それが含まれている、それが含まれている総コメント の数、検索のための含まれている仕訳、索引語のリストプロパティへの最後の更新のタイムスタンプ(組み込み/含まれている仕訳からのテキストから更新)
  • JournalEntryエンティティ - タイムスタンプ、 ジャーナルテキスト、イベント名、 作成者のユーザ名、作成者のプロフィール電子 画像ID、(コメント投稿ユーザ名と 画像IDを含む)、コメント
  • Userエンティティのリストプロパティ - ユーザ名、パスワードのハッシュ、電子メール、サブスクライブされたイベントのリストプロパティ、作成日時、画像ID、投稿されたコメントの数のタイムスタンプ、作成されたイベントの数、作成されたジャーナルエントリの数、最後のジャーナルアクティビティのタイムスタンプ
  • UserCommentエンティティ - ユーザー名、イベントのID、コメントのタイトル、コメントのタイトル
  • TagDataエンティティタグ名、タグ付きイベントの数それらの上に

だから、私は私はここで人々がデザインについて考えていること、そしてそれがうまく拡大するのを助けるために何が変わるべきかを聞いています。ありがとう!プロパティとして

答えて

8
  • よりもむしろ店Event.id、あなたがそれらを作成すると、自動的に各エンティティのkey、またはエンティティにkey namesユニークなセットに組み込まれたIDを使用します。
  • あなたがEventJournalEntryとの関係をモデル化するための多くのオプションを持っている:あなたはEventsに親JournalEntries、あなたはReferencePropertyを使用することができます可能性があり、祖先クエリでそれらを取得、またはあなたがEventJournalEntryキーIDまたは名前のリストを格納することができキークエリで一括して取得します。現実的に分散されたダミーデータを使っていくつかのことを試し、appstatsを使って何が最もうまくいくか見てみましょう。
  • UserCommentEventを参照し、JournalEntryは少し混乱するUserCommentsのリストを参照しています。UserCommentJournalEntryの間には関係がありますか?またはUserCommentEventの間にありますか?
  • 非常に多くのカウントを維持するのは高価です。私はコメントを投稿するときは、新しいUserCommentエンティティを記述し、また私のUserエンティティとJournalEntryエンティティとEventエンティティを更新するつもりです。あなたはEventあたりの期待UserCommentsの数は、連続的にそれらをやるので、あなたがトランザクションこれらの書き込みを行うことができないことを意味同じエンティティグループにすべてのものを含めるように、それは愚かなり、エンティティが異なるネットワークノード間で保存される可能性があります、全体の動作を遅くする。また、一貫性の問題にも対応できます。あなたはこれらのカウントのいくつかなしで行うことができ、他の人をMemcacheに保存することを検討できますか?
  • あなたがデータストアからEventをフェッチすると、実際には検索インデックスの単語のリストを気にし、プロトコル・バッファーからそれらを取得し、デシリアライズすることはコストを持っていません。これを回避するには、Eventの検索インデックスワードをそれぞれ別の子EventIndexエンティティに分割します。検索用語にEventIndexを照会し、検索結果と一致するEventIndexesEventIndexのキーを取り出し、key.parent()の対応するEventsのキーを派生させ、Eventsをキーで取得します。検索索引語の検索または非直列化リスト。 Brett Slatkinはこの戦略についてhereを14:35に説明しています。
  • Eventの多数のビューが連続して多数ある場合は、を試してみると、Event.viewCountが更新されません。

幸運、そしてあなたがものを試してみることで学んだことを教えて。

+0

dfichter、素晴らしいアドバイスありがとう、それはまさに私が得ることを望んでいたものです。 あなたの質問に答えてもらえれば、私はそれらがなくても管理できると確信しています。それでもなお、彼らをあきらめなければならないのはちょっと残念です。あなたはそうだが、単一の操作を完了させるために多くの別々のトランザクションを作成しなければならないことは過度である。私はmemcacheにすべてを載せても大丈夫ですが、いつでも消えてしまうので、本当にそこにいることは期待できません。これは他の人が解決した共通の問題ですか? – user605331

+0

...私はdfichterの回答を「答え」としてマークしていますが、もちろん私のアドバイスを求めても実際の答えはありません。 – user605331

+0

@ user605331確かに、パターンは:値が必要なときにmemcacheでチェックし、そこになければゼロから計算し、キャッシュして使用します。値に影響を与えるデータストアの書き込みを行うときは、memcacheの値を更新してください。ゼロからの計算は高価ですが、うまくいけば頻繁に起こることはありません。それについてのガイダンスがあります。[http://stackoverflow.com/questions/421751/whats-the-best-way-to-count-results-in -gql/4918133#4918133)。 – dfichter

関連する問題