بحث دیتابیس NoSQL علیه دیتابیس SQL بسیار مستبد است و در طی زمان تغییرات زیادی به خود دیده است. پس در این پست، به طور خلاصه خواهیم دید که وضعیت فعلی استراتژیهای مختلف دیتابیس چه تفاوتی دارند، و به جزئیات MongoDB و ارتباط آن با Node.js وارد خواهیم شد. در آخر، با اصطلاحات NoSQL آشنا خواهید شد و آماده شروع سفر خود با MongoDB و Node.js خواهید بود.
پسزمینه و تاریخچه
- دیتابیسها در دو نوع طبقهبندی شدهاند: دیتابیسهای SQL و دیتابیسهای دیگر.
- دیتابیسهای دیگر میتوانند هر چیزی از پروندههای فیزیکی بر روی میز شما گرفته تا اسناد الکترونیک پیچیده، که توسط یک DBMS بر روی یک سرور مدیریت میشوند، باشند.
- این دیتابیسهای دیگر همچنین شامل NoSQL میشوند، که در ابتدا یک دیتابیس بدون ساختار (NO SQL) بود، اما حال ما را قادر میسازد تا SQL را با انعطاف NoSQL ترکیب کنید.
انواع NoSQL
- مخازن مقادیر کلیدی: هر آیتم داخل دیتابیس، به عنوان یک جفت کلید (صفت) و مقدارش ذخیره شده است. مثالهای معروف شامل Riak، Voldemort و Redus میباشند. موارد استفاده از آن، معمولا برای ذخیره ترجیحات کاربر یا دادههای session است.
- مخازن بر پایه ستون: هر بلوک مخزن شامل دادههایی فقط از یک ستون میباشد، و به صورتی بهینهسازی شدهاند که کوئریها نسبت به دیتاستهای بزرگ مهمتر هستند. معروفترین موارد، Cassandra و HBase میباشند. سیستمهایی که به درخواستهای نوشتن (write) بزرگ مانند پلتفرمهای وبلاگنویسی نیاز دارند، ممکن است به این مورد نیاز داشته باشند.
- دیتابیسهای بر پایه سند، هر کلید را با یک ساختار داده پیچیده جفت میکنند، که به عنوان سند شناخته میشوند. اسناد مورد نظر میتوانند چندین جفت مقدار کلیدی موثر، جفتهای کلید - آرایه یا حتی اسناد تو در تو را شامل شوند. این دیتابیس، در قالب JSON میباشد. MongoDB معروفترین این دیتابیسها میباشد. برخی موارد استفاده از آنها شامل تجارت الکترونیک و پلتفرمهای وبلاگ نویسی است.
- دیتابیسهای نمودار: این موارد برای ذخیره کردن اطلاعاتی درباره انواع متنوعی از شبکهها استفاده میشوند. دیتابیسهای نمودار از edgeها و nodeها استفاده میکنند، تا دادهها را نمایش داده و ذخیره کنند. دو مثال معروف، Neo4J و HyperGraphDB هستند. موارد استفاده آن شامل شبکههای اجتماعی، تشخیص تقلب و... میباشد.
در این پست، بر روی دیتابیس بر پایه سند، یعنی MongoDB تمرکز خواهیم کرد.
اصطلاحات پایه
SQL: یک دیتابیس، چند جدول در خود دارد. یک جدول، چند ستون و ردیف دارد. تمام عناصر داخل یک ستون، نوع داده مشابهی را دارند.
NoSQL: یک دیتابیس، مجموعههایی را در خود دارد. یک مجموعه، اسنادی را داخل خود دارد. یک سند، چند فیلد دارد. دو سند در یک مجموعه، ممکن است که فیلدهای مشابه را نداشته باشند، و علت آن این است که ساختار سند معین نیست.
چرا، چه زمانی و در کجا از Node.js استفاده کنیم؟
چرا از NoSQL استفاده کنیم؟
آگنوستیک بودن نسبت به طرح (schema): دیتابیسهای NoSQL نسبت به طرح (schema)، آگنوستیک هستند. نیازی نیست که شما قبل از ذخیره دادههای خود در دیتابیسهای NoSQL، مقدار زیادی طراحی بر روی طرح خود انجام دهید. شما میتوانید شروع به کدنویسی کنید، و بدون این که بدانید دیتابیس چگونه به صورت داخلی دادهها را ذخیره کرده و بر روی آنها کار میکند، آنها را ذخیره کرده و پس بگیرید. اگر نیاز به عملکرد پیشرفتهای دارید، میتوانید قبل از فهرست کردن دادهها، طرح را به صورت دستی سفارشیسازی کنید.
مقیاسپذیری: دیتابیسهای SQL به صورت عمودی مقیاسپذیر هستند. یعنی این که افزایشی در بارگذاری، میتواند با افزایش CPU، RAM، هارد دیسک و... بر روی یک سرور مدیریت شود. دیتابیسهای NoSQL از مقیاسپذیری افقی پشتیبانی میکنند که اضافه کردن یا کاهش ظرفیت به صورت سریع، و بدون دستکاری سختافزار را ساده میسازد. این کار، هزینه و پیچیدگی به شدت زیاد مورد نیاز در هنگام مقیاسبندی RDBMSها را کاهش میدهد.
کارایی: مقیاسپذیری ممکن است، پس ارتقای کارایی نیز ممکن میشود. سرورهای Commodity که ارزانتر هستند، میتوانند در جهت افزایش کارایی اضافه شوند. همچنین کوئریبندی دیتابیس شامل انجام joinهای پیچیده بر روی جدول نمیباشد.
دسترسی جهانی: با تکثیر دادهها به صورت خودکار بر روی چندین سرور، مراکز داده و منابع ابری، دیتابیسهای NoSQL توزیع شده میتوانند تاخیر را کاهش داده و یک تجربه برنامه نامتناقص را تضمین کنند. یکی از منافع دیگر هم این است که نیازی به DBAهای تخصصی نیست؛ زیرا کار زیادی برای آنها وجود ندارد.
چه زمانی از NoSQL استفاده کنیم؟
پس از خواندن برتریهای بالا، ممکن است به فکر استفاده از MongoDB برای تمام پروژههای آینده خود افتاده باشید. اما صبر کنید! موارد خاصی هستند که دیتابیس NoSQL ممکن است بهتر باشد. NoSQL جایگزین RDBMS نخواهد شد!
- اگر قرار است با حجم زیادی از دادهها سر و کار داشته باشید، «Big Data» اصطلاحی است که بیشتر در این باره استفاده میشود، و ممکن است که شما به NoSQL نیاز داشته باشید. اساسا معنای آن، مدیریت دادههایی است که متدهای سنتی نمیتوانند مدیریت کنند.
- وبسایتهای شبکه اجتماعی (Facebook، Twitter)، وبسایتهای تجارت الکترونیک (Amazon، eBay)، وبسایتهای به اشتراک گذاری بلاگ / اخبار (times، medium) و... در حال ساخت حجم زیادی داده هستند، و تمام این دادهها باید تا زمانی که پلتفرم مورد نظر وجود دارد، در جایی ذخیره شوند.
- دادههایی که در نقاط بالا درباره آنها صحبت کردیم، به طور کلی دادههای نیمساختار، یا بدون ساختار میباشند.
- تمام این پلتفرمها، نه تنها برای ذخیره کردن دادهها مورد نیاز هستند، بلکه باید کارایی نوشتن / خواندن خوبی هم داشته باشند. یک برنامه چت را در نظر بگیرید، که هزاران پیام در حال ارسال و دریافت در هر ثانیه دارد. مقدار داده تولید شده زیاد است، بدون ساختار است و نیاز به کارایی بالایی دارد.
- شما بر روی پروژهای با زمان سریع برای فروش، و روشهای توسعه سریع کار میکنید. دیتابیسهای NoSQL در توسعه نرمافزار سریعتر هستند.
- اگر برنامه شما به شدت به تراکنشات تکیه میکند، پیشنهاد میشود که از RDBMS استفاده کنید؛ زیرا این نوع دیتابیسها، ثابتترین دیتابیسهای هستند، از تمامیت داده پشتیبانی میکنند و ویژگیهای ACID دارند. (نکته: در نسخه آخر MongoDB، ویژگیهای ACID پشتیبانی میشوند)
در کجا از MongoDB استفاده کنیم؟
- Frontend شما که شامل برنامه وبسایت و موبایل میباشد، مستقیما به MongoDB متصل نیست، اما به سرور شما متصل شده، که در عوض به دیتابیس متصل میشود.
- جعبه آبی از منطق سرور شما تشکیل میشود. MongoDB از پیادهسازی سرور مستقل است، پس میتوانید Node را با هر زبان دیگری مانند Python، Ruby و... جایگزین کنید.
- سرور مسئول این است که بررسی کند آیا کاربری که در قالب یک منبع معتبر در حال تلاش برای ویرایش دیتابیس است، حقوق کافی را برای انجام این کار دارد یا نه. پس اساسا محرمانه بودن، در دسترس بودن و تمامیت دیتابیس شما را نگهداری میکند.
Mongoose
Mongoose یک mapper مرتبط با آبجکت (Object Relational Mapper (ORM)) یا mapper داده آبجکت (Object Data mapper (ODM)) است. Mongoose در استفاده راحت و اتصال به MongoDB، بدون استفاده مستقیم از اِیپیآی Mongo کمک میکند.
این ابزار در تعریف یک طرح، و مدلسازی دادههای برنامه شما در خود کد کمک میکند. همچنین امکانات پرکاربری مانند تایپ کردن داخلی، اعتبارسنجی، ساخت کوئری و... را به همراه دارد.
مدلها و طرح
یک مدل، تمام دادهها در یک مجموعه را نمایش میدهد. وقتی که شما یک مدل را میسازید، Mongoose به طور خودکار مجموعهای از آن مدل را در دیتابیس شما میسازد.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const PokemonSchema = new Schema({
name: String,
type: String,
attack: Number,
defence: Number
});
module.exports = mongoose.model('Pokemon', PokemonSchema);
پس از این که Mongoose را به عنوان یک پکیج در پروژه خود نصب کردیم، باید آن را در فایل پیادهسازی خود require کنید. علت این کار، این است که تمام پکیجها در Node.js در محدوده خود اجرا میشوند.
پس از این که یک طرح (Schema) جدید ساختیم، باید این طرح را به Mongoose بدهیم، تا مدل خود را بسازد. به زبانی دیگر، برای استفاده از طرح باید یک نمونه از آن طرح را به نام مدل بسازیم.
Node متد پرکاربردی به نام module.exports را برای ما فراهم میکند، تا از این مدل با require کردن آن در فایلهای دیگر استفاده کنیم.
نتیجه گیری
حال باید آماده شروع کار با دیتابیسهای MongoDB NoSQL باشید. چند مورد که باید برای شما واضح باشند:
- NoSQL قرار نیست با SQL بر پایه RDBMS جایگزین شود.
- NoSQL بر خلاف SQL نیست.
- MongoDB عالی است، اما سعی نکنید که برنامه خود را در آن جای دهید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید