MongoDB中有很多通过一个查询的关系

时间:2012-09-25 03:21:26

标签: ruby-on-rails mongodb activerecord

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

  1. 特定学生的所有课程列表
  2. 特定课程的所有学生名单
  3. 我想用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不是这种情况吗?有没有办法构建我的文档,以便我可以用一个查询加载上面的两个页面?

1 个答案:

答案 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)约定的客户端驱动程序概念,但没有服务器支持来保护引用,这些将导致其他查询。

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

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