English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
تمثل العلاقات في 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"]}})