ذخیره دادههای حجیم و گسترده برای اپلیکیشنهای مبتنی بر وب، یک چالش همیشگی است. یافتن یک پایگاه داده مناسب برای ذخیرهسازی این دادههای عظیم، میتواند بخش زیادی از مشکل را رفع کند و مانگو دی بی (Mongo DB)، به همین دلیل بهوجود آمده است.
این پایگاه داده، روشی تازه و کارآمد برای ذخیره دادهها در اختیار ما میگذارد و مزایای فوقالعادهای هم دارد. اگر دقیقا نمیدانید که مانگو دیبی چیست، معماری آن چگونه است و از همه مهمتر، چرا باید از آن استفاده کنیم، فقط تا انتهای این مقاله همراه ما بمانید.
مانگو دیبی (MongoDB) چیست؟
دیتابیس مانگو دیبی، پایگاه داده مبتنی بر سند (Document) است که برای ذخیره حجم عظیمی از دادهها، مورد استفاده قرار میگیرد. این دیتابیس، از نوع NoSQL است. پایگاههای داده NoSQL، برخلاف پایگاههای داده سنتی و قدیمی، از جدولها و ردیفها برای ذخیرهسازی داده استفاده نمیکنند و دادهها را بر اساس سند یا همان Document ذخیره میکنند.
سندها در مانگو دیبی، بر اساس Key-Value ذخیره میشوند که این جفتهای کلید-مقدار را میتوانیم واحد پایهای این پایگاه داده بنامیم. پایگاه داده Mongo DB، یک پایگاه داده متنباز است که برای توسعه نرمافزارهای مبتنی بر وب، کاربرد فوقالعادهای دارد. انعطاف بسیار بالا و مقیاسپذیری عالی، دو مشخصه اصلی این پایگاه داده هستند که باعث محبوبیت فوقالعاده آن شدهاند.
حالا و با این توضیحات اولیه، بهتر است پیش از ادامهدادن معرفی این پایگاه داده و بررسی مشخصههای آن، با معماری و بخشهای کلیدی این دیتابیس آشنا شویم.
اجزای کلیدی معماری مانگو دی بی (Mongo DB)
مهمترین اجزای کلیدی و مهمی که در زمان کار با دیتابیس مانگو دیبی با آنها روبهرو میشویم، شامل 7 بخش هستند:
_id
یکی از مهمترین و اصلیترین بخشها در هر سند از پایگاه داده Mongo DB، بخش _id است. در _id یک عبارت منحصر بهفرد، ترکیبی از اعداد و حروف با 24 کاراکتر قرار میگیرد که هر عبارت، نشانگر یک داکیومنت است. سندها در این نوع پایگاه داده، با این فیلد علامتگذاری میشوند. به همین خاطر، حتی اگر شما بهعنوان کاربر این فیلد را نسازید، پایگاه داده مانگو دیبی خود بهصورت اتوماتیک، _id را برای داکیومنت شما میسازد.
Collection
همانطور که در بخش معرفی دیتابیس Mongo DB گفتیم، در این پایگاه داده «جدول» وجود ندارد. بهعنوان جایگزین جدولها، کالکشنها در این پایگاه داده معرفی شدهاند. در هر پایگاه داده، یک کالکشن وجود دارد و نکته بسیار جالب و مهم این است که ساختار این کالکشنها، از هیچ الگوی خاصی پیروی نمیکنند.
هر کدام از داکیومنتها میتواند ساختار منعطف و مجزایی داشته باشد و بر خلاف جدولهای سنتی در دیتابیسهای مبتنی بر روابط، این کالکشنها چارچوب یکسانی ندارند.
Cursor
کورسر یا نشانگر، همان چیزی است که کاربران با استفاده از آن میتوانند دادههای ذخیره شده خود را در این پایگاه داده، بازیابی کنند.
Database
دیتابیس در معماری مانگو دیبی، کانتینری برای ذخیرهسازی مجموعهها است. به عبارت دیگر، همانطور که RDBMS یک کانتینر برای جداول است، دیتابیس هم در این پایگاه داده، کالکشنها را در خود ذخیره میکند. هر Database در مانگو دیبی، مجموعه فایلهای اختصاصی خود را دارد و یک سرور مانگو دیبی، میتواند چندین دیتابیس داشته باشد.
Document
در مانگو دیبی، همه چیز بر اساس داکیومنت ساخته میشود و Document در این نوع پایگاه داده، دقیقا معادل یک رکورد است. این سندها از یک جفت Name-Value یا همان نام-مقدار، تشکیل میشوند.
Field
هر جفت از Name-Value در یک داکیومنت، فیلد نام دارد. یک داکیومنت میتواند چندین فیلد داشته یا اصلا در آن فیلدی وجود نداشته باشد. برای درک بهتر ماهیت فیلد، میتوانیم بگوییم که فیلدها مشابه ستونها در پایگاههای داده مبتنی بر روابط هستند.
JSON
رابط کاربری میان پایگاه داده مانگو دیبی و کاربران است. JSON یک متن ساده را در اختیار کاربران میگذارد تا بتوانند بهراحتی داکیومنتهای موجود در Mongo DB را بخوانند.
حالا و با بررسی اجزای کلیدی این پایگاه داده، در صورت بررسی Mongo DB در منابع دیگر، میتوانید اجزای مهم آن را تشخیص دهید.
معماری مانگو دی بی (Mongo DB)
برای درک بهتر اجزای معماری مانگو دیبی، به مثال زیر توجه کنید:
مقدار موجود در مقابل _id توسط مانگو دیبی به داکیومنت اضافه میشود تا هر داکیومنت، یک عبارت منحصر بهفرد در کالکشن داشته باشد. به کادر قرمز توجه کنید، مقادیر Order ID، Product و Quantity که در پایگاه داده سنتی هر کدام در یک جدول مجزا ذخیره میشدند، در مانگو دیبی بهعنوان بخشی از کالکشن و در خود داکیومنت، تعبیه میشوند. با ذخیره دادهها در یک سند واحد، مشکلاتی مثل نیاز به کلید اصلی برای ایجاد وابستگی میان جدولها، احتمال افزونگی با افزایش حجم دادهها و دیگر معضلات مشابه، از بین میرود.
حالا و پس از این توضیحات، احتمالا شما هم میخواهید بدانید که این پایگاه داده چه ویژگیهای اختصاصی دارد؟ در بخش بعدی، این سوال شما را پاسخ میدهیم.
ویژگیهای اصلی مانگو دی بی (MongoDB) چیست؟
برخی از مهمترین مشخصههای Mongo DB شامل این موارد هستند:
هر دیتابیس حاوی کالکشنهای متنوع است و این کالکشنها هم به نوبه خود، حاوی داکیومنتهای گوناگون هستند. تعداد فیلدهای هر داکیومنت هم متغیر بوده و یکسان نیست. علاوه بر این، سایز و محتوای هر داکیومنت هم میتواند کاملا با بقیه داکیومنتها فرق داشته باشد. داکیومنتها میتوانند بدون نیاز به یک الگوی از پیش تعیین شده، ساخته شوند. بنابراین باید بگوییم که ساختار منعطف و بدون الگو، یکی از مهمترین مشخصههای Mongo DB است.
ساختار داکیومنتها نیز به نحوه ساخت کلاسها و اشیا توسط توسعهدهندگان در زبانهای برنامهنویسی گوناگون، بستگی دارد که معمولا ساختار این سندها، یک ساختار واضح از جفتهای نام-مقدار هستند.
مدل دادهای که در مانگو دیبی ارائه شده، این امکان را در اختیار شما میگذارد که روابط سلسه مراتبی را خیلی راحتتر نشان دهید، آرایهها را ذخیره کرده و دیگر فرآیندهای پیچیده را اجرا کنید.
مقیاسپذیری فوقالعاده، دیگر مشخصه مهم مانگو دیبی است. برای درک بهتر این مشخصه، باید بگوییم که کمپانیهای مختلفی در سرتاسر دنیا، کلاسترهایی را ایجاد کردهاند که برخی از این کلاسترها، بیش از 100 نود داشته و میلیونها داکیومنت نیز در دیتابیس ذخیره شدهاند.
مدلسازی دادهها در مونگو دیبی (Mongo DB)
بر خلاف دیتابیسهای SQL که باید پیش از واردکردن دادهها، ساختار جداول را بهصورت دقیق و کامل تعیین کنید، کالکشنهای مانگو دیبی به ساختار واحد و یکسان نیاز ندارند. همین انعطافپذیری فوقالعاده باعث شده که مانگو دیبی بسیار قدرتمندتر از سایر پایگاههای داده باشد. در زمان مدل سازی دادهها در Mongo DB این موارد را به خاطر بسپارید:
1.در نظر گرفتن نیازمندیهای اپلیکیشن: به نوع اپلیکیشن و حوزه کاری آن توجه کنید و ببینید که این نوع اپلیکیشن، به چه دادههایی نیاز دارند. با در نظر گرفتن نوع داده مورد نیاز، ساختار اپلیکیشن را بهنحوی بسازید که با نیازمندیهای اپ، انطباق کامل داشته باشد.
2. الگوی بازیابی دادهها: در صورتی که احتمال میدهید در حین استفاده از پایگاه داده، به کوئریهای سنگین نیاز دارید، در مدلسازی خود و برای بهبود کارایی کوئریها، از شاخصها (Index) استفاده کنید.
3. میزان تکرار اجرای عملیات اصلی در دیتابیس: در صورتی که عملیات اصلی مثل واردکردن اطلاعات، بهروزرسانی و حذف آنها، مدام در دیتابیس رخ میدهد، درباره استفاده از ایندکسها تجدید نظر کنید. روش دیگر هم این است که شاردینگ را هم بهصورت همزمان به کار ببرید و به این شکل، کارایی محیط مونگو دیبی را افزایش دهید.
چرا باید از مانگو دی بی (Mongo DB) استفاده کنید؟
مبتنی بر داکیومنت بودن
از آنجا که Mongo DB یک پایگاه داده NoSQL است، دادهها را به جای ذخیرهسازی در فرمت مبتنی بر روابط، به شکل داکیومنتهای مجزا ذخیره میکند. همین مسئله هم باعث شده که مونگو دیبی انعطاف خیلی خوبی داشته باشد و با نیازمندیها و شرایط دنیای واقعی، بهراحتی سازگار شود.
کوئریهای تککاره
مونگو دیبی از جستوجو بر اساس فیلد، آرایهای از کوئریها و البته جستوجوی عادی، پشتیبانی میکند. کوئریها را میتوانید در مونگو دیبی به شکلی برنامهریزی کنید که فقط یک فیلد مشخص از داکیومنت را به شما بازگرداند.
ایندکسگذاری
برای بهبود جستوجو در Mongo DB، میتوانید از ایندکسگذاری استفاده کنید. هر فیلد در مونگو دیبی را بدون هیچ محدودیتی، میتوانید با شاخصهای منحصر بهفرد، ایندکسگذاری نمایید.
رپلیکاسازی
مونگو دیبی با استفاده از مجموعههای مشابه یا همان Replica Set، دسترسیپذیری بینظیری در اختیار کاربران میگذارد. هر Replica Set، از دو یا چندین بینش یکسان از پایگاه داده، درست میشود. هر کدام از نسخههای موجود در یک مجموعه، در هر زمان میتوانند بهعنوان نسخه اصلی یا ثانویه، فعالیت کنند.
نسخه اصلی بهعنوان سرور فعالیت میکند، با کلاینت ارتباط برقرار کرده و تمام عملیات Read/Write را برعهده دارد. در همین حین، تمام تغییرات رخ داده در نسخه اصلی، با استفاده از همانندسازی داخلی (Built-In Replication)، در نسخههای ثانویه هم درج میشود. در صورت عدم پاسخدهی نسخه اصلی، Replica Set کاملا خودکار بر روی یکی از نسخههای ثانویه سوییچ میکند و از آن لحظه به بعد، جای نسخه اصلی و ثانویه با هم عوض میشود.
لودبالانسینگ
Mongo DB با استفاده از مفهوم شاردینگ، دادهها را در میان چندین بینش مونگو دیبی تقسیم کرده و در نتیجه، به شکل افقی گسترش پیدا میکند. به همین خاطر، مونگو دیبی میتواند بر چندین سرور مختلف اجرا شود، بار کاری خود را بین این سرورها تقسیم نماید و حتی در صورت عدم پاسخدهی سختافزار به دلیل حجم کاری بالا، از دسترس خارج نشود.
تفاوتهای بین مونگو دیبی (Mongo DB) و RDBMS
در این مطلب چند بار به تفاوتهای Mongo DB و RDBMS اشاره کردیم. برای درک بهتر این تفاوتها، توضیحات زیر به شما کمک خواهند کرد:
تفاوت جدول و کالکشن
مونگو دیبی دارای کالکشن و RDBMS دارای جدول است. هر جدول، از چند ردیف و ستون مشخص تشکیل میشود که دادهها در این بخشها ذخیره خواهند شد. در مونگو دیبی، این ساختاری که برای ذخیره دادهها مورد استفاده قرار میگیرد، کالکشن نامیده میشود. کالکشن حاوی داکیومنت است. هر داکیومنت هم از فیلدهای مجزای تشکیل شده و این فیلدها خود از جفتهای Key-Value ساخته میشوند.
تفاوت ردیف و داکیومنت
میتوانیم داکیومنت در مونگو دیبی را معادل ردیفها در RDBMS بنامیم. هر ردیف در جدولهای سنتی، نشاندهنده یک داده واحد، قابل تکثیر و ساختاریافته است. در مونگو دیبی، دادهها از هر نوع و به هر شکلی، در داکیومنت ذخیره میشوند.
تفاوت ستون و فیلد
ستونها در RDBMS، عنوان یک مجموعه از دادهها را مشخص میکنند یا دادههای مشخصی را علامتگذاری خواهند کرد. این وظیفه در مونگو دیبی، برعهده فیلد است.
تفاوت ماهیت Join و داکیومنتهای تعبیه شده
در پایگاه داده سنتی RDBMS، گاهی اوقات دادهها در بین جداول مختلف پراکنده میشوند و برای نشاندادن همه این دادهها در یک فضای جامع، از Join استفاده میشود. این پراکندگی دادهها در مونگو دیبی رخ نمیدهد، زیرا همیشه همه دادهها در یک فضای واحد به اسم کالکشن، ذخیره میشوند. بنابراین در محیط Mongo DB، چیزی معادل Join وجود ندارد.
افزون بر تفاوتهای گفته شده که در اصطلاحات این پایگاه دادهها شرح دادیم، چند تفاوت مهم دیگر نیز بین این دو مدل دیتابیس وجود دارد:
پایگاههای داده مبتنی بر روابط، به الزام یکپارچهسازی در دادهها شهرت دارند که این الزام در Mongo DB وجود ندارد.
پایگاه دادههای سنتی برای سازماندهی دادهها، جلوگیری از افزونگی و رفع مشکلات ساختاری، باید فرآیند نرمالسازی را بهصورت مستمر انجام دهند. با افزایش ابعاد پایگاه داده، این نرمالسازی مداوم باعث افزایش وابستگیهای میان جداول، افزایش کلیدهای اصلی و افزایش میزان Join شده و کارایی دیتابیس کاهش پیدا میکند. از آنجا که مونگو دیبی انعطاف بسیار زیادی دارد، این فرآیند نرمالسازی هم در آن رخ نداده و کارایی آن بسیار بیشتر و بهتر خواهد بود.
کلام آخر
Mongo DB ساختار بسیار منعطفی دارد، بهراحتی میتوان آن را گسترش داد و با وجود مشخصه همانندسازی، احتمال از کار افتادن پایگاه داده در زمان افزایش حجم کاری، از بین میرود. با داشتن چندین سرور فعال و تقسیم بار کاری بر این سرورها، سرعت دسترسی همیشه عالی است. استفاده از آن بسیار راحتتر از پایگاههای داده سنتی است و با وجود تمام این مزایا، یک دیتابیس فوقالعاده برای نرمافزارهای مبتنی بر وب با حجم عظیمی از دادهها خواهد بود.
3 نظر
من کاملا به پایگاه داده ای مسلطم ولی یک دنیا ابهام تو این پست شما بود که بنظر من حتی ارزش خونده شدن هم نداره
سلام علی. مرسی که وقت گذاشتی این بلاگپست رو خوندی و فیدبک دادی. حتما روی اشکالات این مقاله کار میکنیم و بهبودش میدیم.
سلام. مطلب رو کامل خوندم. این مطلب خوب بود. به عنوان پیشنهاد عرض می کنم که اگر این مورد رو کمی با کدهای سمپل و نمونه برنامه نویسی هم توضیح می دادین بیشتر قابل فهم می شد. من خیلی مقاله در زمینه مونگو دی بی خوندم ولی همشون آبکی بودن و فقط کلیات رو بیان می کردن. سپاس بابت اینکه این مطلب رو منتشر فرمودین.