我正在尝试使用NoSql,在探索时我无法理解如何处理参考数据。 (我已经习惯了传统的数据库,表格一样)说,我有一个学校实体,有学生和要求。现在,学生可以注册到学校,并可以在以后遵守要求。因此,学校会寻找学生,并检查他遵守哪些要求。
在传统数据库上,我会做类似的事情。
+---------+ +---------------+ +--------------------+ +---------+
| School | | Requirement | | StudentRequirement | | Student |
+---------+ +---------------+ +--------------------+ +---------+
| Id (PK) | | Id (PK) | | Id (PK) | | Id (PK) |
| Name | | Name | | StudentId (FK) | | Name |
+---------+ | SchoolId (FK) | | RequirementId (FK) | +---------+
+---------------+ | HasComply |
+--------------------+
我会创建4个实体,而Requirement
与Student
有多对多的关系。因此,无论是编辑还是删除Requirement
,我都可以查看中间表。
类似的流程:
// EnrollStudentToASchool
// AssignAllRequirementsToNewStudent
然后在我的代码中的某个地方,如果创建了新的需求
// IfNewRequirement
// AddNewRequirementToStudent
现在,在NoSql和我的情况下,我使用的是mongodb,一个doc类型的数据存储。我在某处读到数据应该是内联的。类似的东西:
{
Id: 1,
School: 'Top1 Foo School',
Requirements:
[
{ Id: 1, Name: 'Req1' },
{ Id: 2, Name: 'Req2' }
],
Students:
[
{
Id: 1,
Name: 'Student1',
Requirements:
[
{ Id: 1, Name: 'Req1', HasComply: false },
{ Id: 2, Name: 'Req2', HasComply: true },
]
}
]
},
{
Id: 2,
School: 'Top1 Bar School',
Requirements: [],
Students: []
}
我的文档的根目录是School
,上面是相同的流程:
// EnrollStudentToASchool
// AssignAllRequirementsToNewStudent
// IfNewRequirement
// AddNewRequirementToStudent
但是,如果学校决定修改Requirement
的名称或删除Requirement
。
应该如何做?我应该循环所有学生并编辑/删除要求吗?或者也许我做错了。
请告知。
答案 0 :(得分:1)
这是一个很好的用例。
您的示例提出了有关从sql转换为noSql的大部分相关优缺点。
我们有两个集合:school
和student
为什么?我们需要考虑bson文档大小限制(16MB),如果我们有一个好学校的学生数量可以超过这个大小。
那么为什么我们要在每个学生记录中复制数据?如果我们想要学生的详细信息,我们不需要去学校(没有额外的往返)。
我们有很多要求在学校(一种主人)实现,然后每个学生都有自己的数组与结果。
添加/删除此类数据需要通过所有学生和学校进行迭代。
所以用简单的话来说 - 没有加入日常展示操作=>效率,但更新会产生比sql更多的负载。
欢迎任何评论!