1

我正在使用 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)
4

1 回答 1

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. 尽可能多地嵌入。它提高了读取性能,并允许在对数据库的单个请求中读取数据。是否嵌入的选择通常取决于数据将如何增长、随时间变化以及您将如何查询它。在您的情况下,我们嵌入了 Friends(我认为它不会是很大的集合,因为自由职业者网站不是 facebook :))。我们还将作品集项目和媒体文件嵌入到用户配置文件中,作品集通常不会超过 10 个

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

一些注意事项:

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

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

下一步是什么?浏览mongodb 网站上提供的文档。考虑访问 mongodb 会议或本地 mongodb 小组聚会。

希望有帮助!

于 2013-08-03T06:55:23.607 回答