بین پایگاه های داده ی NoSQL و SQL کدام را انتخاب کنم؟

11 آبان 1398
بین پایگاه های داده ی NoSQL و SQL کدام را انتخاب کنم؟

تفاوت SQL و NoSQL در چیست؟

هنگامی که وارد دنیای توسعه ی وب می شوید با سوال مهمی روبرو خواهید شد: آیا از پایگاه های داده ی SQL مانند MySQL استفاده کنم و یا کار با پایگاه های داده ی NoSQL مانند MongoDB را یاد بگیرم؟ مخصوصا اگر به عنوان برنامه نویس Node.js شروع به کار کرده باشید احتمالا احساس می کنید که MongoDB با اختلاف برتر از MySQL است اما این باور کاملا اشتباه است! من در این مقاله به تفاوت های بنیادین بین این دو سیستم مدیریت پایگاه داده یعنی تفاوت SQL و NoSQL می پردازم تا شما با آن ها آشنا شده و انتخاب آگاهانه ای داشته باشید.

پایگاه های داده ی SQL

SQL مخفف Structured Query Language (زبان ساختار یافته ی کوئری) است. بنابراین به خودی خود پایگاه داده نیست بلکه زبانی برای تعامل با پایگاه های داده ی SQL است. شما می توانید با استفاده از SQL با سیستم های مدیریت پایگاه داده ی رابطه ای (relational database management systems) ارتباط برقرار کنید که به اختصار RDBMS خوانده می شوند. این نوع از پایگاه های داده دو مشخصه ی اصلی دارند:

  • داده ها در این جدول ها بر اساس یک ساختار کاملا مشخص ذخیره می شود.
  • این داده ها بر اساس چیزی به نام relation (رابطه ی جداول) بین جدول ها پخش می شوند.

ساختار مشخص (schema)

داده ها در این نوع از پایگاه های داده در جدول ها ذخیره می شوند. این جداول ساختار کاملا مشخصی دارند (یعنی ستون های مشخصی دارند که باید از قبل انتخاب و تعیین شوند). این ساختار محکم بر اساس نام فیلدها و نوع داده هایی است که باید وارد جدول شوند:

طرح یک پایگاه داده و جدول آن - از نوع SQL
طرح یک پایگاه داده و جدول آن - از نوع SQL

اگر داده ای داشته باشید که بر اساس ساختار جدول نباشد، در جدول اضافه نخواهد شد. مثلا اگر داده ی شما فیلدهای بیشتر یا کمتری از جدول داشته باشد دیگر نمی توانید آن را اضافه کنید. یا باید یک جدول دیگر بسازید و یا اینکه تمام ساختار جدول را به هم بریزید.

Relation ها

قسمت مهم دیگر پایگاه های داده ی SQL، روابط یا relation های بین جدول ها است. این روابط از ایجاد داده های تکراری جلوگیری می کنند. مثلا اگر سه جدول Users و Products و Orders داشته باشیم برای جلوگیری از تکرار شدن داده هایمان از روابط استفاده می کنیم:

روابط بین جدول ها در پایگاه های SQL
روابط بین جدول ها در پایگاه های SQL

همانطور که می بینید در جدول Orders دیگر نیازی به تکرار کردن تمام موارد نیست و فقط یک id مربوط به کالا و id مربوط به خود user را در آن می بینیم. مزیت این ساختار این است که امکان ندارد مقداری را در یک جدول درست وارد کرده باشید اما در جدولی دیگر همان را غلط وارد کنید.

پایگاه های داده ی NoSQL

نام این نوع از پایگاه داده ها NoSQL است چرا که دقیقا برخلاف SQL عمل می کنند:

  • هیچ ساختار مشخصی وجود ندارد.
  • هیچ رابطه ای بین داده ها وجود ندارد.

در این نوع پایگاه های داده، داده ها به صورت collection (معادل جدول در SQL) جمع می شوند. همچنین ردیف ها (record) با نام document شناخته می شوند. البته تفاوت آن فقط در نحوه ی نام گذاری نیست. شما می توانید داده هایی را که ساختار کاملا متفاوتی از هم دارند درون یک collection قرار دهید:

طرح یک پایگاه داده و collection آن - از نوع NoSQL
طرح یک پایگاه داده و collection آن - از نوع NoSQL

Document ها تقریبا اشیاء JSON هستند و از آنجا که هیچ رابطه ای بین داده ها نیست، داده ها به صورت کامل وارد collection می شوند. بنابراین نیازی به متصل کردن جدول ها به هم نیست چرا که هر document همه ی اطلاعات مورد نیاز شما را خواهد داشت. یکی از معایب این روش این است که داده ها باید مرتبا در جدول ها (collection ها) تکرار شوند. به collection زیر توجه کنید:

عدم وجود روابط بین داده ها باعث تکرار آن ها می شود.
عدم وجود روابط بین داده ها باعث تکرار آن ها می شود.

