代码之家  ›  专栏  ›  技术社区  ›  Alex

用C#/ASP.net MVC建模NoSQL论坛应用程序

  •  3
  • Alex  · 技术社区  · 14 年前

    我目前正在开发一个基于论坛(问答)的应用程序。
    使用C#ASP.net MVC和MongoDB进行数据存储。

    我正在看这个模型。
    我在考虑像这样分开上课:(简体)

    public class Question
    {
        public string ID { get; set; }
    
        public string Title { get; set; }
        public string Body { get; set; }
        public List<string> Tags { get; set; }
        public DateTime DateCreated { get; set; }
    
        public string ForumID { get; set; }
    }
    

    回答

    public class Answer
     {
        public string ID { get; set; }
        public string QuestionID { get; set; }
        public string Body { get; set; }
        public DateTime DateCreated { get; set; }
     }
    

    我的问题是:
    如何处理“回复”
    我最好有两个独立的“实体”吗
    或者我应该在我的问题模型中有一个答案列表?

    一些要求是,我需要能够显示一个计数的答案等。。。

    有了这个存储在一个NoSQL db中,我知道我应该去规范化一些东西,但是我怎样才能插入一个答案,而不检索整个帖子呢?在MongoDB中使用NoRM可以实现这种操作吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Gates VP    14 年前

    通常在MongoDB中,您会将答案嵌入问题中。99%的时候你会一个问题一个问题地问,所以你最好同时得到答案。

    一些要求是,我需要能够显示一个计数的答案。。。

    如果你把问题的答案带回来,这真的很容易。您将拥有一个包含答案的数组/列表/集合。所以你只要抓住长度。

    但是我怎么能在不检索整个帖子的情况下插入答案呢

    MongoDB支持原子“$push”操作。这意味着您可以将项添加到数组中,而无需从客户端实际加载文档。从javascript外壳来看,它如下所示:

    db.questions.update( {_id : your_id}, { $push : { answers : your_answer_object } } );

    所以MongoDB能够做到这一点。您必须与规范驱动程序核对,以确保它们确实允许这种类型的行为(如果它们不支持$push,那么它们确实遗漏了一些内容)。

        2
  •  2
  •   John Farrell    14 年前

    答案应该是问题的一部分。

    公共课问题 { 公共字符串ID{get;set;}

        public string Title { get; set; }
        public string Body { get; set; }
        public List<string> Tags { get; set; }
        public DateTime DateCreated { get; set; }
    
        public string ForumID { get; set; }
        public List<Answers> Answers { get; set; }
    }
    

    由于缺少联接文档数据库,因此鼓励您将整个图的实例存储在一个文档中。