假设下面的"模式/关系"设计使用类似级联删除的操作来处理删除,推荐的做法是什么?

关系架构:

  +---------+                                    +--------+
  | Student |-*--------1-[Enrollment]-1--------*-| Course |
  +---------+                                    +--------+

MongoDB:

  +---------+                    +--------+
  | Student |-*----------------*-| Course |
  +---------+                    +--------+

考虑到这种classic 的课程注册设计,在使用MongoDB时,在学生中拥有一个课程集合(反之亦然)似乎是一个合适的数据模型(这对于关系/注册表没有任何意义).但是,来自关系世界的我应该如何处理删除课程的语义呢?也就是说,当一个课程被删除时,所有的"报名"记录也应该被删除.也就是说,我应该从每个学生记录的集合中删除该课程.看起来我必须触发两个查询:一个用于删除课程,然后将其从每个学生的集合中删除.有没有一种方法可以让单个查询执行这种类似语义的"级联删除",而不需要额外的查询?数据模型是否需要更改?

注意:对于所有其他用例,上述数据模型工作正常:

  • 删除学生=>只是删除该学生和与其一起删除的相关课程集合.
  • 愿意放弃某门课程的学生=>只需将其从学生课程集合中删除即可
  • 添加学生/课程=>本质上只需将其添加到相应的‘表’中即可.

唯一棘手的事情是处理课程的删除.我应该如何在MongoDB中处理此场景,因为我来自关系背景,无法弄清楚这一点.

推荐答案

在Mongo,你所做的是最好、最理想的方式.我也遇到了类似的情况,在经历了N:M设计模式的所有可能实现之后,我也找到了同样的解决方案.

显然,这不是mongodb,而是NoSQL的一个概念,在NoSQL中,变化较小的数据(课程)可以单独保存.由于删除一门课程不会是一个非常频繁的操作,所以通过判断所有记录来删除它是可行的.

另一方面,你可以顺其自然. 在您的应用程序逻辑中,只要忽略学员文档中课程文档中根本没有reference_id的课程的值即可.但是在这种情况下,您必须确保删除的旧Course_id没有被重用.

或者只使用课程文档上已删除的标志,并处理应用程序逻辑中的所有其他内容.

Database相关问答推荐

如何自动更新不同的数据库?

什么是 CREATE VIEW IF NOT EXISTS in postgresql

数据库供应商如何实现事务?

SQL Server 2008如何同步不同服务器中的数据库?

我需要在这个 Django 模型中添加一个 db_index 吗?

向表中添加大量索引是否有缺点?

如何决定使用什么 [Sqlite、Realm、CoreData、User-default、JSON 文件] 来存储 iOS 数据?

为什么String or Binary data would be truncated不是更具描述性的错误?

B+ 树相对于 BST 的优势?

Meteor 如何执行数据库迁移?

如何在 MySQL 中强制执行唯一约束?

如何将mysql的默认端口从3306更改为3360

如何从 T-SQL 中的表中 Select 前 N 行?

C++ SQL 数据库库比较

如何处理数据库中用户的身份验证/授权?

如何将sqlite表从磁盘数据库复制到python中的内存数据库?

将文本列设为唯一键

SQL - 如何使用 MS SQL 2008 R2 备份数据库并导出为 MDF 文件

Android SQLite 数据库,为什么要删除表并在升级时重新创建

使用带有联合和 CLOB 字段的 Select 时出现错误 ORA-00932