2011-11-01 13 views
13

Mam dwie kolekcje:Mongoose: zapełnianie()/DBref lub duplikacja danych?

  1. Użytkownicy
  2. Przesłane


Każdy przesyłanie ma User z nim związane i muszę znać swoje dane, gdy Upload jest oglądany. Czy najlepiej jest duplikować te dane w rekordzie przesyłania, lub użyć populate(), aby pobrać te szczegóły z kolekcji Użytkownicy, do której odnosi się _id?


WARIANT 1

var UploadSchema = new Schema({ 
    _id: { type: Schema.ObjectId }, 
    _user: { type: Schema.ObjectId, ref: 'users'}, 
    title: { type: String }, 
}); 


WARIANT 2

var UploadSchema = new Schema({ 
    _id: { type: Schema.ObjectId }, 
    user: { 
      name: { type: String }, 
      email: { type: String }, 
      avatar: { type: String }, 
      //...etc 
      }, 
    title: { type: String }, 
}); 


Z 'Opcja 2', jeśli jakiekolwiek dane w zmianach zbiórki Users będę miał aby zaktualizować to poprzez al l skojarzone z rekordami Upload. Z "Opcją 1" z drugiej strony mogę po prostu odpocząć i pozwolić populate() zapewnić, że najnowsze dane Użytkownika będą zawsze wyświetlane.

Czy obciążenie związane z używaniem populate() jest znaczące? Jaka jest najlepsza praktyka w tym powszechnym scenariuszu?

Odpowiedz

16

jeśli trzeba zapytać o użytkowników, utrzymanie spokoju użytkowników. Jeśli chcesz przesłać zapytanie o swoje przesłane filmy, zachowaj je sam.

Kolejne pytanie, które należy zadać sobie, to: Za każdym razem, gdy potrzebuję tych danych, czy potrzebuję obiektów osadzonych (i na odwrót)? Ile czasu te dane będą aktualizowane? Ile razy te dane będą czytane?

Pomyśl o prośbie o przyjaźń: Za każdym razem, gdy potrzebujesz tego żądania, potrzebujesz użytkownika, który złożył wniosek, a następnie załóż żądanie w dokumencie użytkownika.

Będzie można również utworzyć indeks na obiekcie osadzonym, a wyszukiwanie będzie jedno zapytanie/szybkie/spójne.


Wystarczy link do mojej poprzedniej odpowiedzi na podobne pytanie: Mongo DB relations between objects

myślę, że ten post będzie dla ciebie http://www.mongodb.org/display/DOCS/Schema+Design

przypadków użycia

Klient/Zamówienie/Zamówienie Element zamówienia

Zamówienia powinny być kolekcją. klienci kolekcję. elementy-linie powinny być tablicą elementów liniowych osadzonych w obiekcie zamówienia.

System blogowania.

Posty powinny być kolekcją. autor postu może być osobną kolekcją lub po prostu pole wewnątrz postów, jeśli tylko adres e-mail. komentarze powinny być osadzonymi obiektami w poście dla wydajności.

Podstawy

Schema konstrukcyjne

Kyle Banker, 10gen

http://www.10gen.com/presentation/mongosf2011/schemabasics

indeksowania & optymalizacja zapytań Alvin Richards, starszy Dir ector Przedsiębiorstwo Inżynierii

http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization

** Te 2 filmy są przeciętność na mongoddb widział imho *

+0

W jaki sposób można zaktualizować zduplikowaną datę? W przykładzie na blogu, jeśli powielasz informacje o użytkownikach (np. Nazwa) w rekordzie komentarza dla szybkich zapytań mono. Jeśli ten użytkownik zmieni nazwę, musimy zaktualizować każde wystąpienie ich nazwy w bazie danych, w tym przypadku w każdym zgłoszonym przez siebie komentarzu. – wilsonpage

+0

musisz zadać sobie pytanie, ile razy zmienisz swoją nazwę użytkownika? być może aktualizacja zbiorcza zrobi w twoim przypadku lub po prostu wskaże ID obiektu do dokumentu użytkownika. Umieszczanie obiektów jest opcją, a nie dojo mongodb. – kilianc

3

Populate() to tylko zapytanie. Więc narzut jest niezależnie od zapytania, które jest find() na twoim modelu. Co więcej, najlepszą praktyką w MongoDB jest osadzenie tego, co możliwe. To spowoduje szybsze zapytanie. Wygląda na to, że będziesz duplikować mnóstwo danych, co umieszcza relacje (łączenie) w dobrym miejscu.

"Łączenie" polega na umieszczeniu obiektu w polu z innego modelu.

Oto Mongo Best Practices http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-SummaryofBestPractices

linkami/DBRefs http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-SimpleDirect%2FManualLinking

+0

Mój schemat jest bardziej skomplikowana niż to, po prostu uproszczone go na ten przykład . Użytkownicy mogą być członkami wielu grup, Przesyłane pliki należą do grupy, a nie do użytkownika. Odpowiedź nie odpowiada na moje pytanie: "Czy obciążenie związane z używaniem funkcji populate() jest znaczące? Jaka jest najlepsza praktyka w tym typowym scenariuszu?" – wilsonpage

+0

Zaktualizowano moją odpowiedź, aby była bardziej trafna. –

Powiązane problemy