یکی از چالشهای مهم در برنامهنویسی شیگرا (OOP) آنجاست که برای تراز کردن کدهای برنامهنویسی با ساختار پایگاه داده با پیچیدگی زیادی روبهرو میشوید. به همین دلیل تکنیکی با عنوان ORM (نگاشت شی-رابطهای) معرفی گردیده است. این روش، لایهای بین زبان و پایگاه داده ایجاد میکند و به برنامهنویسان کمک میکند نیازی به کار با پایگاه داده نداشته باشند.
چالش اصلی برنامهنویسی شیگرا، کدنویسی به زبان SQL برای ارتباط برنامه به پایگاه داده است. برنامهنویسانی که به SQL مسلط هستند، توانایی نوشتن کدهای مورد نیاز برای دسترسی به پایگاه داده را دارند. اما فرایند نوشتن کد SQL بسیار وقتگیر است. زبان SQL طوری ساخته شده که برای سادهتر شدن فرایند کار با پایگاه داده، یک لایه انتزاعی ارائه میدهد که به کمک آن درک ساختار پایگاه داده سادهتر میشود. با این حال، برنامهنویسان هنوز نیاز به نوشتن کدهای زیادی به زبان SQL و درک مفهوم جداول و ساختار پایگاه داده دارند.
ORM در بین برنامهنویسان به محبوبیت خوبی دست پیدا کرده است اما کماکان نتوانسته اعتماد همه برنامهنویسان حرفهای را جلب کند. طرفداران ORM ادعا میکنند که چهار مزیت بزرگ در نوشتن برنامه با ORM وجود دارد: افزایش بهرهوری، بهبود طراحی برنامه، استفاده مجدد از کد و نگهداری آسانتر برنامه این چهار مزیت هستند. اما به گفته مخالفان، یک جنبه منفی ORM عملکرد آن است. این مقاله مروری بر ORM خواهد داشت، آن را با ابزارهای SQL مقایسه میکند و مزایا و معایب این ابزارها را بررسی میکند تا بتوانید تصمیم بگیرید که آیا ORM به شما کمک میکند یا برعکس، برنامهنویسی را برای شما پیچیدهتر میکند.
ORM چیست؟
به زبان ساده، ORM تکنیکی شامل یک لایه شیگرا بین پایگاه داده و زبان برنامهنویسی شیگرا است که شما را از نوشتن کوئری SQL بینیاز میکند. در نتیجه زمان توسعه برنامه را سریعتر میکند.
درک و تفسیر کد در برنامهنویسی شیگرا پیچیده است. کار اصلی ORM کمک به تفسیر کد و ایجاد ساختاری است که برنامهنویسان به کمک آن راحتتر با پایگاه داده کار کنند. همچنین نحوه ارتباط اشیاء با جداول مختلف را توضیح میدهد. ORM از این اطلاعات برای تبدیل دادهها بین جداول و تولید کد SQL برای یک پایگاه داده رابطهای استفاده میکند. این کدهای تولید شده برای درج، بهروزرسانی، ایجاد و حذف دادهها استفاده میشود. پس دیگر نیازی به نوشتن کد پایگاه داده ندارید. (ORM لاراول، Eloquent نام دارد. برای آشنایی بیشتر با Eloquent در لاراول به بخش آشنایی با Model از دوره آموزش مقدماتی لاراول مراجعه کنید.)
ORM چگونه کار میکند؟
ORM مدلی از برنامه شیگرا است که سطح بالایی از انتزاع را ایجاد میکند. به عبارت دیگر، سطحی از منطق را بدون وارد شدن به جزئیات کد ایجاد میکند. رابطه بین شی و داده را بدون دانستن ساختار داده توصیف کرده و روشی برای اتصال برنامه با پایگاه داده ایجاد میکند. این کد نیازی به بازنویسی ندارد و باعث صرفهجویی در زمان برنامهنویسی میشود.
انواع ORM
ORM از دو استراتژی مختلف استفاده میکند: الگوی ثبت فعال (active record pattern) و الگوی نگاشت داده (data-mapper pattern).
1- الگوی ثبت فعال
این استراتژی، دادهها را در ساختاری شیء مانند نگاشت میکند. در واقع شما دادهها را با استفاده از کلاسها و ساختارهایی درون کد برنامهنویسی خود مدیریت میکنید. این روش دارای مشکلاتی است زیرا ساختار پایگاه داده به شدت به کد متصل است و حذف پایگاه داده و انتقال آن به برنامه دیگر را دشوار میکند.
2- الگوهای نگاشت داده
الگوی نگاشت داده تلاش میکند تا منطق موجود در اشیاء را از پایگاه داده جدا کند. این جداسازی میتواند تغییر پایگاه داده و استفاده از منطق برنامهنویسی را آسانتر کند.
ORM در مقابل SQL
در حالت عادی برنامهنویسان میتوانند از کد SQL برای نوشتن یک رابط مستقیم بین برنامه و پایگاه داده استفاده کنند. اکثر پایگاه دادههای رابطهای از SQL برای ساخت رابطهای داده و برنامه پشتیبانی میکنند. این رابطها پایدار هستند و از آنجایی که SQL از دهه ۱۹۷۰ میلادی در حال استفاده است، به خوبی پشتیبانی میشود و در صورت بروز مشکل میتوانند به راحتی پاسخ خود را پیدا کنند. برنامهنویسان کنترل زیادی روی رابط داده خود با SQL دارند. درست است که این کنترل داشتن نیاز به کار و زمان زیادی دارد، اما انعطاف پذیرتر و دقیقتر از انتزاع ORM است.
- کوئری خام SQL: استفاده از SQL خام دارای اشکالاتی نیز هست. به عنوان مثال، برنامهنویس مسئول امنیت کد پایگاه داده است. پس احتمال بروز SQL injection وجود دارد. (SQL injection مشکلی است که در آن ورودی کاربر میتواند بر وضعیت داده تأثیر بگذارد و باعث ایجاد مشکلاتی در برنامه و یکپارچگی داده شود.) ORMها کد را پاکسازی میکنند و جلوگیری از این مشکلات را بسیار آسانتر میکند.
- کوئری سازهای SQL: سازندگان کوئری یک لایه انتزاعی روی SQL خام بدون mask کردن جزئیات، اضافه میکنند. در واقع آنها به الگوهای پرسوجو توابعی اضافه میکنند که ادغام برنامه را آسانتر میکند. به این صورت که یک لایه قالب اضافه میکنند تا برنامهنویسان، ساختار پایگاه داده را در همان برنامه کدنویسی کنند. اما برنامهنویسان همچنان نیاز به درک ساختار پایگاه داده دارند و این امر آنها را ملزم به دانستن SQL میکند.
مزایای نگاشت ORM
ابزارهای ORM بین برنامهنویسان شئگرا محبوب هستند، زیرا میزان دانش SQL مورد نیاز برای اتصال پایگاه داده به یک برنامه کاربردی را به حداقل میرساند. ORM همچنین به طور خودکار کد SQL را تولید میکند. چهار مزیت قابل توجه در استفاده از نگاشتهای مرتبط با شی برای مدیریت رابط بین برنامهها و پایگاههای داده وجود دارد که در ادامه آنها را بررسی میکنیم:
- بهرهوری: نوشتن کد دسترسی به داده زمانبر است و ارزش زیادی به برنامه اضافه نمیکند. استفاده از ابزاری مانند ORM که به طور خودکار کد دسترسی به داده را تولید میکند، در زمان توسعه صرفهجویی میکند. در برخی موارد، ORM میتواند صد درصد کد دسترسی به داده را برای برنامه بنویسد. ORM همچنین میتواند به شما کمک کند تغییرات پایگاه داده را بررسی کرده و اشکالزدایی آن را در آینده آسان میکند.
- طراحی اپلیکیشن: یک ORM، اگر به طور صحیح نوشته شده باشد، الگوهای طراحی را پیادهسازی میکند و شما باید از بهترین شیوهها برای طراحی اپلیکیشن استفاده کنید. اگر از یک ORM برای مدیریت رابط داده استفاده میکنید، نیازی به ایجاد طرحواره (schema) کامل پایگاه داده ندارید. پس شما قادر خواهید بود رابط موجود را به راحتی تغییر دهید. جدا کردن جدول پایگاه داده از کد برنامهنویسی به شما امکان میدهد تا دادهها را برای برنامههای مختلف تغییر دهید.
- استفاده مجدد از کد: استفاده مجدد از کد یکی از قابلیتهای منحصر به فرد ORM است که در آن میتوانید بدون نیاز به کپی کردن کد دسترسی به پایگاه داده، یک برنامه جدید ایجاد کنید.
- کاهش تست: از آنجایی که کد تولید شده توسط ORM به خوبی آزمایش شده است، نیازی به صرف زمان زیادی برای آزمایش کد دسترسی به داده ندارید. در عوض، میتوانید روی منطق کد تمرکز کنید.
معایب نگاشت ORM
ORM ابزاری عالی برای بسیاری از برنامهها است، اما برخی از برنامهنویسان در استفاده از ORM به منظور نوشتن برنامههای کار با پایگاه داده، اشکالات متعددی پیدا کردند. به نظر میرسد این مسائل ارتباط مستقیمی با پیچیدگی برنامه داشته باشد. وقتی یک برنامه ساده باشد، کاهش سطح انتزاع به فرآیند توسعه کمک میکند. اما زمانی که برنامه پیچیده باشد، انتزاع موجود باعث ساده شدن درک برنامه شده زیرا بسیاری از جزئیات مربوط به داده را پوشش میدهد.
- کارایی: یکی از مشکلات رایجی که برنامهنویسان شئگرا در خصوص ORM اشاره میکنند، کد اضافی تولید شده توسط ORM است. کد اضافه شده عملکرد برنامه را کند میکند. یک ORM که به خوبی طراحی شده است باید بتواند کدهای با کیفیت بالا را بدون تأثیر بر سرعت برنامه ایجاد کند.
- نیاز به دانستن SQL: انتزاعات سطح بالا همیشه بهترین کد SQL را تولید نمیکند و برنامهنویسان نمیتوانند صد درصد مواقع به ORM تکیه کنند. شما هنوز باید SQL و همچنین نحوه تولید آن توسط ORM را بدانید.
- نگاشت ضعیف: ORM گاهی اوقات میتواند نگاشت نادرستی بین جداول داده و اشیاء ایجاد کند که میتواند باعث ایجاد مشکلاتی در برنامه شده و تشخیص آن را دشوار سازد. ORM همچنین نگاشت یک به یک را زیاد میکند، حتی اگر به ندرت در برنامههای کاربردی روابط یک به یک وجود داشته باشند.
- اثرات بر schema و انتقال پایگاه داده: اگر لایه ORM بد نوشته شده باشد، بهبود شِمای داده را به چالش میکشد. همچنین میتواند انتخابهای شما را محدود کند. اگر ORM شما از انتقال پایگاه داده پشتیبانی نمیکند، انتقال پایگاه داده در حالت شئگرایی پیچیدهتر از انتقال آن در SQL است. اما اگر ORM به خوبی نوشته شده انتقال پایگاه داده در آینده بسیار ساده میشود.
مروری بر ORMهای محبوب
- Prisma2 :Prisma 2 یک ORM منبع باز برای Node.js و TypeScript است. Prisma 2 با پایگاه داده PostgreSQL، MySQL و SQLite کار میکند. ماژولهای آن عبارتند از Prisma Schema، Prisma Client، Prisma Migrate و Prisma Studio.
- Sequelize :Sequelize که برای اولین بار در سال ۲۰۱۱ راهاندازی شد دارای مجموعه مستندات گستردهای است و برای Node.js یک انتخاب خوب میباشد و از PostgreSQL، MySQL، MariaDB، SQLite و MSSQL پشتیبانی میکند.
- TypeORM: در حالی که TypeORM با جاوا اسکریپت کار میکند، اما از TypeScript به خوبی پشتیبانی میکند. TypeORM از الگوهای ActiveRecord و نگاشت داده پشتیبانی میکند.
سخن پایانی
نوشتن کد SQL برای پیوست پایگاه داده رابطهای به برنامه شیگرا میتواند بسیار زمانبر باشد. برنامهنویسان برای این کار میتوانند کد SQL بنویسند یا از کوئریسازهای SQL برای بهبود فرآیند استفاده کنند، اما هر دو روش همچنان به دانش عمیق پایگاه داده و توانایی کدنویسی در SQL نیاز دارند. ORM بهرهوری را با ایجاد مدلهای داده بسیار انتزاعی و تولید خودکار کد SQL افزایش میدهند. این ابزارها همچنین جداسازی پایگاه داده از منطق برنامهنویسی را آسانتر میکند و انعطافپذیری بیشتری به برنامه میدهد. اما ORMها مخالفان خود را دارند. انتقادات متداولی مانند کاهش عملکرد، کدگذاری اضافی و نگاشت ضعیف چند مورد از این انتقادات است.
برنامهنویسان باید قبل از استفاده از ORM برای سرعت بخشیدن به فرآیند توسعه شئگرایی، پیشنیازهای برنامه را انجام دهند. چندین ابزار منبع باز و تجاری ORM در دسترس هستند و از آنجایی که این ابزارها برای سالیان متمادی در دسترس بودهاند، به خوبی مستند شده و توسط طیف وسیعی از برنامهنویسان پشتیبانی میشوند.