假设我有三个类:User
、Post
、Comment
。标准操作 - 用户可以创建帖子并对这些帖子发表评论。所以我们有下面描述的情况:
我需要非常快速地执行这三个查询:
- 获取帖子的所有评论
- 获取用户的所有评论
- 获取评论帖子
而且看起来即使我使用分区也是不可能的。至少没有一本可靠的字典。可能我需要几个字典来处理不同的查询。我说得对吗?
最佳答案
我正在做同样的事情!首先:我的架构有点不同。我有一个用户、一个主题和一条评论。主题只是一个带有评论 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/