用于评论的MongoDB文档设计(及其回复评论)

我的模型看起来像:

class Comment { public string ID { get; set; } public string ArticleType { get; set; } public string ArticleID { get; set; } public string Body { get; set; } public DateTime DateCreated { get; set; } public string UserID { get; set; } } 

我正在创建一个应用程序来存储关于我们应用程序中其他内容的评论例如,如果评论是关于产品的,那么ArticleType可以是“product”而ArticleID将是产品ID …

我将使用mongodb来存储这些数据

我希望能够回复评论,并按层次结构存储响应我是否应该在评论文档中存储列表?

我读过 Rob Ashton撰写的这篇文章,对于像博客文章这样的事情是有意义的,它的评论……

但是,在我的模型中,“回复评论”直接引用父评论。

评论回复甚至可能有回复,使他们x级别深…? 这会超出map reduce类型查询的范围吗?

编辑:

“文章”可能是不好的术语 – ArticleType和ArticleId只是将注释绑定到特定“事物”的一种方式 – 例如,如果我们在评论这个问题时,articleType可能是stackOverflowQuestion,id将是5144273

如果我们评论ebay拍卖,我们可以将articleType作为ebay,将articleId作为1234902493984(项目编号)

希望这更有意义……

我看到三个可行的解决方案(这只是我的意见):

1。

 public class Comment { ... public List ChildComments {get;set;} } 

优点:您可以轻松加载,显示分层数据。 你不知道评论的父评论。
缺点:您无法使用某个ID查询和更新评论。

2。

 public class Comment { ... public string ParentCommentId {get;set;} } 

优点:您可以根据需要查询/更新。
缺点:当您需要加载层次结构时,需要大量的mongo请求。

我最喜欢的一个;):

  public class Comment { ... public string ParentCommentId {get;set;} } public class Article { ... public List Comments {get;set;} } 

优点:您可以根据需要查询/更新。 您可以在一个请求中加载包含所有注释的文章。 无需存储redunti ArticleType和ArticleId
缺点:需要在内存中加载文章和构建层次结构。

希望这有助于您做出选择..

评论回复甚至可能有回复,使他们x级别深…?

因此,如果您想对此进行建模,那么执行此操作的简单方法是为每个注释提供一个Comments属性列表。 这为您提供了适合数据的自然层次结构。

这会超出map reduce类型查询的范围吗?

不。地图function只是一种javascript方法。 它可以调用其他方法,它可以递归地遍历树。

你的型号:

让我担心你提出的模型的一件事是你有一个ID,一个ArticleID和一个ArticleType? 你究竟打算如何访问这个对象? 你在计划什么类型的指数?

评论信息是否会在文章范围之外被访问? 你打算用“文章”加载评论吗? 在文章本身内部存储List是否有意义?

您可以通过多种方式对此数据进行建模。 所以它真的取决于你想要的东西。 您无法针对每个可能的查询进行优化。 如果您可以告诉我们您希望快速制作哪些查询和用例,那么提供有关数据建模的建议会更容易。