Sequelize بمقابلہ Prisma

آغاز

فی الحال eBay میں، میں اپنے اندرونی ٹولز کو MongoDB سے Postgres پر منتقل کر رہا ہوں۔ یہ ایک ایسا منصوبہ ہے جو بہت مشکل ہے، لیکن میں اسے براہِ راست نمٹنے کے لیے پُرجوش ہوں۔ تحقیق کے دوران، میں نے طے کیا کہ ہمارے کوڈ بیس کے لیے ORM استعمال کرنا بہترین ہوگا، کیونکہ کوڈ بیس پہلے ہی Mongoose استعمال کرنے کے لیے ڈیزائن کیا گیا تھا۔ لیکن اب چیلنج یہ ہے کہ ہمارے کوڈ بیس کے لیے کون سا ORM بہترین ہوگا؟ اس بلاگ میں، میں اسی سوال کا جائزہ لوں گا۔ براہِ کرم نوٹ کریں کہ اپنے آجر کے ساتھ میرے رابطے کی نوعیت کے باعث میں اس بلاگ میں ہر چیز ظاہر نہیں کر سکتا۔

تقاضے

منصوبے کی ضروریات کے محتاط تجزیے کے بعد، میں نے درج ذیل ضروری معیارات قائم کیے جنہیں کسی بھی ORM حل کے لیے پورا کرنا ضروری ہوگا:

  • ایک JavaScript پیکیج ہو؛ کیونکہ زیادہ تر کوڈ JavaScript میں لکھا گیا ہے
  • Postgres اور اس کی زیادہ تر خصوصیات کو سپورٹ کرنا ضروری ہے
  • اس کی کارکردگی کم از کم Mongoose کے برابر یا اس سے بہتر ہونی چاہیے
  • اوپن سورس اور برقرار رکھا جانے والا ہو

ORMs

بہت زیادہ تحقیق کرنے کے بعد، میں نے طے کیا کہ ضروریات پر پورا اترنے والے تین بہترین ORMs یہ ہیں: Sequelize، Prisma، اور TypeORM۔ آخرکار میں نے صرف Sequelize اور Prisma پر توجہ مرکوز کرنے کا فیصلہ کیا، کیونکہ آخری تاریخوں کے باعث میرے پاس تین مختلف ORMs کو مکمل طور پر جانچنے کے لیے وقت نہیں تھا۔

جانچ کا ماحول

اپنے جانچ کے ماحول کے لیے، میں نے Docker کے ذریعے Postgres چلایا۔ میں نے ہمارا سب سے بڑا اور زیادہ پیچیدہ ڈیٹاسیٹ حاصل کیا، اسے دستاویزی ساخت سے ٹیبل کی ساخت میں تبدیل کیا، اور اسے اپنے مقامی Postgres انسٹینس میں شامل کر دیا۔ میں نے ڈیٹاسیٹ کو کالمز، one-to-one تعلقات، one-to-many تعلقات، اور کچھ JSONB کالمز استعمال کرکے تبدیل کیا۔

اس کے بعد، میں ایسا JavaScript کوڈ لکھتا جو مخصوص ORM استعمال کرتا اور درج ذیل چیزوں کی پیمائش کرتا:

  • ایک اندراج بنانے میں کتنا وقت لگے گا
  • ایک اندراج کو اپ ڈیٹ کرنے میں کتنا وقت لگے گا
  • ایک nested اندراج کو اپ ڈیٹ کرنے میں کتنا وقت لگے گا (تعلق اور/یا JSON میں key-value)
  • ایک اندراج حذف کرنے میں کتنا وقت لگے گا
  • ایک اندراج کو query/get کرنے میں کتنا وقت لگے گا

میں نے ہر ORM کے جانچ کے ماحول کے لیے ریپوزٹریز بنائیں۔ میں یہ ریپوزٹریز شیئر کرنا چاہوں گا، لیکن تکنیکی طور پر ان کی ملکیت eBay کی ہے، اس لیے میں انہیں شیئر نہیں کر سکتا۔

نتائج

15 مئی 2023 کے آس پاس، میں نے فیصلہ کیا کہ Sequelize ہمارے استعمال کے معاملے کے لیے بہتر ORM ہے اور MongoDB سے Postgres تک ہماری منتقلی کے لیے یہی ORM استعمال کیا جائے گا۔ آخرکار، میں نے Sequelize کا انتخاب درج ذیل وجوہات کی بنا پر کیا:

  • یہ “حقیقی معنوں میں اوپن سورس” تھا اور کسی فنڈ یافتہ اسٹارٹ اپ کے زیرِ انتظام نہیں تھا۔
  • یہ Postgres کی زیادہ تر خصوصیات کو سپورٹ کرتا تھا۔
  • اس کی کارکردگی اچھی تھی، خاص طور پر Prisma کے مقابلے میں۔
  • اس کی دستاویزات اچھی ہیں، اگرچہ Prisma کی دستاویزات جتنی اچھی طرح مرتب نہیں۔

