我想为我的应用程序使用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" }
Run Code Online (Sandbox Code Playgroud)
我想把这些水果存放在一个篮子里:
> 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 } ] }
Run Code Online (Sandbox Code Playgroud)
这两种技术之间有什么真正的区别?对我来说,看起来像使用DBRef你只需要插入更多数据而没有任何优势....如果我错了请纠正我.
基本上DBRef是一个自描述ObjectID,客户端帮助程序存在于所有驱动程序中(我认为都是),它在应用程序中提供了轻松获取相关行的能力.
他们不是:
它们也没有在Map Reduce中使用,由于分片的复杂性,功能被取消.
虽然使用它们并不总是很好,但是如果你知道与该行相关的集合与仅存储ObjectID相比,它们占用了相当多的空间.不仅如此,而且由于它们的解析方式,每个相关记录需要逐个延迟加载,如果能够形成一个范围(轻松)一次查询相关行,那么它们可以增加查询量你也会对数据库做出反过来增加游标.
| 归档时间: |
|
| 查看次数: |
4936 次 |
| 最近记录: |