2013-09-03 18 views
5

Sto imparando su MongoDB e ho una domanda: come rappresenti relazioni molti o molti o molti-a-uno? In un DB SQL standard che sarebbe stato semplice:Come rappresentare una relazione molti-a-molti o molti-a-uno in MongoDB?

Parent Table has fields ID (primary key) and Name. 
Child Table has fields ID (primary key) and Name 
Parent-Child-Relationship Table has fields ID (primary key), ParentID and ChildID 

insert into table Parent (ID, Name) values (1, "Bob"); 
insert into table Child (ID, Name) values (1, "Mahmoud"); 
insert into table Parent-Child-Relationship (ID, ParentID, ChildID) values (1,1,1); 

ma non ho capito come fare questo in MongoDB. Potrei fare:

db.parent.save({name: "Bob", children: ["Mahmoud"]}); 

Ma allora come potrei creare un altro genitore (dì "Maria") per Mahmoud ??

Mi manca qualcosa di ovvio? Per favore aiuto. Sono una novità completa della tecnologia NoSQL.

+0

Nella maggior parte dei casi si prende i join fuori del livello di database e li fai a livello di applicazione. Puoi incorporare i dati su entrambi i genitori o semplicemente fare due ricerche. Puoi ottenere molte più informazioni qui: http://docs.mongodb.org/manual/core/data-modeling/ – ranman

risposta

1

La risposta breve è che non lo fai.

La risposta 10Gen indica che è necessario utilizzare un documento singolo che è il genitore e documenti secondari che rappresentano i figli.

Tuttavia, non farlo, poiché le query di documenti secondari in Mongo sono limitate e lente.

Quello che tutti finiscono è memorizzare gli ID padre sui figli e fare più query/join a livello di applicazione.

+0

cosa ti fa dire che le interrogazioni per documenti secondari sono limitate? – ranman

+0

Non è possibile interrogare più di un livello in profondità in un documento secondario. –

+1

Mongo non ha join ... –

1

Nulla vi impedisce di creare un altro genitore come di seguito:

db.parent.save({name: "Jane", children: ["Mahmoud"]}) 

ma direi che vi manca il punto. La suddivisione dei dati in modo simile a una riga nel database orientato ai documenti è in genere una cattiva idea. Tutto dipende dalla logica applicativa, ma se si vuole riflettere i dati di famiglia si può provare per esempio struttura come quella:

db.family.insert({mother: {name: "Jane", age: 27}, father: {name: "Bob", age: 29}, children: [{name: "Mahmoud", age: 2}], }) 
+1

Concettualmente, questo non sembra funzionare. Cosa succede se vogliamo memorizzare le relazioni tra gli stessi oggetti Bob, Jane, Mahmoud e altri oggetti diversi? E se dicessimo che Jane e Mahmoud sono nati a Chicago, ma Bob è nato a Tokyo? E se ognuna di queste città avesse un gruppo di informazioni associate rispettivamente (ad esempio popolazione, long, lat, ecc.). La mia mente è stata semplicemente presa da una risata nel pensare sempre alle cose in termini di tabelle e righe? Devo pensarci diversamente? –

+0

Il modello relazionale puro IMHO è molto più universale di tutto ciò che può offrire un database orientato ai documenti. La modellazione dei dati nel database orientato ai documenti come MongoDB è altamente dipendente dalle applicazioni e, come Jonathan Holland, ha scritto in precedenza che gran parte del lavoro consiste in "più query/join nel livello dell'applicazione".Una cosa che dovresti assolutamente evitare è la normalizzazione dei dati. In generale, si vuole riflettere maggiormente sulla struttura gerarchica dei dati anziché sulle semplici relazioni oggetto - oggetto. – zero323

Problemi correlati