سيكويلز مقابل بريزما
البداية
حالياً في eBay، أنا أقوم بترحيل أدواتنا الداخلية من استخدام MongoDB إلى Postgres. مشروع صعب جداً لكنني متحمس لمواجهته. أثناء البحث، حددت أنه بالنسبة لقاعدة الشيفرة الخاصة بنا، سيكون استخدام ORM هو الأفضل لأن قاعدة الشيفرة كانت مصممة بالفعل لاستخدام Mongoose. لكن الآن التحدي هو، أي ORM سيكون الأفضل لقاعدة الشيفرة الخاصة بنا؟ في هذه المدونة، سأغوص في هذا السؤال. يرجى ملاحظة أنني لا أستطيع الكشف عن كل شيء في هذه المدونة بسبب طبيعة اتصالي مع صاحب العمل.
المتطلبات
بعد تحليل دقيق لاحتياجات المشروع، وضعت المعايير الأساسية التالية التي يجب أن تلبيها أي حل ORM:
- أن يكون حزمة جافا سكريبت؛ لأن معظم الشيفرة مكتوبة بلغة جافا سكريبت
- يجب أن يدعم Postgres ومعظم ميزاته
- يجب أن تكون أداؤه على الأقل بمستوى أو أفضل من Mongoose
- يجب أن يكون مفتوح المصدر ومُدار
ORMs
بعد القيام بالكثير من البحث، حددت أن أفضل ثلاثة ORMs تتناسب مع المتطلبات هي: سيكويلز، بريزما، و TypeORM. في النهاية، قررت التركيز فقط على سيكويلز وبريزما لأنني لم أكن أملك الوقت لاختبار ثلاثة ORMs مختلفة بالكامل بسبب المواعيد النهائية.
بيئة الاختبار
بالنسبة لبيئة الاختبار الخاصة بي، قمت بتشغيل Postgres عبر Docker. أخذت أكبر مجموعة بيانات لدينا والأكثر تعقيدًا، حولتها من هيكل مستند إلى هيكل جدول، وأضفتها إلى مثيل Postgres المحلي الخاص بي. قمت بتحويل مجموعة البيانات باستخدام الأعمدة، والعلاقات واحد إلى واحد، والعلاقات واحد إلى العديد، وبعض أعمدة JSONB.
من هناك، سأكتب شيفرة جافا سكريبت تستخدم ذلك ORM المحدد وأقيس:
- كم من الوقت سيستغرق لإنشاء إدخال
- كم من الوقت سيستغرق لتحديث إدخال
- كم من الوقت سيستغرق لتحديث إدخال متداخل (علاقة و/أو مفتاح-قيمة في JSON)
- كم من الوقت سيستغرق لحذف إدخال
- كم من الوقت سيستغرق لاستعلام/الحصول على إدخال
أنشأت مستودعات لكل بيئة اختبار ORM. أود أن أشارك هذه المستودعات لكنهم مملوكون تقنيًا لـ eBay، لذا لا أستطيع مشاركتها.
النتائج
حوالي 15 مايو 2023، قررت أن سيكويلز هو ORM الأفضل لحالتنا وأنه سيكون ORM المستخدم في هجرتنا من MongoDB إلى Postgres. في النهاية، اخترت سيكويلز لأن:
- كان “مفتوح المصدر حقًا” وليس مُدارًا من قبل شركة ناشئة ممولة.
- دعم معظم ميزات Postgres.
- كان لديه أداء جيد، خاصة مقارنةً ببريزما.
- لديه وثائق جيدة، على الرغم من أنها ليست موثقة جيدًا مثل وثائق بريزما.
استقريت على سيكويلز، لكنني أيضًا قمت بإعداد قائمة إيجابيات وسلبيات لكل ORM اختبرته على أمل أن يساعد ذلك الناس في تحديد ما إذا كان سيكويلز أو بريزما سيعمل لحالتهم.
إيجابيات وسلبيات سيكويلز
الإيجابيات:
- لديه دالة sync() التي تنشئ وتدير الجداول تلقائيًا
- يمكنه التعامل مع الانضمامات المعقدة (البيانات المتداخلة)
- يدعم الكثير من خيارات التصفية (مثل Regex)
- تمثيل النموذج/المخطط يتم في جافا سكريبت الخام باستخدام فئات قابلة للتخصيص بشكل كبير.
- سيكويلز يدير الاتصالات لقاعدة البيانات المختارة الخاصة بك.
- سيكويلز يدعم اتصالات قراءة متعددة
- يدعم استعلامات SQL الخام.
- اعتبارًا من 15 مايو 2023:
- على NPM، تم تحديث سيكويلز آخر مرة “منذ 14 يومًا” ويحصل على 1,505,835 تنزيل أسبوعي.
- على GitHub، تم تحديث سيكويلز آخر مرة “أمس”، لديه 4.2k Forks، و27.9k Stars.
- سيكويلز لديه ترخيص MIT وكان مفتوح المصدر لأكثر من 10 سنوات. لذا من المحتمل أن يبقى مفتوح المصدر في المستقبل المنظور.
السلبيات:
- يمكن أن يصبح تمثيل النموذج/المخطط معقدًا ومترهلًا جدًا. على سبيل المثال، كان تمثيل Mongoose لمجموعة البيانات الكبيرة لدينا حوالي 262 سطرًا (بما في ذلك المسافات). نفس مجموعة البيانات الممثلة عبر سيكويلز هي 564 سطرًا (بما في ذلك المسافات).
- تصبح الصياغة في سيكويلز مربكة ومعقدة في بعض الحالات.
- ترحيل قاعدة البيانات الخاصة بك (تعديلها) مزعج جدًا. يمكنك استخدام sequelize-cli لإنشاء قوالب نصوص ترحيل جافا سكريبت. لكن، يبدو أن هذه هي نفس الحالة عبر جميع ORMs تقريبًا. الترحيل في قاعدة بيانات علائقية ليس سهلاً في معظم الحالات.
- الوثائق ليست جيدة جدًا. لقد تحسنت لكنها لا تزال بحاجة إلى عمل. لكن مع أدوات مثل ChatGPT، لم يعد هذا مشكلة كبيرة كما كان في السابق لأن ChatGPT لديه فهم جيد جدًا لسيكويلز على الأرجح بسبب وجود سيكويلز منذ عقد.
- سيكويلز ليس حساسًا للنوع مثل بريزما، مما قد يؤدي إلى مشاكل.
- لا يدعم TypeScript بشكل جيد، وهو ليس مشكلة لمشروعي ولكن بالنسبة للعديد من المشاريع الأخرى قد يكون مشكلة كبيرة.
إيجابيات وسلبيات بريزما
الإيجابيات:
- لديه لغة مخطط خاصة به. هذا يعني أنه يمكنك إنشاء مخططك/نموذجك بشكل أسهل وأنظف. على سبيل المثال، كان تمثيل Mongoose لمجموعة البيانات الكبيرة لدينا حوالي 262 سطرًا (بما في ذلك المسافات). لكن نفس مجموعة البيانات الممثلة بواسطة بريزما كانت فقط 221 سطرًا (بما في ذلك المسافات).
- بريزما لديها أداة CLI تجعل من الأسهل في إنشاء وترحيل (تعديل) قاعدة البيانات الخاصة بك. وهو أمر مريح جدًا. ليس حلاً سحريًا لكنه أفضل شيء رأيته حتى الآن من ORM.
- يدعم استعلامات SQL الخام.
- الشيفرة الخاصة ببريزما نظيفة وبسيطة. لا يزال يتعين عليك تعلم وفهم صياغة بريزما لكن من الأسهل بكثير فهمها مقارنةً بصياغة سيكويلز.
- بريزما لديها عميل يقوم تلقائيًا بإنشاء بانيات استعلام لـ Node.js وTypeScript.
- الوثائق جيدة جدًا ونظيفة. يمكن أن يساعد ChatGPT لكن ليس محدثًا مثلما هو مع سيكويلز.
- اعتبارًا من 15 مايو 2023:
- على NPM، تم تحديث بريزما آخر مرة “منذ 6 أيام” ويحصل على 1,344,705 تنزيل أسبوعي.
- على GitHub، تم تحديث بريزما آخر مرة “منذ 3 ساعات”، لديه 1.1k Forks، و31.3k Stars.
السلبيات:
- لا يدعم تصفية Regex لـ Postgres لكنه يحتوي على خيارات تصفية “contains”، “includes”، و"startsWith".
- من خلال اختباري، كانت بريزما أبطأ بشكل ملحوظ في إنشاء إدخالات مجموعة البيانات الكبيرة لدينا في Postgres. أنشأ سيكويلز تلك الإدخالات الكبيرة بمعدل حوالي 2.26 ثانية لكل إدخال (ملف JSON). بينما كانت بريزما بمعدل حوالي 11.21 ثانية لكل إدخال (ملف JSON). بناءً على هذه النتائج، فإن بريزما أبطأ بحوالي 5 مرات من سيكويلز في هذه المهمة.
- أيضًا، أدى حذف إدخال واحد من مجموعة البيانات الكبيرة إلى وقت انتظار يقارب 4 دقائق، وهو أمر سيء جدًا.
- كان سيكويلز أسرع بكثير في حذف إدخال في أكبر وأعقد مجموعة بيانات في اختباري. لم يكن لدى سيكويلز ميزة على بريزما عندما يتعلق الأمر ببناء مجموعة البيانات. كان كلاهما يتعامل مع علاقة ثلاثية الطبقات لهذه المجموعة الكبيرة، لذا سأقول إنه كان مقارنة عادلة.
- بريزما هي شركة ناشئة، مما يعني أن بريزما هي شركة ربحية لديها 56.5 مليون دولار في التمويل. مع العلم بذلك، فإن الشيفرة/الحزمة الرئيسية لـ ORM لبريزما مفتوحة المصدر بترخيص Apache-2.0. هذا لطيف، لكن نظرًا لأن بريزما لديها مستثمرون، لن أتعجب إذا قاموا بسحب شيء مثل MongoDB عندما يتعلق الأمر بترخيصهم.
المصادر
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM