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

时间:2011-02-28 15:57:11

标签: c# mongodb schema document-database nosql

我的模型看起来像:

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撰写的read this文章对于像博客文章这样的内容是有意义的,还有它的评论......

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

评论回复甚至可能有回复,使他们 x 级别深入......? 这是否超出了map reduce类型查询的范围?

修改

“文章”可能是不好的术语 - ArticleType和ArticleId只是将注释绑定到特定“事物”的一种方式 - 例如,如果我们对此问题进行评论,则articleType可以是stackOverflowQuestion,id将是5144273 < / p>

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

希望这更有意义......

2 个答案:

答案 0 :(得分:1)

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

1

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

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

2

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

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

3.我最喜欢的一个;):

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

 public class Article
 {
   ...
   public List<Comment> Comments {get;set;}
 }

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

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

答案 1 :(得分:1)

  

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

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

  

这是否超出了map reduce type query的范围?

没有。 Map函数只是一个javascript方法。它可以调用其他方法,它可以递归地遍历树。

您的型号:

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

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

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