English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB العلاقات

تمثل العلاقات في MongoDB العلاقات المنطقية بين مستندات مختلفة. يمكن تصور العلاقات من خلال التضمين والمرجع. يمكن أن تكون هذه العلاقات 1:1، 1:N، N:1 أو N:N.

لنفكر في حالة حفظ العناوين للمستخدمين. لذلك، يمكن للمستخدم أن يكون لديه عدة عناوين، مما يشكل علاقة 1:N.

هذه هي بنية مستند العينةuser-

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

هذه هي بنية مستند العينةaddress-

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

إنشاء نموذج العلاقات المضمنة

في طريقة التضمين، سنقوم بتضمين مستند العنوان داخل مستند المستخدم.

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

هذه الطريقة تقوم بحفظ جميع البيانات ذات الصلة في مستند واحد، مما يجعل البحث والحفظ أسهل. يمكن استرجاع المستند بأكمله في استعلام واحد، مثلـ

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

لاحظ في الاستعلام السابق،dbوusersعلى التوالي قاعدة البيانات والمجموعات.

من العيوب أنه إذا استمرت زيادة حجم مستندات التضمين بشكل كبير، قد يؤثر على أداء القراءة/الكتابة.

إنشاء نموذج العلاقات المرجعية

هذا هو وسيلة تحسين تصميم العلاقات. في هذه الطريقة، سيتم حفظ مستندات المستخدمين ومستندات العناوين بشكل منفصل، ولكن مستندات المستخدمين ستشمل حقل مرجع لـ id مستند العنوان.

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

كما هو موضح أعلاه، يحتوي مستند المستخدم على حقل قائمة متعددة address_ids يحتوي على ObjectId للعناوين المترتبة عليها. باستخدام هذه ObjectId، يمكننا استعلام مستند العناوين والحصول على تفاصيل العناوين من هناك. باستخدام هذا الأسلوب، سنحتاج إلى استعلامين: أولاًaddress_idsمنuserالحصول على الحقول من المستند، ومن ثم منaddressالحصول على هذه العناوين في المجموعة.

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