NoSQL شامل مجموعه ای بسیط و گسترده از تکنولوژی های مختلف پایگاه داده است که در پاسخ به افزایش -بسیار سریع- حجم داده های ذخیره شده درباره کاربران، اشیاء و محصولات و نیز تناوب دسترسی به داده ها و نیازهای اجرا و پردازش، توسعه داده شده اند. از سوی دیگر، پایگاه های داده رابطه ای، به منظور مقابله با چالش های مقیاس و چابکی ای که برنامه های مدرن با آن ها روبرو هستند، و نیز بهره گیری از امکان ذخیره ارزان قیمت و قدرت پردازش بالای دنیای امروز، طراحی نشده بودند.
پایگاه های داده ارتباطی، الزام می کنند که پیش از اینکه بتوانید داده ای را اضافه نمائید، شِما ها باید تعریف شده باشند. برای مثال؛ ممکن است که در نظر داشته باشید اطلاعاتی از قبیل نام، شماره تلفن، استان، شهر و آدرس مشتریان خود را ذخیره نمایید. در یک پایگاه داده ارتباطی باید از ابتدا بدانید چه داده هایی را می خواهید ذخیره کنید.
این انگاره (در پایگاه های داده ارتباطی) تناسب بسیار ضعیفی با رویکرد “توسعه چابک” دارد، چراکه هر بار که شما یک ویژگی جدید را کامل می نمایید، اغلب شِمای پایگاه داده شما نیاز به تغییر دارد. برای مثال؛ اگر تصمیم گرفتید که کمی دایره داده ها را توسعه دهید و برای مثال علاوه بر نام و آدرس و … مشتریان، موارد دلخواه و مورد علاقه آنها را نیز ذخیره کنید، نیازمند افزودن ستون به پایگاه داده و سپس مهاجرت کل پایگاه داده به یک شِما جدید هستید.
اگر پایگاه داده، پایگاه داده بزرگی باشد، این فرآیند بسیار کند انجام خواهد پذیرفت که زمان از کارافتادگی قابل توجهی را تحمیل خواهد کرد. همچنین اگر به صورت مکرر در حال تغییر داده های ذخیره شده توسط برنامه های خود هستید، این زمان از کار افتادن، نیز مکرراً رخ خواهد داد. همچنین با استفاده از یک پایگاه داده ارتباطی، به هیچ طریقی امکان پیگیری موثر داده هایی که از پیش کاملاً بدون ساختار و یا ناشناخته هستند، وجود ندارد.
پایگاه های داده NoSQL به منظور ایجاد امکان ورود داده ها بدون نیاز به شِما از پیش تعریف شده، ایجاد گشته اند. در واقع این نوع از پایگاه های داده، ایجاد تغییرات وسیع و در لحظه، در سطح برنامه ها را، بدون نگرانی از ایجاد اختلال در خدمت رسانی تسهیل می کنند؛ و این به این معنی توسعه سریعتر، یکپارچه سازی کد با اطمینان بیشتر و نیاز به صرف زمان راهبری کمتر پایگاه داده است.
در مقام قیاس با پایگاه های داده ارتباطی، پایگاه های داده NoSQL، مقیاس پذیرتر هستند و عملکرد بالاتری را نیز فراهم می آورند و همچنین، مدل داده آنها، موضوعات مختلفی را که توسط مدل های ارتباطی مغفول مانده اند، مورد توجه قرار می دهند، مواردی از قبیل:
———– | پایگاه داده SQL | پایگاه داده NoSQL |
انواع | یک نوع با تغییرات حداقلی | انواع بسیار مختلف شامل؛ انبارهای Key-Value، پایگاه های داده مبتنی بر سند، پایگاه های داده گرافی و انبارهای Wide-column |
نمونه | MySQL, Postgres, Oracle Database | MongoDB, Cassandra, HBase, Neo4j |
مدل نگهداری داده | رکورد های منفرد (برای مثال “کارمندان”)، در جداول به عنوان ردیف ذخیره می شوند، و با هر ستون یک قسمت خاص از داده را درباره آن رکورد ذخیره می کند (برای مثال “مدیر مستقیم”، “روز استخدام”). داده های مجزا در جداول مجزا ذخیره می شوند و زمانی که پرس و جو های پیچیده اجرا می شوند، به یکدیگر می پیوندند. برای مثال؛ “نام اداره” در یک جدول ذخیره می شود و “نام کارمند” در جدولی دیگر و زمانی که یک کاربر، آدرس یک کارمند را جستجو می کند، موتور پایگاه داده جداول “کارمندان” و “اداره” را برای گرفتن تمامی اطلاعات مورد نیاز در کنار هم قرار می دهد. | بر اساس نوع پایگاه داده متفاوت است. برای مثال، انبارهای key-value مشابه پایگاه های داده SQL عمل می کنند، اما تنها دو ستون دارد (key و Value) به همراه اطلاعات پیچیده تری که برخی مواقع درون ستون value ذخیره می شود. پایگاه های داده مبتنی بر سند، مدل جدول و ردیف با یکدیگر را منسوخ کردند و تمامی داده های مرتبط با یکدیگر را در یک “سند” در JSON، XML و یا سایر فرمت ها که مقدار ها را به صورت سلسله مراتبی در خود جای می دهند، ذخیره می کنند. |
مقیاس پذیری | عمودی؛ به این معنی که یک سِرور تنها به منظور غلبه بر تقاضای افزایش یافته، باید به میزان زیادی تقویت شود. امکان دارد که پایگاه های داده SQL در میان سِرور های متعددی توزیع شود، اما عموماً نیاز به مهندسی مازاد قابل توجهی است. | افقی؛ به این معنی که برای افزایش ظرفیت، یک راهبر پایگاه داده براحتی می تواند سِرور و یا مواردی همچون فضای ابری را اضافه نماید. پایگاه داده، در صورت لزوم به طور خودکار داده را در میان سرور توزیع می کند. |
تغییر (دستکاری) در داده ها | زبانی خاص با استفاده از انتخاب، ورود و بیانیه های به روز رسانی؛ برای مثال SELECT fields FROM table WHERE… | از طریق رابط کاربری برنامه نویسی شیء گرا |