سلام. من امیرعلی سمیعی هستم دانشجوی کارشناسی علوم کامپیوتر دانشگاه تهران مرکز. این دومین مقالهی فعالیت کلاسی درس طراحی اصول نرمافزار استاد حاجیاسمعیلی است. اولین مقاله با عنوان باور کنیم ۲۱ میلیون بیتکوین بیشتر نداریم؟ را میتونید در لینک ارجاع داده شده بخوانید.
چند وقتی است بازار NoSQL خیلی داغ است. خیلیها برای جا نماندن از این تکنولوژی نسبتا جدید به دنبال یادگیری آن هستند. کلی دوره و آموزش آنلاین و حضوری در این زمینه برگزار میشود و بسیاری از استارتآپهایی که میخواهند سری در میان سرها دربیاورند پایگاه دادهی سامانهی خود را روی ساختار NoSQL طراحی میکنند. اما اصلا NoSql به درد چه پروژهای میخورد؟ اصلا چه شد که نیاز به ساختاری ورای RDBMS احساس شد؟ آیا دیگر RDBMSها از جمله SQL Server، MySQL، PostgreSQL و ... جای خود را به NoSqlها از جمله MongoDB، Redis، ArangoDB و ... دادهاند؟ در این مقاله سعی بر آن است به تمام این موارد پاسخ داده شود.
پایگاهدادههای RDBMS
پایگاهدادههای RDBMS (Relational Database Management System) نوعی از پایگاهدادههای مرسوم هستند که ساختاری ردیفی - ستونی و جدولی دارند. به این معنا که دادهها در این نوع از پایگاهداده در ردیفهای یک جدول که ستونهایی مشخص دارد ذخیره میشود. این جدولها یا قابلیت مرتبط بودنی که با یکدیگر دارند (Relational) این قابلیت را در اختیار کاربر قرار میدهند که در آن واحد از دادههای چند جدول واکاوی اطلاعات داشته باشد. به صورت عرف برای این منظور از زبان SQL (Structured Query Language) استفاده میشود، با کمک این زبان میتوان در پایگاهدادههای RDBMSای خود عملیاتهای ثبت، ویرایش، حذف و خواندن را انجام دهیم.
در این نوع پایگاههای داده، ردیفی که میخواهیم ثبت کنیم باید کاملا در قالب جدول باشد. برای مثال اگر جدول شخصی داریم که دادههای افراد در آنها ثبت میشوند و ستونهای نام، نام خانوادگی، جنسیت، نام پدر و کد ملی، ستونهای این جدول باشند هر شخصی که میخواهیم ثبت کنیم باید تمام این اطلاعات را داشته باشیم. برای مثال اگر در این جدول پر شدن نام پدر الزامی نباشد یا به عبارتی Nullable باشد، در این صورت برای فردی که نام پدرش را نداریم میتوانیم چیزی ثبت نکنیم. در این حالت هنگام واکاوی دادههای آن شخص ستون نام پدر مقدار NULL را دارد.
پایگاهدادههای NoSQL
پایگاهدادههای NoSQL غیر ارتباطی هستند (non-relational) که نیازی به ساختاری دقیق ندارند و انعطاف بیشتری دارند. عبارت NoSQL به Not Only SQL یا NOT SQL اشاره دارد که در سال ۱۹۹۸ معرفی شد. این نوع پایگاههای داده انواع مختلفی از جمله Document Based، Key Valued Pair، Graph Databas و ... دارد که تقریبا میتوان گفت معروفترین آنها MongoDb که یک پایگاهدادهی Document Based است و Redis که یک پایگاهدادهی Key Valued Pair است میباشند.
همان طوری که گفته شد این نوع پایگاههای داده انعطاف بیشتری دارند. پایگاهدادههای Document Based مثل MongoDB دیگر جدول، ستون و ردیف ندارند. در این نوع پایگاههای داده با Document سر و کار داریم. هر ردیف در RDBMS یک Document در MongoDB است. حال فرض کنید همان جدول شخصی که داشتیم را در MongoDB داشته باشیم. دیگر زمانی که دادههای شخصی را که نام پدر ندارد را جستجو میکنیم با عبارت NULL مواجه نمیشیم! اگر مقداری را برای آن مولفه نداشته باشیم به راحتی در Document مورد نظر نام برده نمیشود. این خاصیت انعطافپذیری خیلی خوبی به طراح دیتابیس میدهد. فرض کنید در اطلاعات یک میلیون نفر را داریم طبق مشخصات جدول شخص که در بالاتر نام برده شد داریم. حال میخواهیم شمارهی همراه افراد را از این به بعد بگیریم. برای این کار در دیتابیسهای RDBMS باید ستون شمارهی همراه را اضافه کنیم که برای یک میلیون نفری که داریم عبارت NULL میافتد. (در دیتابیسهای RDBMS پیشنهاد میشود برای اضافه کردن ستون به جدول کل جدول پاک شود، ساختار جدید ایجاد شود، دادههای قبلی ثبت شود. در برخی از پایگاههای داده این حالت به صورت گرافیکی یا ساختاری پشتیبانی میشود ولی در پشت صحنه دقیقا همینکاری که توضیح دادم انجام میشود) در حالی که در دیتابیسی مثل MongoDB دیگر نیازی به این کار نیست تنها از این به بعد هر کسی شمارهی همراه داشت را با شمارهی همراه ثبت میکنیم و وقتی دادههای کسی که شمارهی همراه ندارد را واکاوی میکنیم با عبارت NULL شمارهی همراه مواجه نمیشویم.
این نوع دیتابیسها در سالهای اخیر در شرکتهای بزرگ با حجم دادههای بزرگ خیلی رواج پیدا کرد. شرکتهای مثل فیسبوک، گوگل، آمازون و ... از این نوع پایگاههای داده برای کارهای بزرگی مثل طبقهبندی پستهای وبسایتها، شبکههای اجتماعی و ... استفاده میکنند.
مفهوم Clustering
میتوان گفت بزرگترین مزیت دیتابیسهای NoSQL آسانی Clustering است. Clustering چیست؟ اصولا شرکتهای بزرگ از سرورهای متعددی برای ذخیرهسازی دادههای خود استفاده میکنند. فرض کنید دادههای گوگل در یک دیتابیس باشد! اگر مشکلی برای آن سرور به وجود بیاید چی؟ همه چی از بین میرود! فرض کنید آن سرور فقط در آمریکا باشد. کسی که از کرهجنوبی میخواهد به از سایت گوگل استفاده کند زمان بیشتری باید منتظر پاسخگویی سرور باشد! برای این موارد و چند مورد بیشتر که وارد شدن بهشون خیلی تخصصی و زمانبر میشه، اصولا شرکتهای بزرگ دادههای خود را در چند سرور و بعضا در چند نقطهی جغرافیایی مختلف نگهداری میکنند. به این صورت که کسی از هند، آمریکا، آلمان و ... خواست به سایت فیسبوک دسترسی داشته باشد packetهایی که میفرستد و میگیرد در نقطهای نزدیک به محل سکونت خود باشد.
علاوه بر این مورد اصولا سرورهای متعدد برای بکآپگیری استفاده میشوند. بذارید با مثال توضیح بدم. فرض کنید شخصی از هند میخواهد در سایت فیسبوک ثبتنام کند. مثلا سرور فیسبوک جایی در حوالی دهلی قرار دارد. وقتی که شخص ثبت نام خود را انجام میدهد دادهها نه تنها درون یک سرور بلکه درون مثلا سه سرور ثبت میشوند! تا زمانی که ثبت دادهها در هر سه سرور نهایی نشود عملیات ثبت کاربر نهایی نشده! پس از اینکه هر ۳ ثبت صورت گرفت کاربر پیام موفقیتآمیز را میبیند! به این ترتیب اگر یکی از آن سرور از دسترس خارج شد، دادههای شرکت از بین نرفته است!
به این حالت که چند سرور را در اختیار بگیریم و عملیاتهای خود را بر اساس چند سرور پیاده کنیم Clustering گویند. این مفهوم حالتهای مختلفی دارد برای مثال حالتی دیگر وجود دارد که ثبت داده در یک سرور، خواندن داده از سروری دیگر انجام میشود و ... کلاسترینگ مفهوم پیچیده و مهمی است که در اینجا بیش از این به آن نمیپردازیم چیزی که مد نظر است این است که دیتابیسهای NoSQL برای کلاستر کردن روند سادهتری نسبت به دیتابیسهای RDBMS دارند و میتوان گفت دلیل اصلی آن نیز انعطافپذیری بیشتر این نوع دیتابیسها است.
چند تفاوت دیگر RDBMS و NoSQL
دیتابیسهای RDBMS و NoSQL علاوه بر موارد ذکر شده ویژگیهای متفاوت دیگری دارند. برای مثال اصولا در دیتابیسهای NoSQLای نیازی به join زدن نیست چون دادهها بنا به مصرف در کنار یکدیگر نگهداری میشوند. دیتابیسهای NoSQLای اصولا ACID transaction را ساپورت نمیکنند (البته MongoDB این ویژگی را دارد).
از کاربرد اختصاصی دیتابیسهای NoSQL میتوان به دیتابیسهای Key Value که اصولا برای جستجو در میان دادههای زیاد، به خصوص کشینگ سرورها (مانند Redis) و دیتابیسهای Graph که برای تجزیه و تحلیل دادههای مرتبط استفاده میشوند اشاره کرد.
در خیلی از موارد ساختار مورد نظر بهتر است در قالب RDBMS طراحی شود اما صرفا به علت نو بودن NoSQLها شرکتها به آنها روی میآورند. بهتر است برای طراحی ساختار مورد نظر جنبههای مختلف در نظر گرفته شود و با توجه به خاصیت و ویژگی دیتابیسهای موجود، پایگاهدادهی مناسب برای آن طرح انتخاب شود.
نام استاد: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندن
PhD of computer science from Kingston university of London
منابع: دورههای M001 و M100 دانشگاه MongoDB. سایت Besant Technologies. سایت freeCodeCamp.