Users-Posts-Comments关于可靠集合的关系实现

时间:2016-08-08 15:53:44

标签: list dictionary data-structures azure-service-fabric

我们假设我有三个班级:UserPostComment。标准操作 - 用户可以创建帖子并为这些帖子撰写评论。所以我们的情况如下所示:enter image description here

我需要非常快速地执行这三个查询:

  • 获取帖子的所有评论
  • 获取用户的所有评论
  • 发表评论

即使我将使用分区,它看起来也是不可能的。至少没有一个可靠的字典。可能我需要几个不同查询的词典。我是对的吗?

1 个答案:

答案 0 :(得分:2)

我正在做同样的事情!首先:我的架构有点不同。我有一个用户,一个主题和一个评论。该主题只是一个带有注释id列表的类(IEnumerable long),仅此而已。第一条评论是帖子。

哦,首先,小小的警告:我刚开始使用Service Fabric,所以我可能做错了;)

用户与我无关。我只是将用户ID存储在评论中。在检索注释列表时,我从有状态用户服务中获取用户。或者我会直接在评论中存储用户名,但还不确定。

因此,我留下了主题和评论。首先,我想'让我们创建一个有状态的TopicService和一个有状态的CommentService'。但后来我意识到,对于我加载的每个主题,我需要为每个注释调用CommentService来获取注释。

所以我创建了一个TopicService来处理2个IReliableDictionaries:主题和评论。

每当发布评论时,我都使用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加载单个注释,则需要提供topicid。所以我的CommentModel类有一个CommentId和一个TopicId属性。