我正在使用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)
答案 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: ""
}
一些基本规则:
尽可能多地嵌入。它提高了读取性能,并允许在对数据库的单个请求中读取数据。嵌入与否的选择通常取决于数据如何增长,随时间变化以及如何查询数据。在你的情况下,我们嵌入了朋友(我认为它不会是非常大的集合,因为自由职业者网站不是facebook :))。我们还将投资组合项目和媒体文件嵌入到用户档案中,投资组合通常不会超过10个
考虑对数据进行反规范化以便快速查询。在我们的例子中,我假设我们需要在自由职业者档案中显示一些朋友,这就是我对FullName进行非规范化的原因。此外,我认为您将始终显示与用户个人资料相关联的公司,这就是我们将ComanyName非规范化为用户的原因。
一些注意事项:
非规范化总是会增加写入开销,但会提高读取速度。对于你的情况,我假设读取次数多于写入次数和大量使用的非规范化。
在读取数据时,请考虑在不需要时从对象中排除字段。例如,当您需要显示自由职业者列表并且不关心朋友时,投资组合 - 排除他们。它将减少需要在db和app之间传输的数据量,并加快反序列化。
下一步是什么?浏览mongodb网站上提供的documentation。考虑参观mongodb会议或当地的mongodb小组聚会。
希望有所帮助!