我们假设我有三个班级:User
,Post
,Comment
。标准操作 - 用户可以创建帖子并为这些帖子撰写评论。所以我们的情况如下所示:
我需要非常快速地执行这三个查询:
即使我将使用分区,它看起来也是不可能的。至少没有一个可靠的字典。可能我需要几个不同查询的词典。我是对的吗?
答案 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属性。