请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于多对多关系

老师您好!
通过前面学习,还有许多疑问,因为mongodb不像mysql这样的关系型数据库,从而设计方面肯定不能按照mysql的设计思想去走!
那么像一些多对多场景应该怎么设计?
例如:一个班级有多个老师,一个老师可以教多个班级!这样的关系,应该怎么设计文档?

正在回答

1回答

同学你好~这个问题非常优秀~

你自己也说了不能使用关系型数据库的数据模型设计思想去走,这非常正确。那么关系型数据库的设计思想是什么呢?简单来说,是以数据为中心,分析数据间的关系,然后用数据库表把这些关系清晰的表达出来。一旦数据库表的模式确定了,每个客户端请求都要根据数据库模式来制定查询语句。

然而,在使用MongoDB这样的NoSql数据库时,通常不以数据为中心,而是以【划重点】数据的使用模式【划重点】为中心。所以,我问的第一个问题并不是“一个老师可以教一个班级还是多个班级”这种关乎数据间关系的问题,老师和班级之间的关系甚至可以随着时间改变。我会问的第一个问题应该是“客户端请求将如何操作这些数据”。假设你的客户端是一个web服务。它有哪些服务端点呢?举个例子,如果最大流量的请求会通过一个端点来查询老师和他/她教授的所有班级的信息,那么将班级信息内嵌入教师文档就是一个比较好的选择,因为只需要一次查询就可以得到客户所需的所有信息,查询效率最高。当然在实际应用中,你要考虑的因素更多:客户的读写频率,数据的数量,对延迟性的敏感度,数据维护的成本,等等。但是,总而言之,一切设计和选择都是从数据的使用(而不是数据间的关系)为核心的。

这个问题之所以优秀,就是因为它没有标准答案,因为最了解你的数据使用模式的人,一定是你自己~不过,NoSql数据库中的数据模型设计也是有一定的方法和技巧的,在课程的第七章中,我们就会专门为大家讲解这个课题,近期内就会开放这部分内容了,敬请期待!

1 回复 有任何疑惑可以回复我~
  • 提问者 骑着面包去草原 #1
    首先,我不说问题解决没解决!
    我只看您的回答文字,已经知道您是一位很耐心,细心且不厌其烦的一位好老师!在这里我先代表所有已经看过您教程的同学对您说一句辛苦了!
    接下来,我仔细的看了一下您的答复!
    发现我第一次问您问题的时候,还是没有抛开关系型数据库的思想,虽然我已经知道两种数据库之间不能按照一个思想走.但是还是把问题问到了关系型上!
    但经过这几天空闲时间,按照问题进行了实验,不知道这样设计是否正确,请您查阅:
    首先,我将老师和班级分成两个文档.
    考虑到如果是内嵌的话,假如再来一个学生文档,我要查询学生所在班级,那么内嵌就不合适了!因为如果班级名称或班级文档的数据发生变化,那么我需要修改另一个文档的数据,这样维护起来很麻烦!当然,内嵌是效率最高的一种!
    那么第二种设计就产生了:
    我把老师文档,学生文档,同时都引入了一个字段,叫做班级IDS,代表着这个字段装的都是这个老师或者这个学生所有的班级ID!
    之后通过先前所学的聚合,从管道中筛选,$match,$lookup之后再从管道中获取我所需要的数据!
    很好,这次实验室成功的! 但是,难免会有效率问题,例如索引,事务,这些!
    因此考虑到这些个问题,疑问再一次产生!
    例如这种班级,老师的设计,会有一些关系的文档.我们应该怎样去维护比较合适!
    回复 有任何疑惑可以回复我~ 2019-03-30 20:53:17
  • 同问,我oracle和mysql用太多了,总是很介怀这个事情,很迷惑。
    回复 有任何疑惑可以回复我~ 2020-02-10 19:49:00
  • 应该先抛开传统关系型数据库的思想!换一个新的方式学习更有效
    回复 有任何疑惑可以回复我~ 2020-03-07 19:12:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信