想知道大家在做非关系型数据库的项目时是如何进行设计的,以学生选课为例,每个学生可以选择多个课程,每个课程可以让多个学生选择,这种多对多关系要如何设计,如果我要删除一个课程,如何保证数据库的一致性?
MongoDB 考虑两种基本模式:文档和分表。
文档模式把一条记录记入一个文档,以学生选课为例,就是在一个学生的文档下记录所有他选的课程;分表模式就是像关系型数据库那样,学生和课程分开建表,然后再建一个学生和课程对应关系(选课)的表。
文档的主要优点是读取效率高,MongoDB 没有joint,如果分表,每次查询涉及几张表就要做几次查询。文档的主要缺点第一就是维护不便,比如你修改了一个课程的信息,就得找到所有包含这个课程的学生文档,然后逐个修改。另外一个文档的大小是有限制的,不能无限增加数据。
分表的优缺点和文档式相反。
实践中要权衡选择,以读为主的数据倾向于选择文档模式,写/修改频率高的数据可以考虑分表。另外对于可能无限增加数据的字段,通常也要考虑分表存储。
一般是二者结合起来用,在文档中记录读取频率较高的信息,其它细节信息单独建表。到你这个例子里,就是学生和课程建两个表,每个学生文档下记录选课的基础信息(比如课程代码和名称),然后每个课程的具体信息存储在课程表里。
当你每次列出一个学生的选课信息时,一次查询就可以列出所有选课的代码和名称,当需要查看具体一门课程的详细信息时再对课程表做一次查询。这样比完全分表可以减少一次查询,比完全文档记录减少了文档的大小和修改课程信息时要修改的范围。
如果你要删除一门课,先在课程表里删除这门课的文档,然后在学生表里找到所有包含这门课的记录然后修改之。灵活运用索引和操作符,并不是问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。