MongoDB - İlişkiler

MongoDB'deki ilişkiler, çeşitli belgelerin mantıksal olarak birbirleriyle nasıl ilişkili olduğunu temsil eder. İlişkiler şu şekilde modellenebilir:Embedded ve Referencedyaklaşımlar. Bu tür ilişkiler 1: 1, 1: N, N: 1 veya N: N olabilir.

Kullanıcılar için adres saklama durumunu ele alalım. Dolayısıyla, bir kullanıcının bunu 1: N ilişkisi yapan birden çok adresi olabilir.

Aşağıdaki örnek belge yapısı user belge -

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

Aşağıdaki örnek belge yapısı address belge -

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

Gömülü İlişkileri Modelleme

Gömülü yaklaşımda, adres belgesini kullanıcı belgesinin içine yerleştireceğiz.

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

Bu yaklaşım, ilgili tüm verileri tek bir belgede tutar, bu da geri almayı ve bakımını kolaylaştırır. Tüm belge aşağıdaki gibi tek bir sorguda alınabilir:

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

Yukarıdaki sorguda, db ve users sırasıyla veritabanı ve koleksiyondur.

Bunun dezavantajı, gömülü belgenin boyutu çok fazla büyümeye devam ederse, okuma / yazma performansını etkileyebilmesidir.

Başvurulan İlişkileri Modelleme

Bu, normalleştirilmiş ilişki tasarlama yaklaşımıdır. Bu yaklaşımda, hem kullanıcı hem de adres dokümanları ayrı ayrı tutulacak, ancak kullanıcı dokümanı, adres dokümanına referans verecek bir alan içerecektir.id alan.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Yukarıda gösterildiği gibi, kullanıcı belgesi dizi alanını içerir address_idsilgili adreslerin ObjectIds'larını içeren. Bu Nesne Kimliklerini kullanarak adres belgelerini sorgulayabilir ve buradan adres detaylarını alabiliriz. Bu yaklaşımla, iki sorguya ihtiyacımız olacak: ilk önceaddress_ids alanlardan user belge ve bu adresleri almak için ikinci address Toplamak.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})