محمدعلی دیبایی

بی حرکت موندن راه موفقیت نیست.

 

 

بعد از این که این داستان کوتاه رو خوندم نگاهم به مسیر کمی متفاوت تر شد. پیشنهاد میکنم اول داستان رو بخونید:

 

داستان اسکندر

اسکندر روزی به یکی از شهرهای ایران (احتمالاً در حوالی خراسان) حمله می کند، با کمال تعجب مشاهده می کند که دروازه آن شهر باز می باشد و با این که خبر آمدن او به شهر پیچیده بود، مردم زندگی عادی خود را ادامه می دادند. باعث حیرت اسکندر بود زیرا در هر شهری که صدای سم اسبان لشکر او به گوش می رسید عده ای از مردم آن شهر از وحشت بیهوش می شدند و بقیه به خانه ها و دکان ها پناه می بردند، ولی این جا زندگی عادی جریان داشت. اسکندر از فرط عصبانیت شمشیر خود را کشیده و زیر گردن یکی از مردان شهر می گذارد و می گوید: من اسکندر هستم!

مرد با خونسردی جواب می دهد: من هم ابن عباس هستم!

اسکندر با خشم فریاد می زند: من اسکندر مقدونی هستم، کسی که شهرها را به آتش کشیده، چرا از من نمی ترسی؟

مرد جواب می دهد: من فقط از یکی می ترسم و او خداوند است.

اسکندر به ناچار از مرد می پرسد: پادشاه شما کیست؟

مرد می گوید: ما پادشاه نداریم!

اسکندر با خشم می پرسد: رهبرتان، بزرگتان؟!

مرد می گوید: ما فقط یک ریش سفید داریم و او در آن طرف شهر زندگی می کند.

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

اسکندر برای اولین بار عرق ترس بر بدنش می نشیند، با خود فکر می کند این مردم حقیقی اند یا اشباح هستند؟ سپس به جایگاه ریش سفید ده می رسد و می بیند پیرمردی موی سفید و لاغر در چادری نشسته و عده ای به دور او جمع هستند. اسکندر جلو می رود و می گوید: تو بزرگ و ریش سفید این مردمی؟

پیرمرد می گوید: آری، من خدمتگزار این مردم هستم!

اسکندر می گوید: اگر بخواهم تو را بکشم، چه می کنی؟

پیرمرد آرام و خونسرد به او نگاه کرده و می گوید: خب بکش، خواست خداوند بر این است که به دست تو کشته شوم!

اسکندر می گوید: پس تو را نمی کشم تا به خدایت ثابت کنم عمر تو در دست من است.

پیرمرد می گوید: باز هم خواست خداست که بمانم و بارگناهم در این دنیا افزون گردد.

اسکندر سردرگم و متحیر می گوید: ای پیرمرد من تو را نمی کشم،‌ ولی شرطی دارم.

پیرمرد می گوید: اگر می خواهی مرا بکش، ولی شرط تو را نمی پذیرم.

اسکندر- ناچار و کلافه- می گوید: خیلی خوب، دو سوال دارم، جواب مرا بده و من از این جا می روم. پیرمرد می گوید: بپرس!

اسکندر می پرسد: چرا جلوی هر خانه یک چاله شبیه به قبر است؟ علت آن چیست؟

پیرمرد می گوید : علتش آن است که هر صبح وقتی هر یک از ما که از خانه بیرون می آییم، به خود می گوییم: فلانی! عاقبت جای تو در زیرخاک خواهد بود، مراقب باش! مال مردم را نخوری و به ناموس مردم تعدی نکنی و این درس بزرگی برای هر روز ما می باشد!

اسکندر می پرسد: چرا روی هر سنگ قبر نوشته ده دقیقه، فلانی یک ساعت، یک ماه، زندگی کرد و مرد؟!

پیرمرد جواب می دهد: وقتی زمان مرگ هر یک از اهالی فرا می رسد، به کنار بستر او می رویم و خوب می دانیم که در واپسین دم حیات، پرده هایی از جلوی چشم انسان برداشته می شود و او دیگر در شرایط دروغ گفتن و امثال آن نیست! از او چند سوال می کنیم:

–        چه علمی آموختی؟ و چقدر آموختن آن به طول انجامید؟

–        چه هنری آموختی؟ و چقدر برای آن عمر صرف کردی؟

–        برای بهبود معاش و زندگی مردم چقدر تلاش کردی؟ و چقدر برای آن وقت گذاشتی؟

