使用MongoDB建模

时间:2013-08-03 04:04:17

标签: mongodb model modeling

我正在使用c#和mongoDB我对使用数据库作为后端的系统有更多的经验,我正在尝试理解和改变我的思维方式,并开始停止思考数据库建模并尝试更多地考虑如何在NoSql中建模。

我将解释一个小型的DB Schema,以及我想知道它是如何转换为mongoDB的。

这是自由网站的一个典型案例:(只是一个非常小的案例,只是为了得到这个想法) 该网站将包含系统中四种不同类型的用户,如销售代表,管理员,用户,公司等,

用户可以使用不同类型的媒体内容发布他们的个人资料,例如图像,网站,文档等,他们可以应用于从公司发布的作业,用户也可以有朋友是用户。

tables:
 -Users
       1to1 -Roles
       1to1 -Candidate       
                       1toM -MediaFile (for the profile)
                                       1to1 -MediaType (file, web, etc)
                       1toM - JobApplications - Mto1 Job (many to many relationship)
       1to1 -Company
                       1toM Jobs
       1toM - Friends (Users)

1 个答案:

答案 0 :(得分:0)

以下是示例mongodb架构:

User
{
   _id: 1,
   Roles : [],
   Candidate: {
      HourlyRate: "0.00",
      Portfolio: [
         {
            Title: "",
            MediaFiles: [
              {
                Type: "File"
              }
            ]
         }
      ]
   },
Company: {
     Id: "1",
     Name: ""
   },
Friends: [
    {
      Id: "1",
      FullName: ""
    }
   ]
}


Company
{
  _id: "1",
  Name: ""
}

Job
{
  _id: "1",
  Title: ""
}

Application
{
  _id: "1",
  JobId: "1",
  UserId: "1",
  ApplicantFullName: ""
}

一些基本规则:

  1. 尽可能多地嵌入。它提高了读取性能,并允许在对数据库的单个请求中读取数据。嵌入与否的选择通常取决于数据如何增长,随时间变化以及如何查询数据。在你的情况下,我们嵌入了朋友(我认为它不会是非常大的集合,因为自由职业者网站不是facebook :))。我们还将投资组合项目和媒体文件嵌入到用户档案中,投资组合通常不会超过10个

  2. 考虑对数据进行反规范化以便快速查询。在我们的例子中,我假设我们需要在自由职业者档案中显示一些朋友,这就是我对FullName进行非规范化的原因。此外,我认为您将始终显示与用户个人资料相关联的公司,这就是我们将ComanyName非规范化为用户的原因。

  3. 一些注意事项:

    1. 非规范化总是会增加写入开销,但会提高读取速度。对于你的情况,我假设读取次数多于写入次数和大量使用的非规范化。

    2. 在读取数据时,请考虑在不需要时从对象中排除字段。例如,当您需要显示自由职业者列表并且不关心朋友时,投资组合 - 排除他们。它将减少需要在db和app之间传输的数据量,并加快反序列化。

    3. 下一步是什么?浏览mongodb网站上提供的documentation。考虑参观mongodb会议或当地的mongodb小组聚会。

      希望有所帮助!