میں نے Sequelize کا انتخاب کر لیا، لیکن میں نے اپنے جانچے گئے ہر ORM کے فوائد اور نقصانات کی فہرست بھی تیار کی، اس امید پر کہ یہ لوگوں کو بہتر طور پر تعین کرنے میں مدد دے گی کہ Sequelize یا Prisma ان کے استعمال کے معاملے کے لیے موزوں ہوگا یا نہیں۔

Sequelize کے فوائد اور نقصانات

فوائد:

  • اس میں sync() فنکشن موجود ہے جو خودکار طور پر آپ کے لیے ٹیبلز بناتا اور سنبھالتا ہے
  • پیچیدہ joins (nested ڈیٹا) کو سنبھال سکتا ہے
  • فلٹرنگ کے بہت سے اختیارات کو سپورٹ کرتا ہے (جیسے Regex)
  • ماڈل/اسکیما کی نمائندگی خام JavaScript میں classes کے ذریعے کی جاتی ہے، جنہیں بہت زیادہ حسبِ ضرورت بنایا جا سکتا ہے۔
  • Sequelize آپ کے منتخب کردہ database(s) کے لیے connections سنبھالتا ہے۔
  • Sequelize متعدد read-connections کو سپورٹ کرتا ہے
  • خام SQL queries کو سپورٹ کرتا ہے۔
  • 15 مئی 2023 تک:
    • NPM پر، Sequelize کو آخری بار “14 دن پہلے” اپ ڈیٹ کیا گیا تھا اور اسے ہفتہ وار 1,505,835 downloads حاصل ہوتے ہیں۔
    • GitHub پر، Sequelize کو آخری بار “کل” اپ ڈیٹ کیا گیا تھا، اس کے 4.2k Forks اور 27.9k Stars ہیں۔
    • Sequelize کے پاس MIT لائسنس ہے اور یہ 10 سال سے زیادہ عرصے سے اوپن سورس ہے۔ لہٰذا غالب امکان ہے کہ مستقبل قریب میں بھی یہ اوپن سورس رہے گا۔

نقصانات:

  • ماڈل/اسکیما کی نمائندگی بہت پیچیدہ اور غیر ضروری طور پر بڑی ہو سکتی ہے۔ مثال کے طور پر، ہمارے بڑے ڈیٹاسیٹ کی Mongoose نمائندگی تقریباً 262 سطروں پر مشتمل تھی (خالی جگہوں سمیت)۔ Sequelize کے ذریعے اسی ڈیٹاسیٹ کی نمائندگی 564 سطروں پر مشتمل ہے (خالی جگہوں سمیت)۔
  • بعض صورتوں میں Sequelize کا syntax واقعی بہت الجھا ہوا اور پیچیدہ ہو جاتا ہے۔
  • اپنے database کو منتقل کرنا (اس میں ترمیم کرنا) بہت پریشان کن ہے۔ آپ JavaScript migration template scripts تیار کرنے کے لیے sequelize-cli استعمال کر سکتے ہیں۔ لیکن ایسا تقریباً تمام ORMs میں ہوتا دکھائی دیتا ہے۔ زیادہ تر صورتوں میں relational database کو منتقل کرنا آسان نہیں ہوتا۔
  • دستاویزات اتنی اچھی نہیں ہیں۔ ان میں بہتری آئی ہے، لیکن اب بھی کام کی ضرورت ہے۔ تاہم ChatGPT جیسے ٹولز کے ساتھ یہ مسئلہ پہلے جتنا بڑا نہیں رہا، کیونکہ ChatGPT کو غالباً Sequelize کی ایک دہائی سے موجودگی کے باعث اس کی بہت اچھی سمجھ حاصل ہے۔
  • Prisma کے مقابلے میں Sequelize types کے حوالے سے اتنا حساس نہیں ہے، جو مسائل کا باعث بن سکتا ہے۔
  • یہ TypeScript کو اچھی طرح سپورٹ نہیں کرتا، جو میرے منصوبے کے لیے مسئلہ نہیں ہے، لیکن بہت سے دوسرے منصوبوں کے لیے ایک بڑا مسئلہ ہو سکتا ہے۔

Prisma کے فوائد اور نقصانات