او که در حال احتضار است، مثلاً می گوید: در تمام عمرم به مدت یک ماه هر روز نیم ساعت علم آموختم، یا برای یادگیری هنر یک هفته هر روز یک ساعت تلاش کردم. یا اگر خیر و خوبی کردم، همه در جمع مردم بود و از سر ریا و خودنمایی! ولی یک شب مقداری نان برای همسایه ام که می دانستم گرسنه است خریدم، پنهانی به در خانه اش رفتم و خورجین نان را پشت در نهادم و برگشتم!

بعد از آن که آن شخص می مرد، مدت زمانی را که به آموختن علم پرداخته محاسبه کرده و روی سنگ قبرش حک می کنیم. یا مدت زمانی را که برای آموختن هنر صرف کرده محاسبه و روی سنگ قبرش حک می کنیم و یا برای بهبود زندگی مردم تلاشی را که به انجام رسانده، زمان آن را حساب کرده و مثلاً حک می کنیم: ابن یوسف یک ساعت زندگی کرد و مرد. یعنی عمر مفید ابن یوسف یک ساعت بود!

بدین سان، زندگی ما زمانی نام حقیقی برخود می گیرد که بر سه بستر علم، هنر و مردم مصرف شده باشد که باقی همه خسران و ضرر است و نام زندگی برآن نتوان نهاد!

اسکندر با حیرت و شگفتی شمشیر در نیام کشیده و به لشکر خود دستور می دهد: هیچ گونه تعدی به مردم نکنند و به پیرمرد احترام می گذارد و شرمناک و متحیر از آن شهر بیرون می رود!

 

************************************************************************************************************

 

یه زمانی تو زندگی هممون هست که یکم میایم عقب تر وایمیستیم و به جایی که الان هستیم نگاه میکنیم تا ببینیم کجای کاریم. هرکس خودش میدونه تو زندگی چه کارهایی انجام داده، چه چیزایی یادگرفته و چه فرصت هایی برای یادگیری رو از دست داده. با همین تصویر از زندگی خودمونِ که می تونیم برای آینده مون تصمیم بگیریم، بهترشیم یا بدترشیم. مطمئاً کسی دلش نمی خواد بدتر بشه ولی همین که واسه آینده ت برنامه ریزی نکنی (برنامه ریزی کنی ولی عمل نکنی )، کلا دست رو دست بزاری هیچ کاری نکنی، به وضعیت حالِت بی تفاوت باشی و صرفاً به نفس کشیدن ادامه بدی، همین یعنی بدتر شدن.

شاید به خودت بگی ” من الان وضعیتم از خیلی از هم سن و سالای خودم بهتره “، آره راست میگی وضعیت الانت شاید از خیلی ها بهتر باشه ولی این رو هم در نظر بگیر خیلی های دیگه هم هستن که وضعیتشون بهتر از تو و دارن روز به روز رشد میکنن.  منظورم از این حرف این نیست که خودت رو با دیگران مقایسه کنی، نه! تنها کسی باید خودت رو باهاش مقایسه کنی خودتی، دیروز خودت، یک هفته پیش خودت، یک سال پیش خودت و … ولی میتونی دیگران رو ببینی و از موفقیت هاشون الگو بگیری. کپی کردن همه جا بد نیست!

الگوت کیه؟
کدوم ورزشکار رو دوست داری؟
کدوم بازیگر رو دوست داری؟
کدوم نویسنده رو دوست داری؟

مطمئاً کسی هست که دوست داری مثل اون باشی. ببین اون چجوری به این جایی که الان هست رسیده، اگه اون به اینجا رسیده چرا تو نتونی؟ همون کار ها رو انجام بده اما به روش خودت و سعی کن تو انجام اون کار بهترین باشی و هیچ وقت به متوسط قانع نشی.

نمی تونم، نمیشه، اون حتما پول داشته، مسلماٌ پارتی داشته، از اول همین طوری بوده و …

اینا همه ش یسری بهانه س که باهاش خودت رو توجیه کنی و به حرکت ادامه ندی چون میدونی این راه سخته و اگه شروع به حرکت کنی وسطای راه خسته میشی. ولی خب مگه میشه بدون حرکت و زحمت به جایی هم رسید!

