این نوشته ی من مرتبط با موضوع پست قبلی یعنی بانکهای اطلاعاتی NoSQL هست و همونطوری که گفته بودم درباره ی mongodb می خوام بنویسم. انتخاب من از بین پروژه های NoSQL، مونگو دی بی هست. فکر می کنم mongodb خوراک توسعه دهنده های وب باشه. مخصوصا توسعه دهنده های PHP. البته منظورم این نیست که مونگو فقط تعامل خوبی با زبان های تحت وب داره! این بانک اطلاعاتی قدرتمند بسیاری از زبان های برنامه نویسی (که لیستی از اون ها رو می تونید اینجا مشاهده کنید) رو پشتیبانی می کنه. فقط بخاطر اینکه خودم با PHP راحت ترم و اینکه این بانک اطلاعاتی NoSQL واقعا  می تونه انتخاب خوبی برای توسعه دهنده های وب، بلاخص PHP کاران باشه، این حرف رو زدم. اصلا همه ی این طفره رویهای بی مورد بخاطر این بود تا به اینجا برسم که توضیحاتم درباره ی mongodb و ویژگی های اون رو می خوام با عنوان پنج چیزی که هر توسعه دهنده پی اچ پی باید درمورد mongodb  بداند، شروع کنم.

قبل از شروع لازم می دونم تا تعریف کلاسیکی از این بانک اطلاعاتی در قالب دو جمله ارائه بدم؛

تعریف mongodb

بانک اطلاعاتی ای سندگرا که با اهدافی همچون مقیاس پذیری در قبال حجم عظیمی از داده ها و توسعه ی سریع ایجاد شد. طراحی و توسعه ی این پروژه ی متن باز،  توسط شرکت ۱۰gen انجام شده است.

پنج موضوع درباره ی این پروژه متن باز که هر توسعه دهنده ی پی اچ پی (وبی)  باید بداند:

۱) mongodb، یک سرور مستقل

همچون mysql یا هر PostgreSQL دیگری، مونگو دی بی روی پُرت ها جهت دریافت ارتباط های ورودی listen می کند. این بانک اطلاعاتی تمامی ابزار پرس و جو مثل ایجاد، درج، حذف و بروزرسانی را در اختیار شما قرار می دهد. به عبارت دیگر  هر عملی که از یک بانک اطلاعاتی انتظار می رود، mongodb قادر به انجام آن می باشد، منظور همون پروسه ایجاد ارتباط، انجام انواع عملیات و در نهایت قطع ارتباط هست.

۲) خداحافظی با سطر ها و جدول ها

از این پس بجای اینکه داده هاتون رو در جدولها و سطرها ذخیره کنید (همونطورکه اینکار رو در RDBMSها می کردید)، عمل ذخیره سازی شما در قالب اسناد انجام خواهد شد. به عنوان مثال رکوردی که اطلاعات مربوط به یک مقاله را در خود جای داده و دارای فیلدهایی همچون عنوان مقاله، نویسنده های مقاله، محتوا (body) و برچسب های مربوطه می باشد را در نظر بگیرید، شیوه ی دخیره سازی این داده در mongodb بهمراه درایور php به شکل زیر خواهد بود:

 

<?php

 array(

 'title' => 'Hello World',

 'authors' => array('John', 'Sally', 'Jim'),

 'body' => 'Hello world',

 'tags' => array('tag1', 'tag2', 'tag3')

 );

 ?>
									

نکته ی قابل توجهی که در مثال بالا دیده میشود این است که این رکورد که در قالب یک آرایه است بصورت یک سند ذخیره شده و مشاهده می کنید که هر فیلدی از آن قادر به پذیرفتن مقادیر چندتایی می باشد و موضوع مهم دیگر اینکه نیازی به نرمالسازی داده ها و نهایتا تجزیه یک جدول به چندین جدول مجزا نیست چراکه در mongodb اصلا جدولی در کار نیست تا با مشکلاتی نظیر افزونگی داده ها(redundancy)، مقادیر تهی(null values) و… مواجه شویم. حالا بجای اینکه ذخیره سازی همین اسناد ما به درون جداول صورت بگیرد، مجموعه یا collectionهایی مورد استفاده قرار می گیرد که ممکن است تصور و حدس همه ما از این کالکشن ها، لیستی از اسناد باشد. خوب اگر حدس شما هم اینچنین بوده، که ایول! درست حدس زدید!

۳) mongodb، با اسکیمایی (schema) کاملا متفاوت

طراحی اسکیما در مونگودی بی بسیار متفاوت از طراحی اسکیما در بانکهای اطلاعاتی رابطه ای است، طراحی اسکیما بعنوان مهمترین و اولین قدم در راستای ایجاد برنامه ی کاربردی مورد نظرمان یک مسئله اجتناب ناپذیر است. در این بانک اطلاعاتی هم طراحی اسکیما، نه تنها تابعی از داده هایی است که قرار است مدل شوند بلکه به use caseهای ما نیز وابسته است. عادت کردن به این مدل متفاوت برای کسانی که مدت طولانی با بانکهای اطلاعاتی رابطه ای و نظام مند سروکار داشته اند، شاید کمی دشوار باشد.

