0

我想创建以下两个页面,每个页面使用一个查询:

  1. 特定学生的所有课程列表
  2. 特定课程的所有学生列表

我想用 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不是这种情况吗?有没有办法构建我的文档,以便我可以使用一个查询加载上面的两个页面?

4

1 回答 1

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 数据建模方法更类似于数据仓库,其中一些数据被非规范化或嵌入到相关数据中以消除对连接的需要。

有一个使用数据库引用 (DBRefs)约定的关系的客户端驱动程序概念,但没有服务器支持水合引用,这将导致额外的查询。

多个查询不一定是坏事……但总体设计目标是根据应用程序的常见用例对数据进行建模,以最有效地平衡插入、更新和读取的速度。

有关数据建模的更多信息,请参阅:

于 2012-09-25T04:04:59.417 回答