هنگامی که وارد دنیای توسعه ی وب می شوید با سوال مهمی روبرو خواهید شد: آیا از پایگاه های داده ی SQL مانند MySQL استفاده کنم و یا کار با پایگاه های داده ی NoSQL مانند MongoDB را یاد بگیرم؟ مخصوصا اگر به عنوان برنامه نویس Node.js شروع به کار کرده باشید احتمالا احساس می کنید که MongoDB با اختلاف برتر از MySQL است اما این باور کاملا اشتباه است! من در این مقاله به تفاوت های بنیادین بین این دو سیستم مدیریت پایگاه داده یعنی تفاوت SQL و NoSQL می پردازم تا شما با آن ها آشنا شده و انتخاب آگاهانه ای داشته باشید.
SQL مخفف Structured Query Language (زبان ساختار یافته ی کوئری) است. بنابراین به خودی خود پایگاه داده نیست بلکه زبانی برای تعامل با پایگاه های داده ی SQL است. شما می توانید با استفاده از SQL با سیستم های مدیریت پایگاه داده ی رابطه ای (relational database management systems) ارتباط برقرار کنید که به اختصار RDBMS خوانده می شوند. این نوع از پایگاه های داده دو مشخصه ی اصلی دارند:
داده ها در این نوع از پایگاه های داده در جدول ها ذخیره می شوند. این جداول ساختار کاملا مشخصی دارند (یعنی ستون های مشخصی دارند که باید از قبل انتخاب و تعیین شوند). این ساختار محکم بر اساس نام فیلدها و نوع داده هایی است که باید وارد جدول شوند:
اگر داده ای داشته باشید که بر اساس ساختار جدول نباشد، در جدول اضافه نخواهد شد. مثلا اگر داده ی شما فیلدهای بیشتر یا کمتری از جدول داشته باشد دیگر نمی توانید آن را اضافه کنید. یا باید یک جدول دیگر بسازید و یا اینکه تمام ساختار جدول را به هم بریزید.
قسمت مهم دیگر پایگاه های داده ی SQL، روابط یا relation های بین جدول ها است. این روابط از ایجاد داده های تکراری جلوگیری می کنند. مثلا اگر سه جدول Users و Products و Orders داشته باشیم برای جلوگیری از تکرار شدن داده هایمان از روابط استفاده می کنیم:
همانطور که می بینید در جدول Orders دیگر نیازی به تکرار کردن تمام موارد نیست و فقط یک id مربوط به کالا و id مربوط به خود user را در آن می بینیم. مزیت این ساختار این است که امکان ندارد مقداری را در یک جدول درست وارد کرده باشید اما در جدولی دیگر همان را غلط وارد کنید.
نام این نوع از پایگاه داده ها NoSQL است چرا که دقیقا برخلاف SQL عمل می کنند:
در این نوع پایگاه های داده، داده ها به صورت collection (معادل جدول در SQL) جمع می شوند. همچنین ردیف ها (record) با نام document شناخته می شوند. البته تفاوت آن فقط در نحوه ی نام گذاری نیست. شما می توانید داده هایی را که ساختار کاملا متفاوتی از هم دارند درون یک collection قرار دهید:
Document ها تقریبا اشیاء JSON هستند و از آنجا که هیچ رابطه ای بین داده ها نیست، داده ها به صورت کامل وارد collection می شوند. بنابراین نیازی به متصل کردن جدول ها به هم نیست چرا که هر document همه ی اطلاعات مورد نیاز شما را خواهد داشت. یکی از معایب این روش این است که داده ها باید مرتبا در جدول ها (collection ها) تکرار شوند. به collection زیر توجه کنید:
این مسئله خطراتی را برای ما ایجاد می کند. به طور مثال اگر مقداری را در collection ای آپدیت کنیم اما یادمان برود که آن را در collection های دیگر نیز تغییر دهیم داده هایمان به هم خواهند ریخت. به عنوان توسعه دهنده کار شما این است که مراقب اینگونه مسائل باشید. مزیت این روش هم این است که دیگر نیازی به استفاده از دستورات پیچیده ی JOIN نداریم و تمام داده هایمان در یک قسمت جمع شده است.
بحث مقیاس پذیری یعنی پایگاه داده ی شما تا چند درخواست read و write را مدیریت می کند؟ حد نصاب آن چیست و آیا می توانیم آن را ارتقاء دهیم؟ با ارتقاء دادن آن، مقیاس آن را بزرگ تر کرده ایم به همین دلیل به آن مقیاس پذیری می گوییم. این مبحث به دو قسمت مقیاس پذیری افقی و عمودی تقسیم می شود:
به خاطر نحوه ی کار پایگاه های داده ی SQL، این نوع پایگاه های داده تنها از مقیاس پذیری عمودی پشتیبانی می کنند و مقیاس پذیری افقی فقط برای پایگاه های داده ی NoSQL قابل انجام است.
مزیت استفاده از پایگاه های SQL این موارد هستند:
مزیت پایگاه های داده ی NoSQL نیز این است که:
از معایب SQL می توان به موارد زیر اشاره کرد:
معایب NoSQL نیز از این قرار است:
سوال: چه زمانی از پایگاه های داده ی SQL استفاده کنم؟
پاسخ: اگر انواع داده های مختلفی دارید که در قسمت های مختلف برنامه تان از آن ها استفاده می کنید بهتر است از SQL ها استفاده کنید چرا که در NoSQL ها باید دائما قسمت های مختلفی از برنامه تان را بروز رسانی کنید. همچنین اگر داشتن یک ساختار ثابت برایتان مهم است و احتمال تغییر داده هایتان وجود ندارد می توانید از SQL ها استفاده کنید.
سوال: چه زمانی از پایگاه های داده ی NoSQL استفاده کنم؟
پاسخ: اگر انتظار دارید داده هایتان در آینده تغییر کند یا ساختار داده ها در آینده مشخص نیست بهترین گزینه NoSQL است. همچنین اگر برنامه ی شما درخواست های دریافت (Read) زیادی دارد اما زیاد داده ها را تغییر نمی دهید یا اگر بعدا به مقیاس دهی افقی نیاز پیدا خواهید کرد باید NoSQL را انتخاب کنید.
امیدوارم با کلیت تفاوت SQL و NoSQL آشنا شده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.