2012-02-23 19 views
19

MongoDBでDBREF datatypeを使用すると、ドキュメントは次のようになることがあります。しかし、すべての行が明らかにusersコレクションを指しているので、すべての行に$refフィールドを持つことは冗長です。MongoDB - DBREFは必要ですか?

多少の冗長性を持たずに他のドキュメントを参照する方法はありますか$ref -field?

{ 
    $id: {$oid : "4f4603820e25f4c515000001"}, 
    title: "User group", 
    users: [ 
     {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true } 
    ] 
], 
+4

単純なダイレクト/手動リンクを使用しない理由は何ですか?(下記のようにObjectIdを置くだけです) –

答えて

31

少なくとも、スケーラビリティを必要とする大きなシステムで作業する場合は、mongodbを使って作業するときは、Dbrefを避けるべきです。

私はすべてのドライバがDBRefを読み込むための追加要求をしていることを知っているので、データベース内で 'join'ではありません。非常に高価です。

多分冗長な$ ref-fieldを持たないで他のドキュメントを参照する方法はありますか?

はい、「 外部キー」(RefUserIdあるいは単にユーザーIDのようなもの)のための命名規則を作成して、心の中で参照を保持し、参照先文書のちょうどIDを格納します。必要に応じて参照先のドキュメントをロードします。また、通常はパフォーマンスを大幅に向上させるため、埋め込みを行うことができます。 docsから

+3

DBRefまたは_idだけではなく、リンクセマンティクスでそれらを解決する方法は実際には問題ではありません。複数のコレクションに対して非同格の参照がある場合は、コレクションと_id == DBRefの両方が必要になります。 –

+1

Scottを少し繰り返すだけです。同じコレクション内のオブジェクトを参照している場合は、ObjectIdフィールド –

+0

を使用して将来の更新がより高価になりますか?コレクション全体を更新する必要はありません。 –

6

あなたがdbrefにアクセスするためのドライバ固有のメソッドを使用していない限り、それが不要でなければなりません。

手動で結合を管理している場合(つまり、他のどの結合が「結合」されているかを知っている場合)、ObjectIdだけを格納すれば十分です。

2

Manual references

代替であり、the docs sayマニュアルの参照はDBREFS(though I'm not sure why)に好適です。 DBREFは、参照オブジェクトが別のデータベースに存在する場合、またはコレクション名が明白でない場合に役立ちます。

非正規化/埋め込みは、アトミックな更新を取得し、関連するデータを再クエリする必要がないため、あらゆる種類のリンクよりも好ましいです。

関連する問題