مطمئنم الان تو دلت داری میگی اینا همه شعاره و عملی شدنی نیست و بقولی، صدای دهل از دور خوشه! ولی حداقل یکم روش فکر کن و تو خیالت شروع کن به حرکت کردن و اون موفقیت مورد نظرت رو لمس کن. اونموقع س که میفهمی هدفت ارزش حرکت کردن رو داره.

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

مُردی ولی هنوز جسمت دفن نشده.

SQL یا NoSQL، مسئله این است… – بخش دوم

SQL یا NoSQL، مسئله این است…

مطالعه مختصری بر پایگاه داده هایNoSQL
بخش دوم

 

 

غیر نرمالسازی (Demoralization)

 

یکی از حقه هایی که در دیتابیس های رابطه ای برای کاهش استفاده از JOIN میتواند بکار برد، ” غیر نرماسازی ” می باشد. مثلا در مثال قبل ، یک غیرنرمالسازی می تواند همان قسمتی باشد که شماره تلفن های اضافه را در یک سطر جدا ذخیره کردیم. این کار استفاده از JOIN را کاهش می دهد اما از طرف دیگر باید در آپدیت تمامی سطر های مرتبط را کنترل و بروز کنیم.

 

دیگر نیازی به نرمالسازی نیست

 

مونگو این مشکلات را با حذف نرمالسازی از بین برده است. در مونگو نیاز نیست که اطلاعات در جدول قرار بگیرند ( 1nf ) و شکل قرارگیری اطلاعات بصورت سند می باشد. در دیتابیس های رابطه ای در هر سلول تنها یک داده می تواند قرار بگیرد اما در مونگو این محدودیت وجود ندارد و اگر لازم داشته باشید می توانید یه آرایه از اطلاعات را در سند خود ذخیره کنید.  این امکان و امکانات دیگر مونگو می تواند باعث طراحی راحت تر و بدون محدودیت برای یک طراح نرم افزار باشد. اما از طرفی طراحی شما این نوع دیتابیس در قیاس با دیتابیس های رابطه ای، کمی دشوار تر و غیر قابل پیش بینی تر می باشد.

 

فرمت سند های مونگو

 

قبل از اینکه بگوییم چرا و چگونه باید از انواع آرایه در یک سند مونگو استفاده کنیم، بهتر است تعریف مختصری از یک سند مونگو داشته باشیم. سند ها در مونگو طبق فرمت JSON (Java Script Object Notation) طراحی شدخ اند، اما در اصل بصورت یک BSON  (Binary JSON) ذخیره می شوند  بصورتی که مقادیر یکی از انواع ذیل می باشند :

-انواع اولیه JSON ( مانند String، number و… )
-انواع اولیه BSON ( مانند datetime، ObjectId و … )
-آرایه ای از مقادیر
-اشیا متشکل از زوج های کلید-مقدار ( key-value )
– تهی

بعنوان نمونه مثال دفترچه تلفن را در نظر بگیرید، ذخیره سازی یک مخاطب بصورت سند به شکل زیر می باشد :

همانطور که در مثال بالا می بینید توانستیم تمام اطلاعات مخاطب را بدون نرمالسازی ذخیره کنیم. در نهایت می توان اطلاعات فوق را بصورت نرمالسازی شده و از طریق  _id ارجاع داد :

در ادامه نکات مثبت و منفی ارجاع دادن و جایگذاری کردن را بررسی خواهیم نمود.

 

جایگذاری برای قرارگیری اطلاعات در یک مکان

 

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

مونگو محدودیت هایی نیز دارد. در مونگو نمی توان از عمل JOIN استفاده نمود و برای دستیابی به اطلاعاتی که بصورت ارجاع ذخیره شده اند باید کاری نظیر کد زیر انجام داد :

اگر از چنین راهی برای ذخیره استفاده کنیم به مشکلی بدتر از استفاده عمل JOIN بر می خوریم. در اینجا علاوه بر این که مجبور به چندین جستجو در دیتابیس هستیم، از آنجایی که برنامه مجبور است دو بار در دیتابیس رفت و آمد کند، دچار تاخیر نیز می شود. بنابرین اگر نرم افزار شما به یک داده بصورت مداوم یا زیاد نیاز دارد بهتر است که داده  خود را بصورت جایگذاری دخیره نمایید.

 

جایگذاری برای یکپارچگی و انزوا داده ها

 

