7

アプリに mongo を使用したいのですが、問題の設計について考えているときに疑問が生じました。DBRef の利点/目的は何ですか?

例えば:

> names = ['apple', 'banana', 'orange', 'peach', 'pineapple']
[ "apple", "banana", "orange", "peach", "pineapple" ]
> for (i=0; i<5; i++) {
... db.fruits.insert({_id:i, name:names[i]})
... }
> db.fruits.find()
{ "_id" : 0, "name" : "apple" }
{ "_id" : 1, "name" : "banana" }
{ "_id" : 2, "name" : "orange" }
{ "_id" : 3, "name" : "peach" }
{ "_id" : 4, "name" : "pineapple" }

これらの果物をバスケットコレクションに保存したい:

> db.basket.insert({_id:1, items:[ {$ref:'fruits', $id:1}, {$ref:'fruits', $id:3} ] })
> db.basket.insert({_id:2, items:[{fruit_id: 1}, {fruit_id: 3}]})
> db.basket.find()
{ "_id" : 1, "items" : [ DBRef("fruits", 1), DBRef("fruits", 3) ] }
{ "_id" : 2, "items" : [ { "fruit_id" : 1 }, { "fruit_id" : 3 } ] }

これら 2 つの手法の実際の違いは何ですか? 私にとっては、DBRef を使用すると、何の利点もなく、より多くのデータを挿入する必要があるように見えます....間違っている場合は修正してください。

4

2 に答える 2

5

基本的に、DBRef は自己記述型の ObjectID であり、すべてのドライバー (すべてだと思います) に存在するクライアント側のヘルパーが、アプリケーション内で関連する行を簡単に取得する機能を提供します。

ではない:

  • JOIN
  • カスケード可能な関係
  • サーバー側の関係
  • サーバー側で解決済み

それらは Map Reduce 内でも使用されず、シャーディングの複雑さのために機能が取り除かれました。

ただし、これらを使用するのが常に優れているとは限りません。ObjectID を格納するだけでなく、その行に関連するコレクションがわかっている場合は、かなりのスペースが必要です。それだけでなく、それらがどのように解決されるかにより、関連する行をすべて一度にクエリする範囲を (簡単に) 形成できる場合は、関連する各レコードを 1 つずつ遅延ロードする必要があるため、クエリの量を増やすことができます。データベースにも同様に作成し、カーソルを増やします。

于 2013-02-12T08:11:39.307 に答える