ORM (الگوی طراحی یا تهاجمی ضد الگو)
مدیریت دیتا (اطلاعات) در برنامه های شیءگرا امری بسیار ضروری و مهم است . اینکه دریک برنامه ما چگونه بتوانیم اطلاعاتی را که کاربر و یا خودمان در حین اجرای برنامه و هنگامی که برنامه از حالت اجرا خارج شده است ، حفظ ، مدیریت و تغییر دهیم بسیار حیاتی است.

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

همچنین برای برگرداندن اطلاعات و اعمال تغییرات روی آنها و احتمالا نمایش آنها به کاربر ، نیاز به نوشتن متدهایی نظیر فوق هستیم . البته بدون احتساب اعمالی نظیر تبدیل کردن انواع داده به یکدیگر (Casting) .
اگر از معماری چند لایه استفاده کرده باشید ، این متد ها در لایه ی BLL (Bussiness logic layer) پیاده سازی می شوند و متدهایی که مستقیم با پایگاه داده سر و کار دارند در لایه یDAL (Data access layer) . همانقدر که برنامه ما وسیع تر می شود به همان ترتیب تعداد وپیچیدگی موجودیت ها و فیلدها بیشتر .حال شما سیستمی را در نظر بگیرید که این ارتباط های دایمی و احتمالا پیچیده با پایگاه داده را برای شما انجام دهد بدون انجام اعمال تکراری ، در واقع پلی مابین اشیاء و پایگاه داده شما ایجاد کند (بین لایه یBLL  و DAL) و شما به راحتی بتوانید اطلاعات اشیاء را با صدا زدن یک متد در پایگاه داده ی خود ذخیره کنید . البته استفاده از این سسیستم دلیلی بر پیاده سازی نکردن لایهDAL  نیست ، زیرا برخی از اعمال بسته به شرایط مختلف نیاز به لایه DAL دارند .این سیستم همان ORM است که این امکان را برای شما فراهم می کند .
ORM یا Obejct Relational Mapper مجموعه ای از تکنیک های برنامه نویسی برای تبدیل داده ها بین سیستم های غیر شی گرا با محیط های برنامه نویسی شی گراست. به عبارت دیگر ، برای تطبیق بانک های اطلاعاتی رابطه ای (مثل SQL Server, MySQL و …) با زبان های برنامه نویسی شی گرا (مثل سی شارپ، جاوا و …) و استفاده از امکاناتی همچون     Inheritance از ORM ها استفاده می کنیم. در واقع با استفاده از ORM ها و استفاده از ابزارهایی که ORM در اختیار شما قرار می دهد، شما ساختار رابطه ای بانک اطلاعاتی خود را به ساختار شی گرا برنامه نویسی خود متصل می نمایید و به این ترتیب پیچیدگی های مربوط به ذخیره سازی ، بازیابی و … در بانک اطلاعاتی را به عهده ORM می سپارید.
در پیاده سازی سیستم های بزرگ نرم افزاری معمولا بخشی از انرژی و وقت تیم به پیاده سازی لایه داده سیستم (DAL)  که وظیفه اتصال به بانک اطلاعاتی و ذخیره و بازیابی داده از آن را دارد صرف می شود که با استفاده از یک ORM  بخش قابل توجهی از این انرژی را می توان صرف صرفه جویی نمود.
دقت داشته باشید کهORM  محدود به هیچ زبان خاصی نیست و تنها یک تکنیک و سیستم است که می تواند در زبانهای مختلف پیاده سازی شود . در حقیقت  ” یک شیء مجازی از دیتابیس” داریم که می تواند در زبانهای برنامه نویسی استفاده شود و خروجی دیگر یک آرایه نیست. تعداد این ORM ها خیلی زیاد است و هرکدام تعدادی پایگاه داده رو پشتیبانی میکنند. هر دو بسته “تجاری و رایگان” این تکنولوژی وجود دارد.
اولین فریم ورک مناسب و خوبی که برای ORM تولید شد، EOF نام گرفت (Enterprise Objects Framework) که البته خود نیز دارای مشکلاتی بود . در واقع Nhibernate ورژنOpen source  و رایگان Hibernate (فریم ورک پیاده سازی ORM در Java) در دات نت است.

