在参考数据

时间:2016-06-21 13:52:21

标签: mongodb nosql

我正在尝试使用NoSql,在探索时我无法理解如何处理参考数据。 (我已经习惯了传统的数据库,表格一样)说,我有一个学校实体,有学生和要求。现在,学生可以注册到学校,并可以在以后遵守要求。因此,学校会寻找学生,并检查他遵守哪些要求。

在传统数据库上,我会做类似的事情。

+---------+  +---------------+ +--------------------+ +---------+
| School  |  | Requirement   | | StudentRequirement | | Student |
+---------+  +---------------+ +--------------------+ +---------+
| Id (PK) |  | Id (PK)       | | Id (PK)            | | Id (PK) |
| Name    |  | Name          | | StudentId (FK)     | | Name    |
+---------+  | SchoolId (FK) | | RequirementId (FK) | +---------+
             +---------------+ | HasComply          |
                               +--------------------+

我会创建4个实体,而RequirementStudent有多对多的关系。因此,无论是编辑还是删除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

应该如何做?我应该循环所有学生并编辑/删除要求吗?或者也许我做错了。

请告知。

1 个答案:

答案 0 :(得分:1)

这是一个很好的用例。

您的示例提出了有关从sql转换为noSql的大部分相关优缺点。

首先请参阅建议的收藏品设计:  collection

我们有两个集合:schoolstudent为什么?我们需要考虑bson文档大小限制(16MB),如果我们有一个好学校的学生数量可以超过这个大小。

那么为什么我们要在每个学生记录中复制数据?如果我们想要学生的详细信息,我们不需要去学校(没有额外的往返)。

我们有很多要求在学校(一种主人)实现,然后每个学生都有自己的数组与结果。

添加/删除此类数据需要通过所有学生和学校进行迭代。

所以用简单的话来说 - 没有加入日常展示操作=>效率,但更新会产生比sql更多的负载。

欢迎任何评论!