احسان رضایی

یک توسعه دهنده

تفاوت بین Active Record و Data Mapper

در PHP , پایگاه داده , / تاریخ ارسال 05-03-1398 / 1 نظر / آخرین ویرایش 25-01-1403

هنگامی که موضوع کار با داده ها در application مطرح میشه احتمالا نیاز به یک ORM پیدا خواهید کرد. ORM یک لایه بین پایگاه داده و application شماست. که به وسیله اون عملیات CRUD یا به عبارت دیگه create, read, update,  delete به آسونی انجام میپذیره. بیشتر از این به ORM نمیپردازم چون در حال حاضر اکثر فریمورک های مدرن ازش استفاده میکنن و بعید میدونم شما تا الان با اون کار نکرده باشید.

دو الگو پیاده سازی محبوب ORM ها Active Record و Data Mapper هست. در این مقاله تصمیم دارم به تفاوت بین این دو الگو بپردازم. مزایا و معایبشون چی هست و چطور میشه یکی از این الگو ها رو برای کار خودمون انتخاب کنیم.

- الگوی Active Record.

تقریبا محبوب تر و پر استفاده تر از Data Mapper هست. مثال زیر نحوه ی ذخیره کاربر جدید رو نشون میده.

$user = new User;  
$user->username = 'philipbrown';  
$user->save();

Active Record مستقیما یک جدول در پایگاه داده یا به عبارت دیگه یک سطر از یک جدول پایگاه داده رو map میکنه. به عنوان مثال. نمونه ی بالا یک سطر از جدول user در پایگاه داده است.

active-record

زمانی که مدل User ساخته میشه نیازی نیست که چیزی در مورد ویژگی ها و خواص این شی و اینکه چطور با پایگاه داده مرتبط هست رو بدونید. مدل به طور خودکار خواص/ویژگی ها رو با استفاده از طرح/شِما/schema پایگاه داده به دست آورده.

یکی دیگه از مزایای این الگو متد save هست که برای ایجاد یا بروزرسانی استفاده میشه و بسیار کار شما رو آسون میکنه.

- الکوی Data Mapper.

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

datamapper

زمانی که از این سبک استفاده میکنید کد شما چیزی به صورت این نمونه خواهد بود.

$user = new User;  
$user->username = 'philipbrown'; 

تا اینجای کار تفاوتی بین دو سبک وجود نداره. اما چون اطلاعاتی در مورد پایگاه داده نداریم نمیشه از متد save استفاده کنیم چون در واقع اصلا وجود نداره. در عوض باید از یک سرویس کاملا متفاوت تحت عنوان Entity Manager استفاده کرد.

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

$user = new User;  
$user->username = ‘philipbrown’;  
EntityManager::persist($user);

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

مزایا و معایب.

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

دو مورد کلی برای قضاوت در این مورد وجود داره.

- application از چه نوعی هست؟

 اولین چیزی که باید در مورد اون فکر کرد. به نظر من دو نوع application داریم. بر پایه CRUD و بر پایه Domain. 

برای نوع اول(بر پایه CRUD) الگوی Active Record گزینه ی مناسب تری هست. چون کارتون رو آسونتر میکنه و سریعتر میشه application رو توسعه داد. در مقابل application بر پایه Domain مثل پیاده سازی قوانین و رویه های یک کسب و کار Data Mapper گزینه ی مناسب تری هست. چون برای کار با داده ها Restriction های قطعی رو اعمال میکنه. و این امکان رو به شما میده تا قوانین کسب و کارتون رو در موجودیت های خودشون محافظت کنید.

- شرایط و استراتژی که هنگام توسعه در نظر دارید.

این هم موضوع دیگه ای هست که باید در نظر داشت. اگر تصمیم به تولید یک minimum viable product به منظور شناخت بازار یا ریسک یا ... دارید. Active Record به دلیل ناشناخته بودن کسب و کار و اهمیتش، همچنین عدم اطمینان از معماری گزینه ی مناسب تری هست. از طرف دیگه اگر یک application قدیمی به شما ارث رسیده! منظور برنامه ای هست که تصمیم دارید نسخه ی جدیدی از اون رو توسعه بدین. الگوی Data Mapper مناسب تر هست. چون نرم افزار قدیمی موجود قبلا وارد فاز اجرایی شده به خوبی امکان مشخص کردن فرایند ها و قوانین داخلش وجود داره.

 مطالعه بیشتر.

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

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

 

 

پیشنهاد

کتاب‌ها

کتاب الگوهای طراحی به بیان ساده(design patterns / دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

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

کتاب refactoring / ریفکتورینگ

Refactoring مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.

در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.

refactoring یک سرمایه‌گذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینه‌های توسعه نرم‌افزار در آینده خواهد شد.

ارسال نظر

یوشا در تاریخ 1398/09/19 - 01:30 نوشته
خلاصه، کاربردی و ساده بنظرم خوب درکش کردی