list - 可靠集合上的用户-帖子-评论关系实现

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

假设我有三个类:UserPostComment。标准操作 - 用户可以创建帖子并对这些帖子发表评论。所以我们有下面描述的情况:enter image description here

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

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

而且看起来即使我使用分区也是不可能的。至少没有一本可靠的字典。可能我需要几个字典来处理不同的查询。我说得对吗?

最佳答案

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

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

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

所以这给我留下了话题和评论。首先我想“让我们创建一个有状态的 TopicService 和一个有状态的 CommentService”。但后来我意识到,对于我加载的每个主题,我需要为每个评论调用 CommentService 来获取评论。

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

每当发布评论时,我都会使用 TopicId 作为分区键,并在该分区中存储评论。所以不要使用commentid!这样,特定主题的所有评论都位于同一分区中。

当加载包含所有评论的主题时,我再次使用 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;

我还没有完成,该方法还需要一些工作。

也许这对你有帮助:)

编辑:哦,有一个缺点!当您想通过 id 加载单个评论时,您需要提供 topicid。所以我的 CommentModel 类有一个 CommentId 和一个 TopicId 属性。

关于list - 可靠集合上的用户-帖子-评论关系实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833625/

相关文章:

python - 将前导零添加到 Python 中的数字列表

regex - 使用 perl 加入、拆分和映射以创建新属性

java - 使用 XOR 方法查找数组中缺失和重复的元素

java - 浏览许多列表/深度嵌套数据的有效方法

python - 在 Python 中创建包含列表列表的字典

list - 返回普通lisp中没有最后一个元素的列表

c# - 如何从 C# 中的列表列表中获取不同的元素

java - 节点无法转换为 java.util.Map。 A开始实现

python-3.x - 使用其中的值列表创建单独的字典

c# - 多键字典,其中只需要 1 个键来检索对象