زمانی که قصد کار با داده ها را در اپلیکیشن های خود دارید احتمالا نیاز یک ORM را در برنامه خود حس کرده اید.
اما ORM (Object Relational Mapper) چیست؟
ORM در علوم رایانه، یک تکنیک برنامه نویسی برای تبدیل کردن داده ها بین انواع سیستم های ناسازگار با
زمانی که قصد کار با داده ها را در اپلیکیشن های خود دارید احتمالا نیاز یک ORM را در برنامه خود حس کرده اید.
ORM در علوم رایانه، یک تکنیک برنامه نویسی برای تبدیل کردن داده ها بین انواع سیستم های ناسازگار با استفاده از قابلیت های شیءگرایی است.
ORM یک لایه مترجم بین زبان های برنامه نویسی و پایگاه داده ها است که این دو را به هم تبدیل می کند و در عمل باعث می شود که این دو حیطه کاملا متفاوت، زبان یکدیگر را به خوبی بشناسند و با هم تبادل اطلاعات داشته باشند. این مفهوم که مانند یک پل بین این دو حیطه می ماند قابلیت های زیادی را برای ما تهیه می کند.
ORM روشی مدرن برای مدیریت اطلاعات است. در شیوه ی سنتی، دسترسی به اطلاعات در DBMSها مانند SQL Server و MySQL برای خواندن و نوشتن اطلاعات می بایست با استفاده از کدهای SQL درخواست یا نیازهای اطلاعاتی به DBMS ارسال شوند.
به وسیله ORM پیچیدگی های ارتباط با جداول در دیتابیس و همچنین انجام عملیات هایی نظیر ساخت، ایجاد، به روز رسانی و حذف یک داده در برنامه، کمتر می شود.
بنابراین به راحتی می توان گفت که ORM لایه ای است که بین پایگاه داده و برنامه شما قرار میگیرد.
دوتا از مهم ترین انواع پیاده شده از ORM موارد زیر است.
1- Active Record
2- Data Mapper
الگوی طراحی Active Record چیست؟
در ادامه شبه کدی از نحوه کار با این الگو رو بررسی میکنیم:
part = new Part()
part->name = "Sample part"
part->price = 123.45
part->save()
با توجه به شبه کد بالا، یک جدول با نام part وجود دارد که شامل ستون های نام و قیمت می باشد. بعد از مقداردهی این مقادیر، با صدا زدن متد save سطر جدیدی در جدول part ایجاد می شود که در واقع تمامی دستورهای بالا منجر به اجرا شدن خط زیر می شود:
INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);
از جمله مشکلات این الگو می توان به موارد زیر اشاره کرد:
- چسبندگی جدا نشدنی این لایه از دیتابیس و زیرساخت پیچیده آن که هنگام unit test برای پروژه مشکلاتی را به وجود میآورد.
- به دلیل بزرگ بودن شیء ساخته شده در این الگو، افت کارایی هنگام کوئری زدن به دیتابیس در حجم دادههای زیاد (صد هزار به بالا) دیده میشود.
الگوی طراحی Data Mapper
در ادامه شبه کدی از نحوه کار با این الگو را بررسی می کنیم:
$user = new User;
$user->username = ‘philipbrown’;
$user = new User;
$user->username = ‘philipbrown’;
EntityManager::persist($user);
در کد بالا شیء $user تنها یک شیء ساده در زبان PHP می باشد که هیچ اطلاعی از دیتابیس ندارد. به این معنی که همانند الگوی Active Record نمیتوان از متد save جهت ثبت اطلاعات در دیتابیس استفاده کرد. به جای آن جهت کامل کردن عملیات مورد نظر، بایستی از یک سرویس تحت عنوان EntityManager استفاده کرد و کافیست شیء ساخته شده از کاربر را به عنوان ورودی متد persist، به آن پاس دهیم.
تفاوت بین Active Record و Data Mapper چیست؟
الگوهای Active Record و Data Mapper شامل نکته های مثبت و منفی زیاد هستند و قطعاً نمیتوان گفت که کدام الگو بهتر از دیگری است. مانند هر مورد دیگری در برنامه نویسی ، پاسخ مناسب برای انتخاب یک الگوی مناسب، استفاده از جمله " بستگی دارد" است.
برای انتخاب الگوی مناسب، میتوان با در نظر گرفتن اصل زیر تصمیم گرفت که کدام الگو در جهت توسعه برای شما مناسب تر است.
نوع اپلیکیشن
اگر بخواهیم به صورت کلی نوع اپلیکیشن ها را تقسیم کنیم، می توان گفت بر پایه دو نوع است:
1- CRUD
2- Domain
برای نوع اول (بر پایه CRUD) الگوی Active Record گزینه ی مناسب تری است. چرا که یک برنامه مبتنی بر CRUD جایی است که کد شما به صورت خیلی ساده به یک پایگاه داده نگاشت می شود. در این برنامه ها، به طور معمول شما در حال ایجاد، خواندن، به روزرسانی و حذف موجودیت ها خواهید بود. همچنین ممکن است بین مدل های خود روابطی را داشته باشیءد ، اما در بیشتر موارد، در مورد چگونگی اجرای این روابط، قوانین سخت گیرانه ای وجود ندارد. استفاده از الگوی Active Record به دلیل سادگی، سرعت توسعه اپلیکیشن ها را بهبود می بخشد و میتوان از آن در برنامه هایی که سرعت توسعه در آنها حائز اهمیت است، استفاده کرد (برنامه هایی که نیازمند نسخه اولیه یا MVP است).
در مقابل، اپلیکیشن هایی که بر پایه معماری Domain توسعه پیدا می کنند ساختار بزرگتر و پیچیده تری خواهند داشت! لذا برای مدیریت هر چه بهتر پروژه در آینده، با استفاده از الگوی Data Mapper، این لایه را از لایه Persistence جدا کرده و می توانیم از مباحثی همچون الگوی طراحی Repository Pattern، تست نویسی آسان تر و... بهرمند شویم.