این مسئله خطراتی را برای ما ایجاد می کند. به طور مثال اگر مقداری را در collection ای آپدیت کنیم اما یادمان برود که آن را در collection های دیگر نیز تغییر دهیم داده هایمان به هم خواهند ریخت. به عنوان توسعه دهنده کار شما این است که مراقب اینگونه مسائل باشید. مزیت این روش هم این است که دیگر نیازی به استفاده از دستورات پیچیده ی JOIN نداریم و تمام داده هایمان در یک قسمت جمع شده است.

مقیاس پذیری عمودی و افقی

بحث مقیاس پذیری یعنی پایگاه داده ی شما تا چند درخواست read و write را مدیریت می کند؟ حد نصاب آن چیست و آیا می توانیم آن را ارتقاء دهیم؟ با ارتقاء دادن آن، مقیاس آن را بزرگ تر کرده ایم به همین دلیل به آن مقیاس پذیری می گوییم. این مبحث به دو قسمت مقیاس پذیری افقی و عمودی تقسیم می شود:

  • مقیاس پذیری عمودی یعنی بالا بردن قدرت سرورها (مثل تعویض CPU و...).
  • مقیاس پذیری افقی یعنی سرورهای جدیدی اضافه شوند و پایگاه داده ی فعلی بین آن ها تقسیم شود. در این مسئله تعداد پایگاه داده تغییر نمی کند بلکه بین سرورهای مختلف تقسیم می شود.
مقیاس دهی های عمودی و افقی
مقیاس دهی های عمودی و افقی

به خاطر نحوه ی کار پایگاه های داده ی SQL، این نوع پایگاه های داده تنها از مقیاس پذیری عمودی پشتیبانی می کنند و مقیاس پذیری افقی فقط برای پایگاه های داده ی NoSQL قابل انجام است.

مزیت استفاده از پایگاه های SQL این موارد هستند:

  • ساختار مشخص که صحت و تمامیت داده ها را تضمین می کند.
  • روابط جدول ها به شما اجازه می دهند که هر داده را فقط یک بار ذخیره کنید.

مزیت پایگاه های داده ی NoSQL نیز این است که:

  • نبود ساختار از پیش تعیین شده انعطاف بیشتری به برنامه ی شما می دهد.
  • داده ها در قالبی ذخیره می شوند که برنامه به آن نیاز دارد بنابراین دریافت داده ها سریع تر است.
  • مقیاس پذیری عمودی و افقی قابل انجام است بنابراین هیچ حد نصابی برای درخواست های پایگاه داده ی شما وجود ندارد.

از معایب SQL می توان به موارد زیر اشاره کرد:

  • انعطاف پذیری کم به دلیل ساختار از پیش تعیین شده. تغییر ساختار جداول در آینده یا بسیار سخت و یا غیر ممکن است.
  • روابط ممکن است باعث ایجاد کوئری های بسیار پیچیده ی JOIN شوند.
  • مقیاس دهی افقی در SQL کار سختی است و در اکثر مواقع مقیاس دهی فقط عمودی است بنابراین اگر شرکت شما بسیار بزرگ شود به حد نصاب خاصی خواهید رسید.

معایب NoSQL نیز از این قرار است:

  • انعطاف پذیری بیش از حد ممکن است باعث تنبل شدن شما و پیاده نکردن ساختاری مشخص برای پایگاه داده تان شود.
  • داده های تکراری باعث می شوند که برای انجام عملیاتی خاص مانند به روز رسانی مجبور شوید چندین دستور به روز رسانی را برای چندین مقدار مختلف اجرا کنید.

سوال: چه زمانی از پایگاه های داده ی SQL استفاده کنم؟

پاسخ: اگر انواع داده های مختلفی دارید که در قسمت های مختلف برنامه تان از آن ها استفاده می کنید بهتر است از SQL ها استفاده کنید چرا که در NoSQL ها باید دائما قسمت های مختلفی از برنامه تان را بروز رسانی کنید. همچنین اگر داشتن یک ساختار ثابت برایتان مهم است و احتمال تغییر داده هایتان وجود ندارد می توانید از SQL ها استفاده کنید.

سوال: چه زمانی از پایگاه های داده ی NoSQL استفاده کنم؟

پاسخ: اگر انتظار دارید داده هایتان در آینده تغییر کند یا ساختار داده ها در آینده مشخص نیست بهترین گزینه NoSQL است. همچنین اگر برنامه ی شما درخواست های دریافت (Read) زیادی دارد اما زیاد داده ها را تغییر نمی دهید یا اگر بعدا به مقیاس دهی افقی نیاز پیدا خواهید کرد باید NoSQL را انتخاب کنید.

امیدوارم با کلیت تفاوت SQL و NoSQL آشنا شده باشید.

نویسنده شوید
دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

rahim
07 دی 1400
beautifully explained

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

ali
14 مهر 1400
با تشکر از مطلب خوب تون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

AJ
15 اسفند 1398
عالی بود

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.