mongodb - 在引用数据上思考 NoSql

标签 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,一种文档类型的数据存储。我在某处读到数据应该是内联的。像这样的东西:

{
  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 的大部分相关优缺点。

首先请看提议的收藏设计: collection

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

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

我们在学校(一种大师)有一系列要求要完成,然后每个学生都有自己的一系列结果。

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

所以简单地说 - 没有加入日常显示操作=>效率,但更新产生的负载比 sql 多一些。

欢迎任何评论!

关于mongodb - 在引用数据上思考 NoSql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946373/

相关文章:

javascript - 如何将 mongoose 子文档分成单独的文件?

node.js - 更新数组中的多个元素

mongodb - 计算符合给定条件的子文档

javascript - 键名中的 MongoDB 点 (.)

当值太大时 php-handlersocket 结果会被截断

mongodb - loopback mongodb 身份验证失败

c# - Mongo C# JSON 阅读器期待一个值但发现 'replSetGetStatus'

hadoop - hbase.cluster.distributed设置为true但它表示false

azure - 使用 Linq 的 Select 查询 DocumentDB 的属性列表

javascript - 查询MongoDB中不存在的字段