2017-09-25 1 views
0

私は、1対N関係での双方向参照に関する仕事で議論しています。 According to this post in MongoDB blog、あなたはそれを行うことができます。原子的な更新は全く必要ないので、問題はありません。この記事の例に従えば、私たちの場合、タスクの作成または削除はできますが、タスク所有者の変更はできません。Mongoでは、1対Nの関係で双方向参照が効率的ですか?

私の議論では、双方向の参照は、プログラムのさまざまな部分で、タスクを頻繁に、頻繁にタスクを少なく表示する必要があるため、両側からデータを取得する方が効率的です。私の同僚は、効率の向上はなく、データの重複はそれに値するものではないと言います。

このアプローチの効率性に関する情報はありますか?

答えて

0

データを正規化して保存することで、書き込み量と読み込み量が少なくなった場合に役立ちます。ここでの効率は、データの検索方法によって異なります。コレクションからのデータの取得に双方向参照が必要な場合は、すでにそれがある場合は、確かにクエリの効率が向上します。

学生コレクション

{ _id:1, name: "Joseph", courses:[1, 3, 4]} 
{ _id:2, name: "Mary", courses:[1, 3]} 
{ _id:3, name: "Catherine", courses:[1, 2, 4]} 
{ _id:4, name: "Robert", courses:[2, 4]} 

コースコレクション

{ _id:1, name: "Math101", students: [1, 2, 3]} 
{ _id:2, name: "Science101", students: [3, 4]} 
{ _id:3, name: "History101", students: [1, 2]} 
{ _id:4, name: "Astronomy101", students: [1, 3, 4]} 

ここでは2つの方法の参照が行われ、学生のコレクションのコース配列が私たちを与え、学生とコースの上記の例を考えてみましょう学生が学んださまざまなコース。同様に、コースコレクションのStudents配列は、それぞれのコースを勉強している学生を私たちに与えます。

我々は、クエリが

db.courses.aggregate([{$match: {name:"Math101"}}, 
    {$unwind:"$students"}, 
    {$lookup:{from:"students", 
      localField:"students", 
      foreignField:"_id", 
      as:"result"}}]) 

$match$unwindだろうMath101を研究していた学生の一覧を表示したい場合は、アグリゲーションパイプラインの$lookupは、結果を達成するために使用されています。データを減らすための$ match(集約パイプラインの最初にこの演算子を使用するとよい)、Coursesコレクションのstudents配列を巻き戻す$ unwind、Studentsコレクションを調べて学生の詳細を取得する$

私たちのサンプルのコレクションで上記の集計クエリを実行した後の結果は、したがって密接にあなたの期待される結果と整合し、あなたのスキーマを設計し、

{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 1, 
     "result" : [ 
       { 
         "_id" : 1, 
         "name" : "Joseph", 
         "courses" : [ 
           1, 
           3, 
           4 
         ] 
       } 
     ] 
} 
{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 2, 
     "result" : [ 
       { 
         "_id" : 2, 
         "name" : "Mary", 
         "courses" : [ 
           1, 
           3 
         ] 
       } 
     ] 
} 
{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 3, 
     "result" : [ 
       { 
         "_id" : 3, 
         "name" : "Catherine", 
         "courses" : [ 
           1, 
           2, 
           4 
         ] 
       } 
     ] 
} 

我々が取得した内容に基づいて、純粋に参照する双方向の効率です。

関連する問題