فوائد:

  • اس کی اپنی schema language ہے۔ اس کا مطلب ہے کہ آپ اپنی schema/model کو زیادہ آسانی اور صاف ستھرے انداز میں بنا سکتے ہیں۔ مثال کے طور پر، ہمارے بڑے ڈیٹاسیٹ کی Mongoose نمائندگی تقریباً 262 سطروں پر مشتمل تھی (خالی جگہوں سمیت)۔ لیکن Prisma کے ذریعے اسی ڈیٹاسیٹ کی نمائندگی صرف 221 سطروں پر مشتمل تھی (خالی جگہوں سمیت)۔
  • Prisma کے پاس ایک CLI tool ہے جو آپ کے database کی تخلیق اور migration (ترمیم) کو آسان بناتا ہے۔ یہ بہت سہولت بخش ہے۔ یہ کوئی ہر مسئلے کا حتمی حل نہیں، لیکن ORM کی جانب سے اب تک دیکھی گئی یہ بہترین چیز ہے۔
  • خام SQL queries کو سپورٹ کرتا ہے۔
  • Prisma کا کوڈ صاف اور سادہ ہے۔ آپ کو اب بھی Prisma کا syntax سیکھنا اور اسے سمجھنا ہوگا، لیکن یہ Sequelize کے syntax کے مقابلے میں سمجھنے میں کہیں زیادہ آسان ہے۔
  • Prisma کے پاس ایک client ہے جو Node.js اور TypeScript کے لیے query builders خودکار طور پر تیار کرتا ہے۔
  • دستاویزات بہت ہی اچھی اور صاف ہیں۔ ChatGPT اب بھی مدد کر سکتا ہے، لیکن Prisma کے بارے میں یہ اتنا تازہ ترین نہیں ہے جتنا Sequelize کے بارے میں ہے۔
  • 15 مئی 2023 تک:
    • NPM پر، Prisma کو آخری بار “6 دن پہلے” اپ ڈیٹ کیا گیا تھا اور اسے ہفتہ وار 1,344,705 downloads حاصل ہوتے ہیں۔
    • GitHub پر، Prisma کو آخری بار “3 گھنٹے پہلے” اپ ڈیٹ کیا گیا تھا، اس کے 1.1k Forks اور 31.3k Stars ہیں۔

نقصانات:

  • Postgres کے لیے Regex فلٹرنگ کو سپورٹ نہیں کرتا، لیکن اس میں “contains”، “includes”، اور “startsWith” فلٹر کے اختیارات موجود ہیں۔
  • میری جانچ کے مطابق، Postgres میں ہمارے بڑے ڈیٹاسیٹ کے اندراجات بنانے میں Prisma نمایاں طور پر سست ہے۔ Sequelize نے ان بڑے اندراجات کو تقریباً 2.26 سیکنڈ فی اندراج (JSON فائل) کی رفتار سے بنایا۔ جبکہ Prisma کی رفتار تقریباً 11.21 سیکنڈ فی اندراج (JSON فائل) تھی۔ ان نتائج کی بنیاد پر، اس کام میں Prisma، Sequelize کے مقابلے میں تقریباً 5 گنا سست ہے۔
  • اس کے علاوہ، بڑے ڈیٹاسیٹ سے ایک اندراج حذف کرنے کے نتیجے میں تقریباً 4 منٹ کا انتظار کرنا پڑا، جو بہت ہی خراب ہے۔
  • میری جانچ میں سب سے بڑے اور پیچیدہ ڈیٹاسیٹ سے اندراج حذف کرنے میں Sequelize کہیں زیادہ تیز تھا۔ جب ڈیٹاسیٹ کی تعمیر کی بات آئی تو Sequelize کو Prisma پر کوئی برتری حاصل نہیں تھی۔ اس بڑے ڈیٹاسیٹ کے لیے دونوں کو تین تہوں پر مشتمل گہرے تعلق سے نمٹنا پڑا، اس لیے میں کہوں گا کہ یہ ایک منصفانہ موازنہ تھا۔
  • Prisma ایک اسٹارٹ اپ ہے، یعنی Prisma ایک منافع بخش کمپنی ہے جسے 56.5 ملین ڈالر کی فنڈنگ حاصل ہے۔ یہ جانتے ہوئے، Prisma کا مرکزی ORM کوڈ/پیکیج Apache-2.0 لائسنس کے ساتھ اوپن سورس ہے۔ یہ اچھی بات ہے، لیکن چونکہ Prisma کے سرمایہ کار موجود ہیں، اس لیے مجھے حیرت نہیں ہوگی اگر وہ اپنے لائسنس کے معاملے میں MongoDB جیسا طرزِ عمل اختیار کریں۔

ذرائع