یک سیستم مدیریت پایگاه داده (database management system یا به اختصار DBMS) یک مجموعه از داده های به هم پیوسته و برنامه هایی برای دستیابی به این داده ها میباشد. هدف اصلی یک سیستم مدیریت پایگاه داده ایجاد روشی برای ذخیره سازی و دستیابی به اطلاعات دیتابیس به نحوی کارآمد و ساده می باشد. دسته بندی های متعددی برای این سیستم ارائه شده که در ادامه به بررسی یکی از این دسته بندی ها میپردازیم.
گفته شد هدف سیستم های مدیریت پایگاه داده ایجاد روشی برای ذخیره سازی و دستیابی به اطلاعات دیتابیس به نحوی کارآمد است. در سیستم های توزیع شده مفهومی با عنوان CAP مطرح میشود که مختصر شده ی عبارات partition tolerance, availability, consistency می باشد.
عبارت consistency اشاره به مفهوم همگام بودن و یکپارچگی دیتابیس ها دارد به این معنی که همه ی دیتابیس ها در سیستم توزیع شده برای یک آیتم تکراری یک مقدار واحد دارند.
در این سیستم ها Availability به این معنی است که برای هر عمل نوشتن یا خواندن از دیتابیس انتظار دریافت جواب در زمان معقول را داریم؛ به بیانی ساده تر سیستم همیشه آماده است.
و نهایتا partition tolerance به این مفهوم اشاره دارد که علی رغم وجود مشکل در بعضی قسمت ها، سیستم همچنان به فعالیت خودش را ادامه دهد.
آنچه واضح است هر سه جز نمیتوانند همزمان با هم برقرار باشند! برای درک بهتر این مطلب در نظر بگیرید که هیچ سیستم توزیع شده ای از رخ دادن خطا در امان نیست، لذا سعی بر این است که partition tolerance را تا حد ممکن برقرار سازیم، در حضور این جز، تنها یکی از دو مفهوم availability یا consistency می توانند برقرار باشند[چرا؟] فرض کنید تاکید بر روی برقراری consistency باشد، در این صورت وقتی خطایی در بخشی از سیستم رخ می دهد، در همان لحظه تضمینی برای یکسان و یکپارچه بودن اطلاعات وجود ندارد و به همین دلیل سیستم در پاسخ به عملیاتی که انتظار می رود انجام دهد، تولید خطا میکند و یا نمیتواند در زمان معقولی پاسخ دهد، لذا availability زیر سوال میرود. از طرف دیگر فرض کنید تاکید بر روی availability باشد، در این صورت سیستم در پاسخ به عملیاتی که میخواهد رویش انجام شود آخرین ورژن از داده ای را که دارد استفاده میکند بدون اینکه تضمینی برای consistency آن وجود داشته باشد! در حالتی که partition tolerance برقرار نباشد، هر دو شرط availability و consistency را میتوانیم با هم داشته باشیم.
به همین ترتیب طراحان سیستم های مدیریت پایگاه داده، دسته بندی ها و طراحی های مختلفی برای پایگاه داده شکل داده اند که هر کدام از آنها، در بخش هایی از این سه مفهوم قوت دارند.
به صورت کلی در این دسته بندی، دیتابیس ها به چهار دسته ی column-based، document-based، key-value و graph-based تقسیم میشوند که در ادامه هر کدام را به صورت دقیق تر بررسی میکنیم.
دیتابیس های key-value: دیتابیس های غیر رابطه ای هستند که از تعدادی کلید و مقادیر برای آن کلید ها ساخته شده اند (شیوه ذخیره سازی شبیه به مفهوم دیکشنری است)، این دیتابیس ها در جایی که منطق کار ساده باشد و در حجم کم ذخیره سازی، سرعت زیاد مدنظر باشد استفاده میشوند. Redis نمونه ای از این دسته دیتابیس می باشد.
اگر هداف پیچیده تری داریم، شاید بهتر باشد نوع دیگری از دیتابیس ها برای مثال document-based ها استفاده کنیم.
دیتابیس های document-based: به این مدل دیتابیس اصطلاحا schema-less گفته میشود، بدین مفهوم که مقید به طرح خاص از پیش تعیین شده ای نیستند و به صورت داینامیک و برحسب نیاز میتوان ساختارشان را تغییر داد. از این دیتابیس ها برای ذخیره و کویری زدن به دیتای JSON استفاده میشود، این دسته از دیتابیس ها SQL را پشتیبانی میکنند و قدرت زیادی در indexing دارند که این مشخصات، راه های متنوعی جهت دستیابی، انتقال و تحلیل داده ها ارائه میدهد. از این دسته در کاربردهایی که schema تغییرات زیادی دارد استفاده میشود، برای مثال در کاربرد هایی چون مدیریت محتوا، هر محتوا ممکن است تعداد زیادی صفت داشته باشد که این صفات متمایز از صفات محتوای دیگر باشند، در نتیجه هر محتوا را میتوان به عنوان یک document مجزا دسته بندی کرد، به عنوان مثال های دیگر از کاربردهای این دسته دیتابیس ها میتوان به موتور های جستجو، ابزار های لاگ گیری و… اشاره کرد. mongoDB و elasticsearch نمونه هایی از این دسته می باشند.
دیتابیس های column-based: در این مدل از دیتابیس ها به جای دسته بندی دیتابیس به صورت سطری، دید ستونی به داد ها داریم که این منجر به دستیابی راحت تر و سریعتر به داده هایی که مشخصه خاصی دارند میشود - نسبت به حالتی که مجبور به بررسی تعداد زیادی از سطرها باشیم. رویکرد سطری برای مواقعی که نیاز به دستیابی به کل اطلاعات و فیلدهای یک رکورد داریم مفید است درحالیکه برای دستیابی به تعدادی فیلد که دارای مشخصه خاص هستند رویکرد ستونی مفیدتر واقع میشود (به بیانی دیگر برای عملی چون * SELECT هزینه زیادی پرداخته میشود ولی برای عمل WHERE هزینه به مراتب کمتر میشود). از این دیتابیس ها در مواقعی که پردازش زیادی روی داده انجام میدهیم و استنتاج داده برایمان مهم تر است استفاده میکنیم، به این دلیل که هم دریافت، و هم ذخیره سازی داده(به دلیل عملیات indexing) کار مشکل و زمان بری می باشد.
جدول زیر را در نظر بگیرید:
رویکرد سطری برای ذخیره داده های این جدول به شکل زیر خواهد بود:
در حالی که رویکرد ستونی به شکل زیر خواهد شد:
دیتابیس های graph-based: این دیتابیس ها به رابطه ی میان داده ها، به اندازه ی خود داده ها، اهمیت میدهد. در حالیکه بقیه ی دیتابیس ها برای ارتباط میان داده هایشان از عملیات پرهزینه ای چون JOIN استفاده میکنند، در این دسته بندی ارتباط میان داده ها نیز همگام با خود داده ها ذخیره میشود و برای کوئری های پیچیده و ذخیره داده هایی که ارتباطات گسترده میانشان وجود دارد انتخاب بسیار مناسبی هستند. در این نوع دیتابیس، موجودیت ها تشکیل رئوس گراف و روابط میان موجودیت ها تشکیل یال ها را میدهد که این یال ها می تواند جهت دار یا بدون جهت باشد. مثال هایی از استفاده از این دسته دیتابیس در شبکه های اجتماعی، نقشه های جغرافیایی و… می باشد. Neo4j نمونه ای از این دیتابیس است.