Active Record  VS. Data Mapper

Active Record VS. Data Mapper

زمانی که قصد کار با داده ها را در اپلیکیشن های خود دارید احتمالا نیاز یک 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 چیست؟

 Active Record  VS. Data Mapper
الگوی Active record معمولاً در نرم افزارهایی که از پایگاه داده ‌های رابطه ای برای ذخیره داده‌ هایشان استفاده می‌کنند، به کار می رود. نخستین بار این نام توسط Martin Fowler در کتاب Patterns of Enterprise Application Architecture به کار رفت.
می‌توان گفت یکی از پرطرفدارترین الگوهای طراحی می ‌باشد. در این الگو، جدول های یک دیتابیس به عنوان یک کلاس در نظر گرفته می‌ شوند که یک شیء از این کلاس‌ ها (مدل) به یک ردیف واحد از یک جدول در دیتابیس گره می‌خورد. در هر یک از این کلاس‌ ها، انواع متدها و ویژگی ‌های مرتبط با جدول مورد نظرش نوشته می ‌شود و زمانی که یک شیء (مدل) ساخته می شود، نیازی نیست که چیزی در مورد ویژگی ها و خواص این شیء و اینکه چطور با پایگاه داده در ارتباط می ‌باشد را بدانید! مدل به طور خودکار خواص و ویژگی های خودش را با استفاده از طرح (schema) پایگاه داده به دست می‌آورد.
در این الگو با داشتن یک شیء از کلاس می توان عملیاتی نظیر ذخیره، نمایش، حذف و بروزرسانی بر روی یک داده در دیتابیس را انجام داد.
در ادامه شبه کدی از نحوه کار با این الگو رو بررسی می‌کنیم:

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

 Active Record  VS. Data Mapper
الگوی طراحی Data Mapper یک الگوی طراحی معماری می‌باشد که توسط Martin Fowler در کتاب Patterns of Enterprise Application Architecture معرفی شده است. در واقع Data Mapper نوعی از Data Access Layer هست که یک انتقال دو طرفه از داده‌ ها را بین شیء ‌ها در Memory و لایه Persistence انجام می ‌دهد. با این روش شیء ‌های ایجاد شده در Memory (لایه دامین) هیچ اطلاعی از لایه دیتابیس ندارند و همینطور پایگاه داده نیز هیچ آگاهی نسبت به اینکه چه مدلی از آن استفاده می کند ندارد! این موضوع به این معنی است که مدل‌ها سبک تر خواهند شد زیرا نیازی به ارث بردن کامل ORM ندارند، اما همچنین فرایند سختگیرانه تر و رسمی تری برای تعامل با پایگاه داده وجود خواهد داشت! زیرا دیگر نمی شود در هر کجا که خواستیم، برای اعمال تغییرات در دیتابیس متد save را در برنامه خود فراخوانی کنیم و بایستی شیء ‌ها برای انجام این کار با لایه دیگری تحت عنوان EntityManager صحبت کنند!
این جداسازی در واقع مهم‌ ترین هدف الگوی Data Mapper است.
بزرگترین تفاوت الگوی Active Record با الگوی Data Mapper در جدا شدن کامل لایه دامین (Domain layer) از لایه نگهداری و ثبت داده‌ ها (Persistence) است.
در ادامه شبه کدی از نحوه کار با این الگو را بررسی می‌ کنیم:

$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، تست نویسی آسان تر و... بهرمند شویم.

منابع:

-          https://culttt.com/2014/06/18/whats-difference-active-record-data-mapper/

https://www.infinitypp.com/software-patterns/activerecord-vs-datamapper-pattern-php-laravel/

- https://civicrm.org/blog/rasantiago/active-record-versus-data-mapper