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