ما هو الـ ORM؟ مقارنة شاملة بين Sequelize, Prisma, و TypeORM لاختيار الأنسب لمشروعك

إذا كنت في كل مرة تعمل على مشروع يتضمن اتصالاً بقاعدة البيانات، تواجهك مشكلة في الصياغة (Syntax) وصعوبة في كتابتها، وتفضل أن تكتب صياغة سهلة، فإن الـ ORM هو الحل.

مرحباً بالجميع في هذا المقال الجديد، اليوم سنتعرف على ماهية الـ ORM.

ما هو الـ ORM؟

ORM هو اختصار لـ Object-Relational Mapping، مما يعني أننا نستطيع التحكم في البيانات الخاصة بنا عن طريق كود سهل وبسيط.

دعنا نرى مثالاً يوضح الفرق في الصياغة بين SQL و ORM.

مثال على استعلام بسيط:

لنفترض أننا نريد جلب مستخدم معين من قاعدة البيانات.

باستخدام SQL:

SELECT * FROM users WHERE id = 1;

باستخدام ORM (مثال Sequelize):

User.findByPk(1);

هل رأيت الفرق؟ الكود واضح، لا يحتوي على SQL، وكل شيء عبارة عن كائنات (Objects). قد يقول قائل: “أنا لا أوافقك الرأي، يبدو لي أن SQL أسهل”.

دعنا نرى مثالاً أكثر صعوبة لتتضح الفكرة بشكل أفضل.

مثال على استعلام معقد:

لنفترض أننا نريد جلب مقالات منشورة لمستخدمين من دولة معينة.

باستخدام SQL:

SELECT u.id, u.name, p.title
FROM users u
JOIN posts p ON u.id = p.userId
WHERE u.country = 'USA' AND p.status = 'published';

باستخدام ORM (مثال Sequelize):

User.findAll({
  attributes: ['id', 'name'],
  include: {
    model: Post,
    attributes: ['title'],
    where: {
      status: 'published'
    }
  },
  where: {
    country: 'USA'
  }
});

ما رأيك الآن؟ مثال كبير كهذا يشرح لنا أهمية الـ ORM ولماذا نستخدمه.

لماذا نستخدم الـ ORM؟

إلى جانب ما سبق، هذه هي نقاطه الإيجابية. فقط للتذكير بما قلناه:

كيف تختار الـ ORM الأنسب؟

لكل لغة برمجة يوجد الكثير من أدوات الـ ORM. اليوم سوف نستعرض أشهر ORMs لـ Node.js.

1. Sequelize

هو أشهر ORM لـ Node.js، وهو ناضج ومستقر ويعمل على جميع قواعد البيانات مثل PostgreSQL, MySQL, و MariaDB. ميزة Sequelize أنه الأكثر استقرارًا ويحتوي على الكثير من الميزات مثل الـ Migrations. لكن، لماذا لا يستخدمه الكثير من المطورين في الوقت الحالي؟ لأن المطورين يتجهون أكثر نحو TypeScript، ودعم Sequelize له ليس الأمثل، لذلك أصبح المطورون يستخدمون خيارات أخرى مثل Prisma أو TypeORM.

2. Prisma

Prisma هو ORM مبني على TypeScript. اعلم أن جميعهم يتبعون نفس المبدأ. المشكلة في Prisma أنه لا يتصل بقاعدة البيانات مباشرة مثل Sequelize. Prisma مصنوع بلغة البرمجة Rust ولديه بمثابة شيء وسيط.

عندما نكتب استعلامًا، على سبيل المثال prisma.user.findMany() لجلب كل المستخدمين، ماذا يفعل؟ هو لا يذهب للتواصل مع قاعدة البيانات مباشرة، بل يجب أن يمر عبر محرك (Engine) وسيط ليترجم الاستعلام إلى لغة Rust التي يفهمها، ثم يذهب لجلب كل المستخدمين ويضعهم في ذلك المحرك، وبعد ذلك يطبق عليهم الاستعلام.

مثال توضيحي لمشكلة الأداء في Prisma: إذا كان لدينا 1000 مستخدم ونحن بحاجة لمستخدم واحد فقط عبر الـ ID الخاص به، فإن Prisma سيقوم بجلب كل المستخدمين (الـ 1000) ويضعهم في المحرك، ثم يطبق الاستعلام الذي كتبناه للبحث عن ذلك المستخدم الواحد. هكذا نكون قد مررنا بمرحلتين. أما في Sequelize، إذا كتبنا نفس الاستعلام، فسيتم تحويله مباشرة إلى SQL ويتصل مباشرة بقاعدة البيانات.

هذا يعني أن Prisma يستهلك الكثير من الموارد. نصيحتي: استخدمه في المشاريع الصغيرة أو المشاريع التي لا يكون فيها الأداء عاملاً حاسماً.

3. TypeORM

هو ORM يوفر دعمًا كاملاً لـ TypeScript، ولهذا السبب تجده دائمًا يُستخدم مع NestJS. في الأصل، إذا قمت بتثبيت NestJS، ستجد أنه يستخدم TypeORM.

خلاصة

شارك المقال

أحدث المقالات

CONNECTED
ONLINE: ...
SECURE
00:00:00