Sequelize مقابل Prisma

البدء

حاليًا في eBay، أقوم بترحيل أدواتنا الداخلية من استخدام MongoDB إلى Postgres. وهو مشروع صعب جدًا لكنني متحمس لخوضه مباشرة. أثناء البحث، وجدتُ أنه بالنسبة لقاعدة الشيفرة لدينا، سيكون استخدام ORM هو الأفضل لأن قاعدة الشيفرة كانت مصممة أصلًا لاستخدام Mongoose. لكن الآن التحدي هو: أي ORM سيكون الأفضل لقاعدة الشيفرة لدينا؟ في هذه التدوينة، سأخوض في هذه المسألة. يرجى ملاحظة أنني لا أستطيع الإفصاح عن كل شيء في هذه التدوينة بسبب طبيعة علاقتي مع صاحب العمل.

المتطلبات

بعد تحليل دقيق لاحتياجات المشروع، وضعتُ المعايير الأساسية التالية التي ينبغي لأي حل ORM أن يفي بها:

  • أن يكون حزمة JavaScript؛ لأن معظم الشيفرة مكتوب بـ JavaScript
  • يجب أن يدعم Postgres ومعظم ميزاته
  • يجب أن يكون أداؤه على الأقل بمستوى Mongoose أو أفضل
  • يجب أن يكون مفتوح المصدر ومُصانًا

ORMs

بعد إجراء قدر كبير من البحث، وجدتُ أن أفضل ثلاثة ORMs تتوافق مع المتطلبات هي: Sequelize، Prisma، وTypeORM. وفي النهاية قررتُ التركيز فقط على Sequelize وPrisma لأنني لم أكن أملك الوقت لاختبار ثلاثة ORMs مختلفة بالكامل بسبب المواعيد النهائية.

بيئة الاختبار

بالنسبة لبيئة الاختبار الخاصة بي، شغّلتُ Postgres عبر Docker. أخذتُ أكبر مجموعة بيانات لدينا وأكثرها تعقيدًا، وحولتها من بنية مستندات إلى بنية جداول، ثم أضفتها إلى نسخة Postgres المحلية لدي. قمتُ بتحويل مجموعة البيانات باستخدام أعمدة، وعلاقات واحد-لواحد، وعلاقات واحد-لكثير، وبعض أعمدة JSONB.

ومن هناك، كنتُ أكتب شيفرة JavaScript تستخدم ذلك الـ ORM المحدد وأقيس:

  • كم من الوقت سيستغرق إنشاء إدخال
  • كم من الوقت سيستغرق تحديث إدخال
  • كم من الوقت سيستغرق تحديث إدخال متداخل (علاقة و/أو زوج مفتاح-قيمة في JSON)
  • كم من الوقت سيستغرق حذف إدخال
  • كم من الوقت سيستغرق الاستعلام عن/جلب إدخال

أنشأتُ مستودعات لكل بيئة اختبار ORM. كنتُ أود جدًا مشاركة هذه المستودعات لكنها مملوكة تقنيًا لـ eBay، لذا لا أستطيع مشاركتها.

النتائج

في حوالي 15 مايو 2023، قررتُ أن Sequelize كان الـ ORM الأفضل لحالة الاستخدام لدينا وأنه سيكون الـ ORM المستخدم في عملية الترحيل من MongoDB إلى Postgres. وفي النهاية، اخترتُ Sequelize لأنه:

  • كان «مفتوح المصدر حقًا» وليس مُدارًا من شركة ناشئة ممولة.
  • يدعم معظم ميزات Postgres.
  • كان أداؤه جيدًا، خاصةً بالمقارنة مع Prisma.
  • لديه توثيق جيد، وإن لم يكن موثقًا بقدر توثيق Prisma.

استقررتُ على Sequelize، لكنني أيضًا أعددتُ قائمة بالإيجابيات والسلبيات لكل ORM اختبرته على أمل أن تساعد الناس على تحديد ما إذا كان Sequelize أو Prisma سيعملان مع حالة الاستخدام الخاصة بهم بشكل أفضل.

إيجابيات وسلبيات Sequelize

الإيجابيات:

  • لديه دالة sync() التي تنشئ الجداول وتتعامل معها تلقائيًا نيابةً عنك
  • يمكنه التعامل مع عمليات الربط المعقدة (البيانات المتداخلة)
  • يدعم الكثير من خيارات التصفية (مثل Regex)
  • يتم تمثيل النموذج/المخطط في JavaScript الخام باستخدام أصناف قابلة للتخصيص بدرجة عالية.
  • يتولى Sequelize إدارة الاتصالات لقاعدة البيانات/قواعد البيانات التي تختارها.
  • يدعم Sequelize عدة اتصالات قراءة
  • يدعم استعلامات SQL الخام.
  • اعتبارًا من 15 مايو 2023:
    • على NPM، كان آخر تحديث لـ Sequelize قبل “14 يومًا” ويحصل على 1,505,835 تنزيلًا أسبوعيًا.
    • على GitHub، كان آخر تحديث لـ Sequelize قبل “أمس”، ولديه 4.2k من التفرعات، و27.9k نجمة.
    • لدى Sequelize ترخيص MIT وكان مفتوح المصدر لأكثر من 10 سنوات. لذا فمن المرجح جدًا أن يبقى مفتوح المصدر في المستقبل المنظور.

