2013-02-12 8 views
7

Chcę używać Mongo do mojej aplikacji i gdy myślałem o projektowaniu problemów, wpadłem na pytanie, jakie są więc zalety/cele DBRef?

na przykład:

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

i chcę, aby przechowywać te owoce w kolekcji koszyku:

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

Co to prawdziwa różnica pomiędzy tymi dwoma metodami? Dla mnie wygląda na to, że używając DBRef, musisz wstawić więcej danych bez żadnych korzyści .... Proszę mnie poprawić, jeśli się mylę.

Odpowiedz

5

Zasadniczo DBRef jest samopisującym się identyfikatorem obiektu, którego pomocnik po stronie klienta, który istnieje we wszystkich sterownikach (wydaje mi się, że wszystko jest w porządku), zapewnia zdolność aplikacji do łatwego uzyskiwania powiązanych wierszy.

Nie są to:

  • JOIN
  • stosunki kaskadowo
  • stosunki server-side
  • Rozwiązane po stronie serwera

one również nie są wykorzystywane w mapę Zmniejsz The Funkcjonalność została usunięta z powodu komplikacji z odłamywaniem.

Nie zawsze jest dobrze korzystać z nich jednak, ponieważ zajmują one sporo miejsca, jeśli znasz kolekcję, która jest powiązana z tym wierszem w porównaniu do przechowywania tylko ObjectID. Nie tylko to, ale ze względu na to, jak są one rozwiązywane, każdy powiązany rekord musi być leniwy ładowany jeden po drugim, jeśli jest w stanie utworzyć zakres (łatwo) do zapytania do powiązanych wierszy za jednym razem, aby zwiększyć liczbę zapytań do bazy danych również, zwiększając liczbę kursorów.

4

z "MongoDB: The Definitive Guide" DBRefs nie są konieczne i przechowywania MongoID jest bardziej lekkie, ale DBRefs oferują kilka ciekawych funkcji takich jak następuje:

Ładowanie każdy DBRef w dokumencie:

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

Są również pomocne, jeśli odniesienia są przechowywane w różnych kolekcjach i bazach danych, ponieważ DBRef zawiera te informacje. Jeśli używasz MongoID, musisz pamiętać, na którym DB i kolekcji znajduje się MongoID.

W twoim przykładzie tablica przedmiotów w koszyku może zawierać odniesienia w kolekcji owoców, ale także warzywa zbierać. DBRef byłby w tym przypadku przydatny.