در mongodb بجای اینکه رکوردهای موجود در تاپل های شما در ستون های موردنظرتان ذخیره شوند، هر رکورد در یک سند ذخیره خواهد شد. تقریبا چیزی شبیه به قرارگیری یک فایل در سیستم فایل را درنظر بگیرید. حال همین سند هر داده ای را که بخواهد، قادر به ذخیره سازی آن است، پس می بینیم که مونگو نمی تواند از اسکیمایی مشابه اسکیمای بانک های اطلاعاتی رابطه ای پیروی کند.

باتوجه به ویژگی سندگرا بودن مونگودی بی و مطالبی که درباره ی ذخیره سازی داده ها در قالب آرایه که در موضوع شماره ۲ مورد بحث قرار گرفت، شاید سوالی در ذهنمان پیش بیاید که آیا ساختار اسناد باید همیشه در قالب آرایه ها به همین شکل، ساده و احمقانه باشد؟ خیر، همانطور که می دانید با استفاده از تکنیکی بنام شی گرایی می توانید همان تعریف یک مقاله به همراه تمامی فیلدهایش را بروی یک سند تنها با فراخوانی یک شی ای از آن به درون بانک اطلاعاتی تان انجام دهید. منظور این که بهره گیری از قابلیت شی گرایی براحتی امکان پذیر است. توضیحات کامل چگونگی این عملیات را در پست های بعدی خدمتتون خواهم گفت. گفتن این مطالب کوتاه و ناقص صرفا بخاطر این هست که شمه ای از قابلیت های این بانک اطلاعاتی رو برای شما نمایان کنم.

سوال دیگری که برایمان پیش می آید درمورد تعریف انواع داده ای در این بانک اطلاعاتی است، تعریف داده ها در mongodb بشکل نوع داده ای اجباری سیستم (type coercion system) می باشد. در این نوع تعریف داده ای، شما قرار نیست در کوئری مونگو نوع داده ای خودتان را مشخص کنید، این کار توسط driver یا همان زبانی که قرار است با بانک اطلاعاتی شما تعامل داشته باشد، انجام می شود.

نکته: نوع داده ای اجباری سیستم، تکنیکی است که در آن عمل تبدیل نوع توسط کامپیوتر و بدون دخالت کاربر انجام می شود. این کار بخاطر سازگار کردن داده ها با کد اجرایی موردنظر صورت می گیرد. بعنوان مثال زمانی که داده ی ورودی ما از نوع شناور(float) است و ما نیاز داریم تا خروجی موردنظرمان از نوع صحیح(integer) باشد، این تبدیل نوع انجام می پذیرد.

۴) عدم نیاز شما به یادگیری سایر زبان های پرس و جو

در mongodb نیازی به درگیری با عملیاتی همچون ایجاد لایه های انتزاعی و یا استفاده از لایه ی پیچیده ORM جهت نگاشت به زبانهای شی گرایی نیست و می تونید اونها رو کاملا کنار بگذارید. از طرفی نیاز شما به استفاده از زبان کوئری نویسی مونگو بویژه زمانی که از درایور php این بانک اطلاعاتی استفاده می کنید ، بطور قابل توجهی کاهش پیدا می کند، به این شکل که در بسیاری از موارد شما اطلاعات خود را در قالب آرایه ی php وارد بانک اطلاعاتی مونگو می کنید و آرایه ای از اسناد را تحت عنوان مقدار بازگشتی دریافت می کنید. اما در مورد کوئری های پیچیده هم باید بگم که اگر می خواهید کوئری های بسیار پیچیده ای همچون عملیات map-reduced را اجرا کنید، می توانید از توابع javascript درون مونگودی بی استفاده کنید، اسکریپت های نوشته ی شما توسط موتور داخلی جاوا اسکریپت در مونگو اجرا خواهند شد.

۵) php و mongodb

درحال حاضر php بطور کامل و قدرتمندانه ای از mongodb پشتیبانی می کند، درایور مونگو برای زبان پی اچ پی بصورت اکستنشن PECL موجود و نصب آن بسادگی انجام می شود. این extension پایدار این امکان رو به شما می دهد تا اکثر عملیات معمول کوئری نویسی را بواسطه ی دسترسی به بانک اطلاعاتی mongodb انجام بدید.

به نظرم قبل از شروع کار با مونگو دی بی بهتر بود که این مطالب گفته بشه تا دید بهتر و درک جامع تری از این پروژه متن باز و NoSQL پیدا کنیم، که البته امیدوارم مفید واقع شده باشه! سعی می کنم بزودی پست بعدی رو درباره نصب و راه اندازی mongodb بنویسم تا هرچه زودتر از این حالت تشریفاتی و کلاسیک خارج بشیم.

منابع ۱ ۲

برچسب ها: , , شنبه ,۲ مهر , ۱۳۹۰

یک دیدگاه

  1. محمد می گوید:

    خیلی عالی بود

  • RSS
  • Delicious
  • Digg
  • identica
  • Twitter
  • Linkedin