2013-09-03 9 views
5

私はMongoDBについて学んでいます。多対多や多対1の関係をどのように表現していますか?標準SQLのDBで、それは簡単になります:MongoDBで多対多または多対1の関係を表現する方法は?

Parent Table has fields ID (primary key) and Name. 
Child Table has fields ID (primary key) and Name 
Parent-Child-Relationship Table has fields ID (primary key), ParentID and ChildID 

insert into table Parent (ID, Name) values (1, "Bob"); 
insert into table Child (ID, Name) values (1, "Mahmoud"); 
insert into table Parent-Child-Relationship (ID, ParentID, ChildID) values (1,1,1); 

しかし、私はMongoDBの中でこれを行う方法を考え出したていません。私は何ができる:

db.parent.save({name: "Bob", children: ["Mahmoud"]}); 

しかし、その後どのように私はマフムードのための別の親を(言ってやる「メアリー」)を作成することができるだろうが?

明らかなものがありませんか?助けてください。私はNoSQL技術の完全な新人です。

+0

。両方の親にデータを埋め込むか、単に2つのルックアップを行うことができます。あなたはここでもっと多くの情報を得ることができます:http://docs.mongodb.org/manual/core/data-modeling/ – ranman

答えて

1

短い答えはありませんか?

答え10Genは、親である単一のドキュメントと子を表すサブドキュメントを使用することを意味します。

ただし、Mongoのサブ文書のクエリは限られており、処理速度が遅いため、これを行わないでください。

誰もがやっていることは、親IDを子供に保存し、アプリケーションレベルで複数のクエリ/結合を行うことです。

db.parent.save({name: "Jane", children: ["Mahmoud"]}) 

が、私は、あなたがポイントを逃していると言うでしょう:

+0

サブ文書のクエリが限定されているとは何ですか? – ranman

+0

複数のレベルのサブ文書を照会することはできません。 –

+1

モンゴには参加していません... –

1

何も以下のような別の親を作成するからあなたを停止しません。ドキュメント指向のデータベースで行のようにデータを分割することは、通常は悪い考えです。すべては、アプリケーション・ロジックに依存しますが、あなたは家族のデータを反映したい場合には、そのような構成例のために試すことができます:あなたは、データベースレベルの外に参加し、アプリケーション層でそれらを行う取るほとんどの場合

db.family.insert({mother: {name: "Jane", age: 27}, father: {name: "Bob", age: 29}, children: [{name: "Mahmoud", age: 2}], }) 
+1

概念的には、これはうまくいかないようです。同じオブジェクトBob、Jane、Mahmoudと他のオブジェクト間に関係を保存したい場合はどうなりますか? JaneとMahmoudがシカゴで生まれましたが、Bobは東京で生まれたと言いたいのですが?また、それぞれの都市にそれぞれ関連する情報がたくさんある場合(例:人口、長時間、緯度など)はどうでしょうか。 私はいつもストレートジャケットでテーブルや列のことを常に考えていましたか?私はそれらについて異なって考える必要がありますか? –

+0

IMHOの純粋なリレーショナルモデルは、ドキュメント指向のデータベースが提供できるものよりはるかに普遍的です。 MongoDBのような文書指向のデータベースでのデータモデリングは、アプリケーションに大きく依存します.Jonathan Holland氏の仕事の大部分は、「アプリケーションレベルでの複数のクエリ/結合」で構成されています。間違いなく避けるべきことの1つは、データの正規化です。一般的に、単純なオブジェクトとオブジェクトの関係ではなく、データの階層構造についてもっと考えたいと思っています。 – zero323