2013-09-03 9 views
5

Uczę się o MongoDB i mam pytanie: W jaki sposób reprezentujesz relacje między wieloma do wielu lub wiele do jednego? W standardowym SQL DB byłoby proste:Jak reprezentować relację wiele do wielu lub wiele do jednego w 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); 

Ale nie mam pojęcia, jak to zrobić w MongoDB. Mógłbym:

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

Ale jak mógłbym stworzyć kolejnego Rodzica (powiedz "Mary") dla Mahmuda?

Czy brakuje mi czegoś oczywistego? Proszę pomóż. Jestem całkowicie nową technologią NoSQL.

+0

W większości przypadków wyjmujesz łączenia z poziomu bazy danych i robisz je w warstwie aplikacji. Możesz osadzić dane na obu rodzicach lub po prostu wykonać dwa wyszukiwania. Możesz uzyskać o wiele więcej informacji tutaj: http://docs.mongodb.org/manual/core/data-modeling/ – ranman

Odpowiedz

1

Krótka odpowiedź brzmi: nie.

Odpowiedź 10Gen powiedziałaby, że należy użyć pojedynczego dokumentu, który jest rodzicem, oraz poddokumentów, które reprezentują dzieci.

Jednak nie rób tego, ponieważ zapytania na temat dokumentów podrzędnych w Mongo są ograniczone i wolniejsze.

Co każdy kończy robi jest przechowywanie identyfikatorów rodziców na dzieci i wykonywanie wielu zapytań/dołączeń na poziomie aplikacji.

+0

, co sprawia, że ​​zapytania do poddokumentów są ograniczone? – ranman

+0

Nie można wykonywać więcej niż jednego poziomu w podpunkcie. –

+1

Mongo nie ma złączeń ... –

1

Nic nie stoi na przeszkodzie stworzenia innego rodzica jak poniżej:

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

ale chciałbym powiedzieć, że brakuje punktu. Dzielenie danych w sposób podobny do wiersza w bazie danych zorientowanej na dokumenty jest zazwyczaj złym pomysłem. Wszystko zależy od logiki aplikacji, ale jeśli chcesz odzwierciedlić dane rodziny, możesz spróbować na przykład takiej struktury:

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

Konceptualnie to nie działa. Co się stanie, jeśli chcemy przechowywać relacje między tymi samymi obiektami: Bob, Jane, Mahmoud i innymi obiektami? Co jeśli chcemy powiedzieć, że Jane i Mahmoud urodzili się w Chicago, ale Bob urodził się w Tokio? A co jeśli każde z tych miast ma odpowiednio powiązaną informację (na przykład populacja, długość, lat itp.). Czy mój umysł po prostu był prosto ubrany i zawsze myślał o rzeczach w kategoriach tabel i rzędów? Czy muszę inaczej o nich myśleć? –

+0

Model czysto relacyjny IMHO jest znacznie bardziej uniwersalny niż wszystko, co oferuje baza danych zorientowana na dokumenty. Modelowanie danych w bazie danych zorientowanej na dokumenty, takie jak MongoDB, zależy w dużym stopniu od aplikacji i podobnie jak w przypadku Jonathana Hollanda powyżej dużej części zadania składa się: "wiele zapytań/połączeń na poziomie aplikacji".Jedną rzeczą, której zdecydowanie należy unikać, jest normalizacja danych. Ogólnie rzecz biorąc, chcesz myśleć bardziej o hierarchicznej strukturze danych zamiast prostych relacji obiekt - obiekt. – zero323