با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، این جلسه از آموزش های MongoDB را به روابط در MongoDB اختصاص خواهیم داد.از این جلسه به بعد آموزش MongoDBدر سطح پیشرفته تر شروع می شود. با ما همراه باشید تا از مطالب ذکر شده بهره کافی را ببرید.روابط بین دو سند از طریق روش های Embedded و Referenced در MongoDB مدل سازی می شوند.
روابط در MongoDB نشان دهنده این است که چگونه اسناد مختلف به طور منطقی با یکدیگر مرتبط هستند.
روابط را می توان از طریق روش های Embedded و Referenced مدل سازی کرد.
چنین روابطی می توانند ۱: ۱، ۱:N یا N: 1 و یا N: N باشند.
اجازه دهید ذخیره آدرس برای کاربران را در نظر بگیریم.
به این صورت که، یک کاربر می تواند آدرس های متعددی ایجاد کند و رابطه ی ۱: N داشته باشد.
در زیر ساختار سند نمونه برای سند user است :
1 2 3 4 5 6 | { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Hanks", "contact": "987654321", "dob": "01-01-1991" } |
همچنین مثال زیر ساختار سند نمونه سند address است :
1 2 3 4 5 6 7 | { "_id":ObjectId("52ffc4a5d85242602e000000"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" } |
در رویکرد Embedded،سندی که قرار است لینک شود به صورت مستقیم به عنوان یک جز در سند دیگر لحاظ می شود.
در کد زیر ما سند آدرس را داخل سند کاربر جا خواهیم داد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | { "_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" } ] } |
این رویکرد، تمام داده های مربوط به یک سند را حفظ می کند و باعث می شود که بازیابی و نگهداری آن آسان باشد.
با کد زیر تمام سند را می توان تنها در یک پرس و جو بازیابی کرد :
1 | >db.users.findOne({"name":"Tom Benzamin"},{"address":1}) |
توجه داشته باشید که در کوئری بالا، db و users به ترتیب پایگاه داده و مجموعه هستند.
اشکال این است که اگر سند Embedded شده بیش از اندازه رشد کند و بزرگ شود، در این صورت می تواند بر عملکرد خواندن / نوشتن تأثیر بگذارد.
این رویکرد برای طراحی رابطه عادی ایجاد شده است. در این رویکرد، ارتباط از طریق ایجاد لینک بین اسناد صورت می گیرد.
هر دو اسناد کاربر و آدرس به صورت جداگانه نگهداری می شوند.
اما سند کاربر حاوی یک فیلد است که فیلد id سند آدرس را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 | { "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] } |
همانطور که در بالا نشان داده شد، سند کاربر حاوی فیلد address_ids می باشد که شامل ObjectIds آدرس های مربوطه است.
با استفاده از این ObjectIds، ما می توانیم اسناد آدرس را جستجو کرده و جزئیات آدرس را از آنجا دریافت کنیم.
همچنین با استفاده از این رویکرد، ما به دو query نیاز خواهیم داشت:
اولی برای استخراج فیلدهای address_ids از سند user و دومی برای استخراج این آدرس ها از مجموعه address.
1 2 | >var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1}) >var addresses = db.address.find({"_id":{"$in":result["address_ids"]}}) |
روش های Embedded و Referenced در MongoDB هر دو برای مدل سازی استفاده می شوند.هرکدام ویژگی های خاص خود را دارند که در بالا ذکر شده بود. در جلسه بعد آموزش ارجاعات پایگاه داده در MongoDB به شما عزیزان آموزش داده خواهد شد.