از قابلیت هایی که باعث می شود جایگذاری را بر ارجاع دادن ترجیح دهیم، اعمال یکپارچگی و انزوا در داده ها می باشد.( یادآوری1) برای آپدیت یک داده باید مطمئن شویم که داده با موفقیت آپدیت شده است یا خیر و موفقیت جزیی ( بخشی از داده آپدیت شده و بخشی بدون تغییر باقی مانده) مشکلی است که نباید در یک دیتابیس اتفاق بیفتد و همچنین در هنگام حذف یک داده، تمامی اطلاعات مربوط به آن داده باید همزمان حذف شوند. زیرا اگر بخشی حذف و بخشی دیگر باقی بماند ممکن است قبل از حذف بخش بعدی، آن بخش از سمت دیگری خوانده شود که این خود باعث بروز مشکل می شود. در دیتابیس های رابطه ای برای حل این مشکلات از ترکانش های چند درخواستی (Multi-statement transactions) استفاده می کنند. مثلا اگر بخواهیم یک مخاطب را در مثال قبل حذف کنیم می توانیم بصورت زیر عمل کنیم :

همانطور که می بینید کلیه اطلاعات مربوط به مخاطب در یک دستور و بطور همزمان حذف می شود. مشکلی که در مونگو وجود دارد این است که اعمال دستور های چند درخواستی در آن طراحی نشده است. مثلا اگر بخواهیم در مونگو نرماسازی شده خودمان دقیقا عمل بالا را انجام دهیم بدین صورت انجام می گیرد:

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

 

چرا مونگو از تراکنش های چند دستوری استفاده نمی کند ؟

 

