MongoDB - Relacje
Relacje w MongoDB pokazują, jak różne dokumenty są ze sobą logicznie powiązane. Relacje można modelować za pomocąEmbedded i Referencedpodejścia. Takie relacje mogą mieć postać 1: 1, 1: N, N: 1 lub N: N.
Rozważmy przypadek przechowywania adresów dla użytkowników. Tak więc jeden użytkownik może mieć wiele adresów, dzięki czemu jest to relacja 1: N.
Poniżej znajduje się przykładowa struktura dokumentu user dokument -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
Poniżej znajduje się przykładowa struktura dokumentu address dokument -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
Modelowanie relacji osadzonych
W podejściu osadzonym osadzimy dokument adresowy w dokumencie użytkownika.
> db.users.insert({
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}
]
}
})
Takie podejście pozwala zachować wszystkie powiązane dane w jednym dokumencie, co ułatwia ich pobieranie i utrzymywanie. Cały dokument można pobrać za pomocą jednego zapytania, takiego jak -
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Zwróć uwagę, że w powyższym zapytaniu db i users to odpowiednio baza danych i kolekcja.
Wadą jest to, że jeśli osadzony dokument stale się powiększa, może to wpłynąć na wydajność odczytu / zapisu.
Modelowanie relacji odniesienia
To jest podejście do projektowania znormalizowanych relacji. W tym podejściu zarówno dokumenty użytkownika, jak i adresowe będą utrzymywane osobno, ale dokument użytkownika będzie zawierał pole, które będzie odnosić się doid pole.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Jak pokazano powyżej, dokument użytkownika zawiera pole tablicy address_idsktóry zawiera ObjectIds odpowiednich adresów. Korzystając z tych ObjectIds, możemy zapytać o dokumenty adresowe i uzyskać stamtąd szczegóły adresowe. Przy takim podejściu będziemy potrzebować dwóch zapytań: najpierw do pobrania plikuaddress_ids pola z user dokument i drugi do pobrania tych adresów address kolekcja.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})