مزایا

 الف) یک ابزار ORM زمان تحویل پروژه را کاهش می دهد:
اولین و مهمترین دلیلی که بر اساس آن در یک پروژه، استفاده از ORM حائز اهمیت می شود، بحث بالا بردن سرعت برنامه نویسی و کاهش زمان تحویل پروژه به مشتری است. این کاهش زمان بسته به نوع پروژه بین 20 تا 50 درصد می تواند خود را بروز دهد.
بدیهی است ابزارهای ORM کار شگفت انگیزی را قرار نیست انجام دهند و شما می توانید تمام آن عملیات را دستی هم به پایان رسانید؛ اما اجازه دهید یک مثال کوتاه را با هم مرور کنیم.
برای پیاده سازی یک برنامه متداول با حدود 15 تا 20 جدول، حدودا به 30 شیء برای مدل سازی سیستم نیاز خواهد بود و برنامه نویسی این مجموعه بین 5000 تا 10000 سطر کد را به خود اختصاص خواهد داد. بدیهی است برنامه نویسی و آزمایش این سیستم چندین هفته یا ماه به طول خواهد انجامید.
اما با استفاده از یک ORM ، عمده وقت شما به طراحی سیستم و ایجاد ارتباطات بین اشیاء و دیتابیس در طی یک تا دو روز صرف خواهد شد. ایجاد کد بر اساس این مجموعه و با کمک ابزارهای ORM ، آنی است و با چند کلیک صورت می گیرد.
ب) یک ابزار ORM کدی با طراحی بهتر را تولید می کند

ممکن است شما بگوئید که کدنویسی من بی نظیر است و از من بهتر کسی را نمی توانید پیدا کنید! به تمامی زوایای کار خود مسلطم و نیازی هم به این گونه ابزارها ندارم!
عده ای از شما به طور قطع اینگونه اید؛ اما نه همه. در یک تیم متوسط، همه نوع برنامه نویس با سطوح مختلفی را می توانید پیدا کنید و تمامی آن ها برنامه نویس ها و یا طراح های آنچنان قابلی هم نیستند. بنابراین امکان رسیدن به کدهایی که مطابق اصول دقیق برنامه نویسی شیء گرا نیستند و در آن ها الگوهای طراحی به خوبی رعایت نشده، بسیار محتمل است. همچنین در یک تیم زمانیکه از یک الگوی یکسان پیروی نمی شود، نتایج نهایی بسیار ناهماهنگ خواهند بود.
در مقابل استفاده از ORM های طراحی شده توسط برنامه نویس های قابل (senior (architect level) engineers) ، کدهایی را بر اساس الگوهای استاندارد و پذیرفته شده ی شیء گرا تولید میکنند و همواره یک روند کاری مشخص و هماهنگ را در یک مجموعه به ارمغان خواهند آورد.

ج) نیازی نیست تا حتما یک متخصص دات نت فریم ورک باشید تا از یک ORM استفاده کنید

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

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

توضیح این قسمت نیاز به ذکر یک مثال دارد. لطفا به مثال زیر دقت بفرمائید:

