我想创建以下两个页面,每个页面使用一个查询:
我想用MongoDB(或其他NoSQL解决方案)重新创建以下内容
class Student < ActiveRecord::Base
has_many :assignments
has_many :courses, :through=>:assignments
end
class Course < ActiveRecord::Base
has_many :assignments
has_many :students, :through=>:assignments
end
class Assignment < ActiveRecord::Base
belongs_to :course
belongs_to :student
使用关系数据库,我可以通过加载关联来实现这一目标。
然而,在Mongo中,当我按照模式创建时,我可以选择在课程中嵌入或链接学生数据,或者在学生中嵌入或链接课程数据。
如果我选择将学生数据嵌入课程文档中,我可以轻松地将所有学生拉到特定课程(一个文档)。但是,如果我想查找特定学生正在学习的所有课程,我将不得不查询MongoDB N次(其中N是学生正在学习的课程数量)!
在由关系数据库支持的Web应用程序中,不能选择对数据库进行N次调用以加载页面。它需要在恒定数量的查询中完成。 MongoDB不是这种情况吗?有没有办法构建我的文档,以便我可以用一个查询加载上面的两个页面?
答案 0 :(得分:0)
If I chose to embed the student data in the course document, I
can easily pull all students for a particular course (one document).
However, if I want to find all courses a particular student is taking,
I will have to query MongoDB N times (where N is the number of courses
a student is taking)!
如果您将信息高度标准化,那就是正确的。但是,还有其他可能性,例如在学生记录中维护当前课程ID的数组,而不是依赖于关系查询。
In a web application backed by a relational database, making N calls
to the database to load a page isn't an option. It needs to be done
in a constant number of queries. Is this not the case with MongoDB?
Is there a way to structure my documents such that I can load the two
pages above with ONE query?
MongoDB不是关系数据库,故意不支持连接。 MongoDB数据建模方法更类似于数据仓库,其中一些数据被非规范化或嵌入相关数据中以消除对连接的需要。
使用Database References (DBRefs)约定的客户端驱动程序概念,但没有服务器支持来保护引用,这些将导致其他查询。
多个查询不一定错误 ..但一般的设计目标是根据应用程序的常见用例对数据进行建模,以最有效地平衡插入,更新和读取的速度。
有关数据建模的更多信息,请参阅: