开发者社区> 问答> 正文

mogodb如何进行设计

想知道大家在做非关系型数据库的项目时是如何进行设计的,以学生选课为例,每个学生可以选择多个课程,每个课程可以让多个学生选择,这种多对多关系要如何设计,如果我要删除一个课程,如何保证数据库的一致性?

展开
收起
蛮大人123 2016-06-14 17:58:14 2165 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    MongoDB 考虑两种基本模式:文档和分表。
    文档模式把一条记录记入一个文档,以学生选课为例,就是在一个学生的文档下记录所有他选的课程;分表模式就是像关系型数据库那样,学生和课程分开建表,然后再建一个学生和课程对应关系(选课)的表。
    文档的主要优点是读取效率高,MongoDB 没有joint,如果分表,每次查询涉及几张表就要做几次查询。文档的主要缺点第一就是维护不便,比如你修改了一个课程的信息,就得找到所有包含这个课程的学生文档,然后逐个修改。另外一个文档的大小是有限制的,不能无限增加数据。
    分表的优缺点和文档式相反。
    实践中要权衡选择,以读为主的数据倾向于选择文档模式,写/修改频率高的数据可以考虑分表。另外对于可能无限增加数据的字段,通常也要考虑分表存储。
    一般是二者结合起来用,在文档中记录读取频率较高的信息,其它细节信息单独建表。到你这个例子里,就是学生和课程建两个表,每个学生文档下记录选课的基础信息(比如课程代码和名称),然后每个课程的具体信息存储在课程表里。
    当你每次列出一个学生的选课信息时,一次查询就可以列出所有选课的代码和名称,当需要查看具体一门课程的详细信息时再对课程表做一次查询。这样比完全分表可以减少一次查询,比完全文档记录减少了文档的大小和修改课程信息时要修改的范围。
    如果你要删除一门课,先在课程表里删除这门课的文档,然后在学生表里找到所有包含这门课的记录然后修改之。灵活运用索引和操作符,并不是问题。

    2019-07-17 19:38:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis架构与介质选择指引 立即下载
开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化 立即下载
开源数据库MongoDB专场MongoDB疑难杂症分析及优化 立即下载