یک تعریف ساده
وقتی در زبان های برنامه نویسی میخواهید به پایگاه داده وصل شوید و از آن استفاده کنید، باید کدهای SQL  را بدانید تا بتوانید با داده ها کار کنید برای مثال برای انتخاب داده ها باید بنویسید: SELECT * FROM users .که لیست همه کاربران را بگیرید. کارهایی از این دست در دراز مدت خیلی زیاد هستند و اگر شما بخواهید پایگاه داده خودتان را عوض کنید خیلی از این کد ها را عوض کنید و متناسب با پایگاه داده جدید بنویسید. حالا ORM ها یک لایه ای برای شما بوجود می اورد که نیازی نباشد کدهای SQL رو خودتان بنویسید. مثلا شما مینویسید:  User.all(); ، و این خط خودش کد SQL تولید میکند و از جدول کاربران مشخصات تمام کاربران را لیست می کند. حالا اگر بخواهید پایگاه داده تان را هم عوض کنید ORM کدهای مربوط به پایگاه داده جدید را تولید میکند و نیازی نیست خودتان این کار را انجام دهید.
این خیلی مسخره است که بگوئیم ” همه جا از ORM استفاده میکنم!”
به خاطر آورید زمانی را که xml وارد دنیای وب شد و مورد فوق العاده ای برای ساختار ذخیره سازی به شکل string شد، اما شما واقعاً نمی خواستید که برنامه شما درگیر منطق آن شود.
به شکل زیر توجه کنید:

او آر ام

در شکل بالا، دو محور داریم: یکی پیچیدگی مدل و دیگری توان عملیاتی. محور X ، پیچیدگی مدل، پیچیدگی دامنه مدلتان را شرح می دهد. چند تا entity(موجودیت) دارید و روابط بینشان چقدر پیچیده است؟! ORM ها در Mapping مدلهای پیچیده بین وسعت کاری شما و پایگاه داده برتری دارند. پس اگر شما این نوع مدل را دارید، استفاده از یک ORM می تواند، سرعت را بالا ببرد و زمان توسعه را کاهش دهد.
مسأله1 اساسی با ORM ها اینجاست که شما واقعاً نمی توانید درک کنید که چطور با مدل رابطه ای شما ارتباط برقرار می کنند. Mapping می تواند پیچیده باشد و شما مجبورید درک خوبی از دو قضیه داشته باشید:

  • روابط پایگاه داده ای شما چطور به درخواستهای SQL پاسخ می دهد؟
  • ORM شما چطور شمای رابطه ای (relational schema) و SQL ای که به آن پاسخ میدهد را تولید می کند؟

تفکر ORM که باعث جدایی از SQL و Table ها و ایندکس ها می شود، نهایتاً منجر به مشکلات خواهد شد. فایده آنها در این است که شما را از کارهای کسل کننده CRUD نجات خواهد داد.
محور Y شکل بالا، توان عملیاتی، توان تراکنشی سیستم شما را بیان می کند. در سطوح خیلی بالا، صدها تراکنش در هر ثانیه، شما نیاز به hard-core DBA دارید تا از بن بست جهنمی بیرون بیایید. زمانی که شما به این نوع از مقیاس برمی خورید، ORM راه حلی بیشتر از یک انتزاع رخنه دار نیست! در اینجا شما باید خودتان schema و SQL را تولید نمائید.
اگر شما یک مدل ساده اما با توان عملیاتی بالا دارید، تجربه به من می گوید که استفاده از ORM مشکلاتش بیشتر از فواید آن است. ORM ها بزرگ و فوق العاده اند، ولی قبل از استفاده از آنها، به دو موضوع فکر کنید:

  • پیچیدگی مدل
  • توان عملیاتی پروژه

 

منابع

http://en.wikipedia.org/wiki/Object-relational_mapping
http://mikehadlow.blogspot.ca/2012/06/when-should-i-use-orm.html

دانلود مقاله ORM

ORM چیست؟

Latest posts by معصومه حسین دوست (see all)

facebooktwittergoogle_pluslinkedin

5 نظر در رابطه با “ORM چیست؟

  1. آرش

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

    پاسخ
    1. معصومه حسین دوست

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

      پاسخ
  2. رضا

    سلام
    مطلب پخته ای بود
    اگر ممکن هست جهت همکاری ایمیلتان را ارسال بفرمایید

    پاسخ

دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

*