مونگو از اول به نحوی طراحی شد تا بتواند برای چندین سرور توزیع شود. دو مشکل اساسی و مهم در رابطه با دیتابیس هایی که روی چند سرور توزیع شده اند، عملیات JOIN توزیع یافته و تراکنش های توزیع یافته هستند.( به معنی گردآوری داده از دیتابیسی که روی چند سرور توزیع شده است. هر دو عملیات بصورت پیچیده اجرا می شوند و بازده ضعیفی دارند و حتی ممکن است باعث از کار افتادن موقت سرور ( down time ) نیز شوند. مونگو برای حل این مشکلی بطور کل این دو عملیات را حذف کرده و از این رو بصورت اتوماتیک می تواند خود را بر روی چند سرور توزیع کند و بدون کندی اطلاعات مود نیاز را در اختیار کاربر قرار دهد.

برای برطرف کردن این مشکل می توانیم بجای ارجاع دادن، از جایگذاری کردن استفاده کنیم و تنها با یک دستور عمل مورد نیاز را انجام دهیم :

ارجاع دادن برای انعطاف پذیری

 

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

این روش برای ذخیره سازی و نمایش پست ها و کامنت ها مناسب می باشد. حال فرض کنید می خواهیم امکانی را اضافه کنیم که تمام کامنت های یک فرد مورد نظر را نمایش دهیم، دستور مورد نیاز برای این کار بصورت زیر می باشد :

نتیجه ای که از دستور فوق حاصل می شود بصورت زیر می باشد :

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

حال از روش ارجاع دادن برای ذخیره اطلاعات استفاده می کنیم ( نرمالسازی شده شمای قبلی ):

دستور لازم برای درخواست قبل به شکل زیر است :

این دستور دقیقا کامنت هایی فرد مورد نظری را که درخواست شده است نمایش می دهد.

 

ارجاع دادن وقتی که تعداد داده ها در روابط، بسیار هستند

 

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

  • هر چقدر مقدار سند بزرگتر باشد، میزان رم ( RAM ) بیشتری مصرف می کند.
  • سند هایی که به میزانشان اضافه می شود، نهایتا باید در فضای بزرگتری کپی بشوند.
  • سندهای مونگو محدودیت سایز 16 مگابایتی دارند.

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

مشکل افزایش پی در پی محتوایات یک سند، نهایتا منجر به کپی شدن سند در یک فضای بزرگتر می شود. این موضوع باعث می شود تا عمل آپدیت به صورت چشمگیری کند انجام شود.

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

روابط چند به چند

 

از دیگر دلایل استفاده از ارجاع دادن ، روابط چند به چند می باشند. یک فروشگاه اینترنتی را در نظر بگیرید. هر محصول می تواند دارای چند گروه باشد و هر گروه می تواند دارای چندین محصول باشد. یک روش برای ذخیره سازی چنین اطلاعاتی استفاده از نرمالسازی مانند JOIN می باشد:

چنین رویکردی یک مدل نرمالسازی شده بسیار مرتب به ما می دهد اما هنگام بازیابی اطلاعات مجبور به استفاده از دستورات پیچیده و طولانی هستیم. (مثلا نمایش یک گروه همراه با محصولاتش )

روش دیگر استفاده از جایگذاری می باشد:

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

یک روش دیگر که در روابط چند به چند استفاده می شود، اصطلاحا ” سازش ” (compromise)  نامیده می شود. این روش به این گونه است که از ارجاع و جایگذاری باهم استفاده می شود. بجای اینکه محصول و گروه را در دو سند مختلف ذخیره کنیم ، لیستی از _id های گروه ها را در سند محصول ذخیره می کنیم :

دستور نویسی در این رویکردی کمی پیچیده تر از حالت قبل می شود ولی دیگر نباید نگران آپدیت چندین سند مختلف باشیم.

 

 

جمع بندی

 

امروزه طراحی شما در مونگو بیشتر یک هنر است تا یک علم. اولین تصمیمی که باید در شروع طراحی شما بگیرید این است که برای روابط یک به چند خود از جایگذاری کردن استفاده کنید و یا بهتر است از روش ارجاع دادن که یک رویکرد رابطه ای است استفاده کنید.

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

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

پایان بخش دوم

SQL یا NoSQL، مسئله این است… – بخش اول

 

SQL یا NoSQL، مسئله این است…

مطالعه مختصری بر پایگاه داده هایNoSQL
بخش اول

 

چکیده :

پایگاه داده های NoSQL نقش بسیار مهمی در استفاده از  ” داده های بزرگ ” (Big Data) برای ذخیره و بازیابی مقادیر این اطلاعات ایفا میکنند. سیستم های مدیریت پایگاه داده رابطه ای (Relational Database Management Systems)  از تئوری ACID برای انسجام داه ها استفاده میکنند در حالی که پایگاه داده های NoSQL از رویکرد BASE استفاده میکنند.
RDBMS ها تنها بصورت عمودی (Vertically) افزایش می یابند، اما پایگاه داده های NoSQL هم بصورت عمودی و هم بصورت افقی ( بخش کردن ) افزایش می یابند.
انواع پایگاه داده های NoSQL عبارتند از : سند گرا (Document oriented)، زوجهای کلید-مقدار (Key-Value pairs) ، ستون گرا (Column oriented) و گراف . مدلسازی داده ها برای پایگاه داده های سندگرا مانند مدلسازی داده ها برای پایگاه داده های RDBMS  در بخش مدلسازی مفهمومی و منطقی (Conceptual and Logical modeling phases) است. اگرچه بعضی از موارد متفاوت هستند. بعنوان مثال در RDBMS چیزی که با عنوان ” کلید خارجی (Foreign key) ”  یاد می شود، در پایگاه داده های سنگرا NoSQL با عنوان ” مرجع (Reference) ” خطاب می شود.

 

پایگاه داده های NoSQL :

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

 

فصل اول : جایگذاری کردن یا ارجاع دادن

اولین کاری که برای ساخت یک نرم افزار انجام میدهیم، ساخت مدل داده های آن است. در پایگاه داده های رابطه ای مانند MySQL این مرحله بدین صورت است که داده ها را نرمالسازی میکنند و در جداول، داده های اضافه و تکرارشونده حذف میشوند. درحالی که در مونگو دی بی (Mongo DB)  که یک پایگاه داده NoSQL است، داده ها در یک ساختار ” سندی ” قرار میگرند و نه یک ” جدول ” . برای نمونه جداول رابطه ای در تقاطع هر سطر و ستون ( سلول ها ) تنها میتوانند یک مقدار اسکالر قرار دهند. اما مونگو با استفاده از” بیسان ” (BSON) میتواند داده های پیچیده را با استفاده از آرایه ها پشتیبانی کند .( هر کدام از آرایه ها خود نیز میتوانند شامل آرایه باشند)
در ادامه به این مسئله میپردازیم که آیا بهتر است اطلاعات را بصورت جایگذاری ( embed  )  ذخیره کنیم یا آنها را با یک آی دی به یک دیگر ارجاع ( reference ) دهیم. همچنین روش مقایسه کارایی ، انعطاف پذیری و پیچیدگی آنها را نیز بررسی میکنیم.

 

مدلسازی رابطه ای داده و نرمالسازی

قبل از پرداختن به این که چگونه بین ارجاع دادن و جایگذاری کردن کدام را انتخاب کنیم، نگا ه کوتاهی به چگونگی مدل سازی پایگاه داده های رابطه ای می اندازیم. بطور معمول مدلسازی سازی رابطه ای داده ها متشکل از یک سری جدول است که شامل سطر و ستون میاشند و بطور پیوسته یک شِما برای داده ها تعریف میکند.تئوری پایگاه داده های رابطه ای چندین راه برای قرار دادن اطلاعات در جداول معرفی کرده است که به آن ها ” فرم های نرمال ” (Normal form) گفته می شود. البته این بحث بسیار گسترده میباشد و در این جا  تنها به آن اشاره خواهیم کرد. دو فرم در اینجا مورد استفاده ما قرار میگیرند : اولین فرم نرمال (1nf) و سومین فرم نرمال ( 3nf) (First Normal Form & Third Normal Form)

 

فرم نرمال چیست؟

نرمالسازی یک شما معمولا با قرار دادن داده ها بصورت 1nf آغاز می شود. تعریف دقیق 1nf از موضوع بحث خارج است اما بطور خلاصه قرار دادن داده ها در یک جدول بصورتی که در تقاطع هر سطر و ستون ( هر سلول ) تنها یک مقدار جای بگیرد را 1nf گویند. برای یادگیری بهتر ادامه بحث را در غالب یک مثال پیش میبریم. یک برنامه دفترچه تلفن بصورت زیر را در نظر بگیرید :

این جدول بصورت پیشفرض بصورت  1nf میباشد. حال فرض کنید میخواهیم برای یک فرد بیش از یک شماره تلفن در نظر بگیریم :

با توجه به جدول فوق این نحوه ذخیره اطلاعات از حالت 1nf خارج است و کار را برای خواندن اطلاعات سخت میکند.مثلا اگر بخواهیم با توجه به شماره یک شخص نام آن را بدست آوریم درخواستی که باید بنویسیم بصورت زیر است :

 

استفاده از پیشوند LIKE باعث می شود که دستور برای پیدا کردن بهترین جواب کل دیتابیس را جستجو کند که این موضوع خود باعث کنی برنامه می شود.
در نهایت راه دیگری که میتوان برای ذخیره چند تلفن استفاده کرد، ساخت چند ستون مختلف است :

در صورت استفاده از این راه نیز دستور استفاده شده طولانی و بهینه نیست :

 

همچنین در این نوع ذخیره سازی مشکلی که وجود دارد مشکل آپدیت و همچنین حذف یک داده است. برای برطرف کردن این مشکل 1nf راهی که پیشنهاد میدهد شکستن ستون ها به سطر است :

حال داده های ما بصورت 1nf در آمده اند اما با یک مشکل جدید به نام ” حشو ” یا ” اضافگی” (Redundancy) برمیخوریم. اضافگی محتمل بودن غیر همخوانی را بهمراه دارد و همچنین باعث می شود از یک فایل چندین کپی وجود داشته باشد.( این موضوع خود باعث مشکل و کار اضافی در قسمت آپدیت و حذف اطلاعات می شود). برای نرمالسازی این جدول باید آن را به دو جدول جداگانه تقسیم کنیم :

در این مرحله علاوه بر جداسازی جداول باید یک ” ستون کلیدی ” نیز در نظر بگیریم تا بتوانیم جداول را به هم متصل کنیم. در مثال بالا ” contact_id ” ستون کلیدی میباشد. در این مدلسازی مشکل اضافگی برطرف شده و راحت میتواند یک داده را بدون تغییر چنین سطر، تغییر داد و همچنین دیگر لازم نیست نگران غیر همخوانی داده ها باشیم.

 

پس مشکل کجاست ؟

نکته مثبتی که در رابطه با نرمالسازی وجود دارد این است که بعد از این کار براحتی میتوان داده ها را آپدیت کرد. اما مشکل جایی آغاز می شود که میخواهیم این داده ها را بازخوانی کنیم. مثلا فرض کنید در مثال بالا میخواهیم یک مخاطب خاص  و شماره تلفن هایش را بخوانیم :

 

نتیجه ای که از این دستور حاصل می شود بصورت زیر است :

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

ویژگی دیسک های چرخنده این است که برای پیدا کردن مکان مشخصی بر روی دیسک زمان نسبتا زیادی صرف میکنند اما وقتی مکان پیدا شد میتوانند بطور پی در پی داده مورد نظر را بخوانند.بعنوان مثال پیدا کردن مکانی مشخص بر روی یک دیسک مدرن چیزی حدود 5 میلی ثانیه طول میکشد، اما وقتی دیسک مکان مورد نظر را پیدا کند میتواند اطلاعات را با نرخ 40-80مگابایت برثانیه بخواند.

99 درصد از زمان سپری شده برای پیدا کردن مکان مورد صرف خواندن سطر ها می شود. وقتی صحبت از دسترسی به دیسک می شود، پیدا کردن مکان های تصادفی بهینه و به نفع ما نیستند. نکته قابل توجه این است که پیشوند JOIN معمولا به مکان های تصادفی برای پیدا کردن اطلاعات ممورد نظر خود نیاز دارد. کد پایتون زیر را در نظر بگیرید :

 

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

 

پایان بخش اول

مدرکی که مترادف کار نیست.

دلیل سیل عظیم درخواست برای ورود به دانشگاه سوالیِ که اکثر اوقات ذهن من رو به خودش مشغول میکنه. البته در اینکه همه­ ی ما “عاشق” کسب علم و دانش هستیم شکی نیست ولی به قول معروف “این حجم از دانشجو بی سابقه است!”. افراد زیادی رو دیدم که صرفا برای خوردن مهر “دانشجو” بر روی پیشونیشون وارد دانشگاه هایی با هزینه های گزاف شدن و همینطور پسرای جوانی که به خاطر “عشق” فراوانشون به تحصیل مدتی افتخار پوشیدن لباس مقدس سربازی را نداشتن!

“مدرکمو بگیرم برم سر کار!” جمله ای که اکثر نوجوانا بهش گرفتارن، چون که ذهنشون هنوز پر از عقاید غلط. این عقیده که “برم دانشگاه، مدرکو میگیرم و بووووووم کار در خونه منتظرمه!” کارشم حتما باید دولتی و پشت میز باشه! ولی اکثر همین دوستان در نهایت کارهایی 180 درجه مخالف با مدرکشون انجام میدن، چون صرفا میرن دانشگاه، مدرکی میگیرن و میخوان کاری انجام بدن.

روحیه­ی کارآفرینی و راه اندازی کسب و کار با استفاده از “توانایی”ها و “مهارت”های خودمون مرده. البته از حق نگذریم که در چند سال اخیر این روحیه کمی پر رنگ تر شده ولی هنوز اکثر افراد پایبند به همون افکار قدیمی هستن. نوجوانا با این عقاید به دانشگاه میرن، تحصیل میکنن و بعد از فارغ التحصیلی منتظرن که یک کار خوب از آسمان براشون نازل بشه. ولی تعداد کمی هستن که کمی فکر میکنن و با توجه به مهارت هایی که بلدن یا یادگرفتن، خودشون کاری را شروع میکنن و تعداد بسیار ناچیزی نسبت به همین افراد، کسایی هستن که قبل از انتخاب رشته و ورود به دانشگاه ،کار و ایده خودشون رو انتخاب کردن و دانشگاه براشون صرفا وسیله ای برای یادگرفتن علم و مهارت های لازم برای رسیدن به اون هدف. البته ناگفته نمونه دانشگاه خودش به تنهایی شما رو حرفه ای و دانشمند نمیکنه! بلکه این شما هستین که با جوییدن دانش (بله، جوییدن!) ،دانشجویی موفق و با مهارت میشین.

حتما تا اینجا با خودتون گفتین که نَفَس بنده از جاهای گرم و نرمی بلند میشه و چهارتا فوش آبدار هم تو دلتون دادین، ولی همونطور که استادی میفرماید: “ما که دعوا نداریم، با کسی هم کار نداریم!”
در ضمن این حرفا که آقا اگه نخونیم باید بریم سربازی، کی پول داره که خودش کار شروع کنه، با این وضع اقتصادی و روند آموزشی اینا همه خواب و خیال و…  همه رو میدونم و خودم هم اینا رو چشیدم. این راه بدون شک سخت و دشوار، ولی هیچ مزد و پاداشی بدون سختی به دست نمیاد و اگه به سادگی به دست اومد، به همون سادگی هم از بین میره. پس اگه یکم سختی بخودمون بدیم و این دلایل رو مثل یه نیروی محرک استفاده کنیم و نه یک مانع، رسیدن بهش اونقدرا هم دور از دست رس نیست.

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