MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come gestire le relazioni durante l'utilizzo di mongodb

MODIFICA:

Ho appena trovato una risposta di Brendan McAdams, ragazzo di 10gen, che ovviamente è molto autorevole di me, e consiglia di incorporare i documenti.

testo precedente:

Il primo consiste nell'includere manualmente in ogni commento ObjectID dell'utente a cui appartengono.

comment: { text : "...", 
           date: "...", 
           user: ObjectId("4b866f08234ae01d21d89604"),
           votes: 7 }

Il secondo modo intelligente è quello di usare DBRefs

aggiungiamo I/O extra al nostro disco, perdendo le prestazioni, giusto? (non sono sicuro di come funzioni internamente) quindi dobbiamo evitare di creare collegamenti, se possibile, giusto?

Sì - ci sarebbe un'altra domanda, ma il driver lo farà per te - puoi pensare a questo come a una specie di zucchero sintattico. Influisce sulle prestazioni? In realtà, dipende anche :) Uno dei motivi per cui Mongo è così veloce è che sta usando file mappati in memoria e mongo fa del suo meglio per mantenere tutto il working set (più gli indici) direttamente nella RAM. E ogni 60 secondi (per impostazione predefinita) sincronizza l'istantanea della RAM con il file basato su disco.
Quando dico set di lavoro , intendo le cose con cui stai lavorando:puoi avere tre raccolte - foo , barra , Bz , ma se stai lavorando ora solo con foo e bar, dovrebbero essere caricati in ram, mentre baz rimane sul disco abbandonato. Inoltre i file mappati in memoria consentono di caricare solo una parte della raccolta. Quindi, se stai costruendo qualcosa come engadget o techcrunch, c'è un'alta probabilità che il working set sia costituito da commenti per gli ultimi giorni e che le vecchie pagine vengano ripristinate molto meno frequentemente (i commenti verrebbero generati in memoria su richiesta), quindi non è così t influenzare significativamente le prestazioni.

Quindi ricapitoliamo:finché continui a lavorare in memoria (potresti pensare che sia in lettura/scrittura nella cache), il recupero di queste cose è superveloce e un'altra query non sarebbe un problema. Se lavori con porzioni di dati che non rientrano nella memoria, ci sarebbe velocità degradazione , ma ora non conosco le tue circostanze -- potrebbe essere accettabile, quindi in entrambi i casi tendo a scegliere usare collegamento.