هنگامی که موضوع کار با داده ها در application مطرح میشه احتمالا نیاز به یک ORM پیدا خواهید کرد. ORM یک لایه بین پایگاه داده و application شماست. که به وسیله اون عملیات CRUD یا به عبارت دیگه create, read, update, delete به آسونی انجام میپذیره. بیشتر از این به ORM نمیپردازم چون در حال حاضر اکثر فریمورک های مدرن ازش استفاده میکنن و بعید میدونم شما تا الان با اون کار نکرده باشید.
دو الگو پیاده سازی محبوب ORM ها Active Record و Data Mapper هست. در این مقاله تصمیم دارم به تفاوت بین این دو الگو بپردازم. مزایا و معایبشون چی هست و چطور میشه یکی از این الگو ها رو برای کار خودمون انتخاب کنیم.
تقریبا محبوب تر و پر استفاده تر از Data Mapper هست. مثال زیر نحوه ی ذخیره کاربر جدید رو نشون میده.
user = new User user->username = 'philipbrown' user->save()
الگوی Active Record مستقیما یک جدول در پایگاه داده یا به عبارت دیگه یک سطر از یک جدول پایگاه داده رو map میکنه. به عنوان مثال. نمونه ی بالا یک سطر از جدول user در پایگاه داده است.
زمانی که مدل User ساخته میشه نیازی نیست که چیزی در مورد ویژگی ها و خواص این شی و اینکه چطور با پایگاه داده مرتبط هست رو بدونید. مدل به طور خودکار خواص/ویژگی ها رو با استفاده از طرح/شِما/schema پایگاه داده به دست آورده.
یکی دیگه از مزایای این الگو متد save هست که برای ایجاد یا بروزرسانی استفاده میشه و بسیار کار شما رو آسون میکنه.
تفاوتش با الگوی قبلی در این هست که domain شما رو به طور کامل از لایه persistence جدا میکنه. به این معنی که مدل چیزی در مورد پایگاه داده نمیدونه. که این یعنی نوشتن کد بیشتر اما در دراز مدت نگهداری و اصلاح اون آسونتر هست.
زمانی که از این سبک استفاده میکنید کد شما چیزی به صورت این نمونه خواهد بود.
user = new User user->username = 'philipbrown'
تا اینجای کار تفاوتی بین دو سبک وجود نداره. اما چون اطلاعاتی در مورد پایگاه داده نداریم نمیشه از متد save استفاده کنیم چون در واقع اصلا وجود نداره. در عوض باید از یک سرویس کاملا متفاوت تحت عنوان Entity Manager استفاده کرد.
اینجا دیگه لزوما یک شی نماینده یک سطر از جدول نیست و در واقع این محدودیت از بین رفته.
user = new User user->username = ‘philipbrown’ EntityManager::persist(user)
مزیت اصلی این سبک نداشتن اطلاعات در مورد پایگاه داده است چون اون رو سبک تر میکنه. علتش هم مشخصه، داخل مدل چیزی از ویژگی و خواص از جدول و پایگاه داده وجود نداره. اما تعامل با اون رو هم سخت کرده.
تا حد کمی تفاوت بین دو سبک رو توضیح دادم در ادامه مزایا و معایب رو بررسی میکنیم. توجه داشته باشید به طور کلی نمیتونیم مشخص کنیم کدوم الگوی مناسب تری هست و مثل باقی مسائل برنامه نویسی پاسخ رو باید در جمله ی "بستگی دارد" پیدا کنیم.
دو مورد کلی برای قضاوت در این مورد وجود داره.
- اپلیکیشن از چه نوعی هست؟
اولین چیزی که باید در مورد اون فکر کرد. به نظر من دو نوع 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