0

それぞれ 1 つのクエリを使用して、次の 2 つのページを作成します。

  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 では、スキーマで作成するときに、学生データをコースに埋め込むかリンクするか、コース データを学生に埋め込むかリンクするかを選択できます。

学生データをコース ドキュメントに埋め込むことを選択した場合、特定のコース (1 つのドキュメント) のすべての学生を簡単に取得できます。ただし、特定の学生が受講しているすべてのコースを見つけたい場合は、MongoDB に N 回クエリを実行する必要があります (N は学生が受講しているコースの数です)。

リレーショナル データベースを基盤とする Web アプリケーションでは、ページを読み込むためにデータベースに対して N 回の呼び出しを行うことはできません。一定数のクエリで実行する必要があります。これはMongoDBには当てはまりませんか? 上記の 2 つのページを 1 つのクエリでロードできるようにドキュメントを構成する方法はありますか?

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 のデータ モデリング アプローチはデータ ウェアハウスに似ており、結合の必要性をなくすために一部のデータが非正規化されるか、関連データに埋め込まれます。

データベース参照 (DBRef)の規則を使用した関係のクライアント ドライバーの概念がありますが、ハイドレーティング参照に対するサーバー サポートはなく、追加のクエリが発生します。

複数のクエリが必ずしも悪いわけではありません..しかし、一般的な設計目標は、アプリケーションの一般的なユースケースに基づいて、挿入、更新、および読み取りの速度のバランスを最も効果的に取れるようにデータをモデル化することです。

データ モデリングの詳細については、次を参照してください。

于 2012-09-25T04:04:59.417 に答える