2016-08-08 8 views
2

私は3つのクラスがあるとしましょう:UserPostCommentです。標準のアクション - ユーザーは投稿を作成し、これらの投稿にコメントを書くことができます。私は非常に迅速にこれら三つのクエリを実行する必要がenter image description here信頼できるコレクションのユーザー - 投稿 - コメントの関係の実装

:だから我々は、以下に示すような状況持っ

  • をポスト
  • ためのすべてのコメントをするためのユーザー
  • ゲットポストのためのすべてのコメントをゲットコメント

私はパーティショニングを使用しても不可能なようです。少なくとも1つの信頼性の高い辞書ではありません。おそらく私は別のクエリのためにいくつかの辞書が必要です。私は正しいですか?

答えて

2

私は同じことに取り組んでいます!まず第一に、私のスキーマは少し異なります。私はユーザー、トピック、およびコメントを持っています。トピックは、コメントID(IEnumerable long)のリストを持つ単なるクラスです。最初のコメントは投稿です。

ああ、本当に最初にすべての、少し警告:私はちょうどサービスファブリックを始めているので、私はそれが間違っている可能性があります;)

ユーザーは私には関係ありません。私はちょうどコメントにユーザーIDを格納します。コメントのリストを取得するとき、私はステートフルなユーザーサービスからユーザーを取得します。または、私はコメントに直接ユーザー名を格納しますが、まだわかりません。

トピックやコメントが残っています。まず、「ステートフルトピックサービスとステートフルコメントサービスを作成できる」と考えました。しかし、私は私がロードするトピックごとに、コメントを得るために、コメントごとにCommentServiceを呼び出す必要があることに気付きました。

私はトピックとコメントの2つのIReliableDictionariesを扱うTopicServiceを作成しました。

コメントが投稿されるたびにTopicIdをパーティションキーとして使用し、そのパーティションにコメントが保存されます。コメント欄を使用しないでください!この方法では、特定のトピックのコメントはすべて同じパーティションにあります。

すべてのコメントをトピックにロードするときに、TopicIdを再度パーティションキーとして使用します。トピックの信頼辞書からトピックを取得し、コメントの信頼辞書内のコメントIDのリストをループします。わからないことはできますが、私のGetCommentsは次のように見える場合:私はまだいないよ

 var topics = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, TopicModel>>("topics"); 
     var comments = await this.StateManager.GetOrAddAsync<IReliableDictionary<long, CommentModel>>("comments"); 

     List<CommentModel> result = new List<CommentModel>(); 

     using (var tx = this.StateManager.CreateTransaction()) 
     { 
      ConditionalValue<TopicModel> topic = await topics.TryGetValueAsync(tx, topicid); 

      if(topic.HasValue) 
      { 
       foreach(long commentid in topic.Value.CommentsInternal) 
       { 
        ConditionalValue<CommentModel> comment = await comments.TryGetValueAsync(tx, commentid); 

        if (comment.HasValue) 
         result.Add(comment.Value); 
       } 
      } 

      await tx.CommitAsync(); 
     } 

     return result; 

、方法いくつかのより多くの仕事を。

おそらくこれはあなたが

編集:)助け:OW、デメリットがあるの! idで1つのコメントをロードする場合は、topicidを指定する必要があります。だから私のCommentModelクラスはCommentIdとTopicIdプロパティを持っています。

+0

答えをありがとう。私はパーティショニングについて考えていましたが、私には少し複雑なように思えましたが、私は単純な解決策を探し続けました。 特定のユーザーのすべてのコメントをどのように取得しますか? 信頼できるコレクションに変更がないので、なぜ 'CommitAsync'を呼び出しますか? 信頼できる辞書内のリストにコメントを保存していますか?もしそうなら、スレッドセーフではないので、避けてください。 – cassandrad

+0

パーティショニングはそれほど難しくありません。ノード上のデータのグループ化に関するすべて。サービスファブリックはそのために最も効果的です。また、コメント数にも依存します。その数千の場合は、パーティションを気にしないでください。 hunderdの場合は、数千...パーティション!特定のユーザーに対するすべてのコメントは、Azure Searchで行うことも、別々のインデックスを保持することもできます。私はうさぎとしてコミットする。私はトランザクションを持っているので、コミットして終了します。リスト内のコメントはい、私はデータを編集するためにActor(永続性なし)を使用します。アクターはシングルスレッドで動作しています。 Write = Actor、Read =ステートフルサービス。 – Martin

+0

したがって、コメントを保存するトピックごとに1人のアクタ、またはサービスに格納され、データの編集だけを行い、アクタからサービスのメソッドを呼び出しますか?トピックに新しいコメントを同時に追加/削除できるユーザーはいくつですか? – cassandrad

関連する問題