السلبيات:

  • يمكن أن يصبح تمثيل النموذج/المخطط معقدًا للغاية ومنتفخًا. على سبيل المثال، كان تمثيل Mongoose لمجموعة البيانات الكبيرة لدينا حوالي 262 سطرًا (بما في ذلك المسافات). أما المجموعة نفسها ممثلة عبر Sequelize فكانت 564 سطرًا (بما في ذلك المسافات).
  • تصبح صياغة Sequelize مربكة ومعقدة جدًا في بعض الحالات.
  • ترحيل قاعدة البيانات الخاصة بك (تعديلها) مزعج جدًا. يمكنك استخدام sequelize-cli لإنشاء قوالب نصوص ترحيل JavaScript. لكن يبدو أن هذا ينطبق تقريبًا على جميع ORMs. الترحيل في قاعدة بيانات علائقية ليس سهلًا في معظم الحالات.
  • التوثيق ليس جيدًا جدًا. لقد تحسن لكنه لا يزال بحاجة إلى عمل. لكن مع أدوات مثل ChatGPT، لم تعد هذه مشكلة كبيرة كما كانت من قبل، لأن ChatGPT لديه فهم جيد جدًا لـ Sequelize على الأرجح بسبب وجود Sequelize منذ عقد.
  • Sequelize ليس حساسًا للأنواع بقدر Prisma، وهو ما قد يؤدي إلى مشكلات.
  • لا يدعم TypeScript جيدًا، وهو ما ليس مشكلة في مشروعي، لكنه قد يكون مشكلة كبيرة في العديد من المشاريع الأخرى.

إيجابيات وسلبيات Prisma

الإيجابيات:

  • لديه لغة مخطط خاصة به. هذا يعني أنه يمكنك إنشاء مخططك/نموذجك بسهولة وبشكل أنظف. على سبيل المثال، كان تمثيل Mongoose لمجموعة البيانات الكبيرة لدينا حوالي 262 سطرًا (بما في ذلك المسافات). لكن مجموعة البيانات نفسها ممثلة بواسطة Prisma كانت فقط 221 سطرًا (بما في ذلك المسافات).
  • لدى Prisma أداة CLI تجعل إنشاء قاعدة البيانات وترحيلها (تعديلها) أسهل. وهو أمر مريح جدًا. ليس حلًا سحريًا، لكنه أفضل شيء رأيته حتى الآن من ORM.
  • يدعم استعلامات SQL الخام.
  • شيفرة Prisma نظيفة وبسيطة. لا يزال عليك تعلم صياغة Prisma والتأقلم معها، لكنها أسهل بكثير في الفهم من صياغة Sequelize.
  • لدى Prisma عميل يولد تلقائيًا منشئي الاستعلامات لـ Node.js وTypeScript.
  • التوثيق جيد جدًا ونظيف. لا يزال بإمكان ChatGPT المساعدة، لكنه ليس محدثًا بشأن Prisma بقدر ما هو مع Sequelize.
  • اعتبارًا من 15 مايو 2023:
    • على NPM، كان آخر تحديث لـ Prisma قبل “6 أيام” ويحصل على 1,344,705 تنزيلًا أسبوعيًا.
    • على GitHub، كان آخر تحديث لـ Prisma قبل “3 ساعات”، ولديه 1.1k من التفرعات، و31.3k نجمة.

السلبيات:

  • لا يدعم التصفية بـ Regex لـ Postgres، لكنه يدعم خيارات التصفية “contains” و"includes" و"startsWith".
  • من خلال اختباري، Prisma أبطأ بشكل ملحوظ في إنشاء إدخالات مجموعة البيانات الكبيرة لدينا في Postgres. قام Sequelize بإنشاء تلك الإدخالات الكبيرة بمعدل يقارب 2.26 ثانية لكل إدخال (ملف JSON). بينما كان معدل Prisma حوالي 11.21 ثانية لكل إدخال (ملف JSON). بناءً على هذه النتائج، فإن Prisma أبطأ بنحو 5 مرات من Sequelize في هذه المهمة.
  • كذلك، أدى حذف إدخال واحد من مجموعة البيانات الكبيرة إلى زمن انتظار يقارب 4 دقائق، وهذا سيئ جدًا جدًا.
  • كان Sequelize أسرع بكثير في حذف إدخال في أكبر مجموعة بيانات وأكثرها تعقيدًا في اختباراتي. لم يكن لدى Sequelize أفضلية على Prisma عندما تعلق الأمر ببناء مجموعة البيانات. كلاهما كان عليه التعامل مع علاقة ثلاثية الطبقات عميقة لهذه المجموعة الكبيرة من البيانات، لذا أقول إن المقارنة كانت عادلة.
  • Prisma شركة ناشئة، أي أن Prisma شركة ربحية لديها تمويل بقيمة 56.5 مليون دولار. ومعرفة ذلك، فإن الشيفرة/الحزمة الأساسية لـ ORM في Prisma مفتوحة المصدر بترخيص Apache-2.0. هذا جيد، لكن بما أن لدى Prisma مستثمرين، فلن أتفاجأ إذا كرروا ما فعلته MongoDB فيما يتعلق بالترخيص.

المصادر