假设以下"模式/关系"设计,使用级联删除操作删除处理删除的推荐做法是什么?
关系模式:
+---------+ +--------+ | Student |-*--------1-[Enrollment]-1--------*-| Course | +---------+ +--------+
MongoDB的:
+---------+ +--------+ | Student |-*----------------*-| Course | +---------+ +--------+
考虑到学生的课程招生的这一经典设计,具有学生,反之亦然课程集合似乎使用MongoDB的(即没有为关系/报名表)时是合适的数据模型.但是来自关系世界我应该如何处理删除课程的语义?也就是说,当删除课程时,也应删除所有"注册"记录.也就是说,我应该从每个学生记录的集合中删除该课程.看起来我必须触发2个查询:一个用于删除课程,然后从每个学生的集合中删除它.有没有办法让单个查询执行这种"级联删除",如语义而无需额外的查询?数据模型是否需要更改?
注意:对于所有其他用例,上述数据模型工作正常:
删除学生=>
只会删除该学生以及随之删除的相关课程集.
愿意放弃课程=>
的学生只需将其从学生课程集中删除即可
添加学生/课程=>
只是将其添加到相应的"表格"中.
唯一棘手的事情是处理删除课程.我应该如何处理MongoDB中的这种情况,因为我来自关系背景,我无法弄清楚这一点.
你正在做的是在Mongo中做到这一点的最佳和最佳方式.我处于类似的情况,在完成N:M设计模式的所有可能实现后,也达到了同样的解决方案.
显然,这不是一个mongodb的事情,而是更多的NoSQL概念,其中,变化较少的数据(课程)可以单独保存.并且由于删除课程不会是一个非常频繁的操作,它的可行性足以通过所有记录来删除它.
另一方面,你可以让它成为现实.在您的应用程序逻辑中,只需忽略Student文档中课程文档中根本没有reference_id的课程值.但在这种情况下,您必须确保旧的已删除的Course_id不会被重用.
或者只使用课程文档中的已删除标志,并处理应用程序逻辑中的所有其他内容.