51

Ho due tabelle/collezioni; Utenti e gruppi. Un utente può essere membro di un numero qualsiasi di gruppi e un utente può anche essere proprietario di un numero qualsiasi di gruppi. In un database relazionale probabilmente avrei una terza tabella chiamata UserGroups con una colonna UserID, una colonna GroupID e una colonna IsOwner.Come organizzare una relazione molti a molti in MongoDB

sto usando MongoDB e sono sicuro che ci sia un approccio diverso per questo tipo di relazione in un database di documenti. Dovrei incorporare l'elenco di gruppi e gruppi come proprietario all'interno della tabella Utenti come due matrici di ObjectID? Devo anche memorizzare l'elenco di membri e proprietari nella tabella Gruppi come due array, rispecchiando in modo efficace la relazione che causa una duplicazione delle informazioni sulle relazioni?

O è una tabella di bridging UserGroups un concetto legittima nei database di documenti per molti a molti rapporti?

Grazie

+0

Vedere anche le risposte a [questa domanda] (http://stackoverflow.com/questions/2336700/mongodb-many-to-many-association) e [questa domanda] (http://stackoverflow.com/questions/ 5498692/many-to-many-relationships-in-couchdb-or-mongodb) –

+0

So che questo è piuttosto vecchio, ma mi sto chiedendo anche sulla scala.Cosa succede se hai 1000 gruppi? – FarscapePROJ

+0

Ottimo punto - Un'altra opzione, in questo caso, consiste nell'utilizzare l'equivalente di una relazione di giunzione da un database SQL, una raccolta intermedia con due chiavi esterne, una per ogni raccolta correlata. In questo caso, è possibile eseguire 3 query: (1) un normale find() per ottenere i risultati parent, (2) una query IN per ottenere i risultati intermedi e infine (3) una query IN utilizzando le chiavi esterne nel risultati intermedi per trovare i record figlio. (Ecco come implementiamo questa funzionalità in Waterline) – mikermcneil

risposta

34

Quello che ho visto fare, e quello che ho attualmente in uso sono le matrici con nodo id in ogni documento incorporato.

Così documentare user1 ha gruppi di proprietà: [ID1, ID2]

E documento group1 ha utenti di proprietà: [USER1]. Il gruppo di documenti 2 ha anche utenti di proprietà: [utente1].

In questo modo si ottiene un oggetto Gruppo e facilmente selezionare tutti gli utenti connessi, e lo stesso per l'utente.

Questo richiede un po 'più di lavoro durante la creazione e l'aggiornamento dell'oggetto. Quando dici 2 oggetti sono correlati, devi aggiornare entrambi gli oggetti.

C'è anche un concetto DBReferences in MongoDB e seconda del driver, si tirerà fatto riferimento automaticamente gli oggetti durante il recupero di un documento.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

+0

Eccellente grazie per avermi segnalato anche i documenti. Ha senso ora, è un approccio diverso e più flessibile e performante è eccitante entrare in questa roba. Anche http://www.mongodb.org/display/DOCS/Schema+Design –

+7

Appena visto Kyle Banker risponde alla mia domanda a 29 minuti di questo video di presentazione: http://www.blip.tv/file/3704083. Non usare mai una tabella di join per rappresentare molti a molti, ma avere una lista di ObjectId in entrambe le collezioni –

+8

Come funziona questa scala? Avere un elenco di utenti nel documento di gruppo potrebbe andare fuori controllo rapidamente quando hai potenzialmente migliaia di utenti giusto? – PJH

2

Cerchiamo di capire molti a molti Relazioni con un'esempi

  • libri di autori
  • studenti ai docenti

I libri per gli autori è un pochi a pochi relazione, quindi possiamo avere una serie di libri o autori all'interno di un altro documento nt. Lo stesso vale per gli studenti agli insegnanti. Potremmo anche incorporarci a rischio di duplicazione. Tuttavia questo richiederà che ogni studente abbia un insegnante nel sistema prima dell'inserimento e viceversa. La logica dell'applicazione potrebbe non permetterlo sempre. In altre parole, l'oggetto genitore deve esistere affinché l'oggetto figlio esista.

Tuttavia, quando si ha una relazione da molti a molti, utilizzare due raccolte e disporre di un vero collegamento.

1

In caso chiunque sia interessato, ho appena ha urtato un ottimo articolo pubblicato in MongoDB blog. 6 Rules of Thumb for MongoDB Schema Design. Ci sono 3 parti in questo articolo, dopo aver letto tutte e 3 avrai una buona comprensione.