我正在试用 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,一种文档类型的数据存储。我在某处读到数据应该是内联的。像这样的东西:
{
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
。
应该怎么做?我应该循环我所有的学生并编辑/删除要求吗?或者也许我做错了。
请指教。
最佳答案
这是一个不错的用例。
您的示例提出了有关从 sql 转换为 noSql 的大部分相关优缺点。
我们有两个集合:school
和 student
为什么呢?我们需要考虑 bson 文档大小限制 (16MB),如果我们有一个好的学校,学生数量可能会超过这个大小。
那么为什么我们要在每个学生记录中复制数据呢?如果我们想要学生的详细信息,我们不需要去学校(没有额外的往返)。
我们在学校(一种大师)有一系列要求要完成,然后每个学生都有自己的一系列结果。
添加/删除此类数据需要通过所有学生和学校进行迭代。
所以简单地说 - 没有加入日常显示操作=>效率,但更新产生的负载比 sql 多一些。
欢迎任何评论!
关于mongodb - 在引用数据上思考 NoSql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946373/