2013-02-12 13 views
7

Voglio usare mongo per la mia app, e mentre stavo pensando di progettare i problemi, mi è venuta una domanda, quindi quali sono i vantaggi/gli scopi di DBRef?

ad esempio:

> 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" } 

e voglio conservare quei frutti di una raccolta cestino:

> 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 } ] } 

Quali sono la vera differenza tra queste due tecniche? Per me sembra che usare DBRef sia sufficiente inserire più dati senza alcun vantaggio .... Per favore correggimi se sbaglio.

risposta

5

Fondamentalmente un DBRef è un ObjectID auto-descrittivo che un helper lato client, che esiste in tutti i driver (credo tutti), fornisce l'abilità all'interno dell'applicazione per ottenere facilmente le righe correlate.

Essi non sono:

  • JOINs
  • relazioni in cascata
  • rapporti lato server
  • Risolto lato server

Essi inoltre non sono utilizzati entro Mappa Ridurre, il la funzionalità è stata rimossa a causa di complicazioni con sharding.

Tuttavia, non è sempre consigliabile utilizzarli, in quanto occupano un po 'di spazio se si conosce la raccolta correlata a quella riga rispetto all'archiviazione dell'oggetto ID. Non solo, ma a causa di come vengono risolti, ogni record correlato deve essere pigro caricato uno ad uno se invece è in grado di formare un intervallo (facilmente) per eseguire query per le righe correlate tutto in una volta, in modo che possano aumentare la quantità di query fai anche il database, aumentando a sua volta i cursori.

4

Da "MongoDB: The Definitive Guide" DBRefs non sono necessari e la memorizzazione di un MongoID è più leggero, ma DBRefs offrono alcune funzionalità interessanti come la seguente:

Caricamento ogni DBRef in un documento:

var note = db.notes.findOne({"_id":20}); 
note.references.forEach(function(ref) { 
    printjson(db[ref.$ref].findOne({"_id": ref.$id})); 
}); 

Sono anche utili se i riferimenti vengono archiviati in raccolte e database diversi poiché il DBRef contiene tali informazioni. Se si utilizza un MongoID, è necessario ricordare a quale DB e collezione si riferisce il MongoID.

Nel tuo esempio, l'array di elementi di un documento nel carrello potrebbe contenere riferimenti nella raccolta di frutti, ma anche le verdure raccolte. Un DBRef sarebbe effettivamente utile in questo caso.

Problemi correlati