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"]}})