Sequelize बनाम Prisma

शुरुआत

वर्तमान में eBay में, मैं अपने आंतरिक टूल्स को MongoDB से Postgres में माइग्रेट कर रहा हूँ। यह एक ऐसा प्रोजेक्ट है जो बहुत कठिन है, लेकिन मैं इसे सीधे सामना करने के लिए उत्साहित हूँ। शोध करते समय, मैंने निर्धारित किया कि हमारे कोडबेस के लिए, एक ORM का उपयोग सबसे अच्छा होगा क्योंकि कोडबेस को पहले से ही Mongoose का उपयोग करने के लिए डिज़ाइन किया गया था। लेकिन अब चुनौती यह है कि हमारे कोडबेस के लिए कौन सा ORM सबसे अच्छा होगा? इस ब्लॉग में, मैं इस प्रश्न पर गहराई से चर्चा करूँगा। कृपया ध्यान दें कि अपने नियोक्ता के साथ मेरे संपर्क की प्रकृति के कारण मैं इस ब्लॉग में सब कुछ प्रकट नहीं कर सकता।

आवश्यकताएँ

प्रोजेक्ट की आवश्यकताओं के सावधानीपूर्वक विश्लेषण के बाद, मैंने निम्नलिखित आवश्यक मानदंड स्थापित किए, जिन्हें किसी भी ORM समाधान को पूरा करना होगा:

  • एक JavaScript पैकेज होना चाहिए; क्योंकि कोड का अधिकांश भाग JavaScript में लिखा गया है
  • Postgres और उसकी अधिकांश विशेषताओं का समर्थन करना चाहिए
  • इसका प्रदर्शन कम से कम Mongoose के बराबर या उससे बेहतर होना चाहिए
  • ओपन सोर्स और अनुरक्षित होना चाहिए

ORMs

बहुत शोध करने के बाद, मैंने निर्धारित किया कि आवश्यकताओं के अनुरूप शीर्ष तीन ORMs हैं: Sequelize, Prisma, और TypeORM। अंततः मैंने केवल Sequelize और Prisma पर ध्यान केंद्रित करने का निर्णय लिया क्योंकि समयसीमा के कारण मेरे पास तीन अलग-अलग ORMs का पूरी तरह परीक्षण करने का समय नहीं था।

परीक्षण वातावरण

अपने परीक्षण वातावरण के लिए, मैंने Docker के माध्यम से Postgres चलाया। मैंने अपना सबसे बड़ा और सबसे जटिल डेटासेट लिया, उसे एक दस्तावेज़ संरचना से एक तालिका संरचना में परिवर्तित किया, और उसे अपने स्थानीय Postgres इंस्टेंस में जोड़ दिया। मैंने डेटासेट को कॉलमों, एक-से-एक संबंधों, एक-से-अनेक संबंधों, और कुछ JSONB कॉलमों का उपयोग करके परिवर्तित किया।

उसके बाद, मैं JavaScript कोड लिखता जो उस विशिष्ट ORM का उपयोग करता और मापता:

  • एक प्रविष्टि बनाने में कितना समय लगेगा
  • एक प्रविष्टि को अपडेट करने में कितना समय लगेगा
  • एक नेस्टेड प्रविष्टि को अपडेट करने में कितना समय लगेगा (एक संबंध और/या JSON में एक key-value)
  • एक प्रविष्टि को हटाने में कितना समय लगेगा
  • एक प्रविष्टि को क्वेरी/प्राप्त करने में कितना समय लगेगा

मैंने प्रत्येक ORM परीक्षण वातावरण के लिए रिपो बनाए। मैं इन रिपो को साझा करना पसंद करूँगा, लेकिन वे तकनीकी रूप से eBay के स्वामित्व में हैं, इसलिए मैं उन्हें साझा नहीं कर सकता।

परिणाम

15 मई, 2023 के आसपास, मैंने निर्णय लिया कि Sequelize हमारे उपयोग-केस के लिए बेहतर ORM था और वही ORM होगा जिसका उपयोग MongoDB से Postgres में हमारे माइग्रेशन के लिए किया जाएगा। अंततः, मैंने Sequelize को इसलिए चुना क्योंकि:

  • यह “वास्तव में ओपन-सोर्स” था और किसी वित्तपोषित स्टार्टअप द्वारा अनुरक्षित नहीं था।
  • Postgres की अधिकांश विशेषताओं का समर्थन करता था।
  • इसका प्रदर्शन अच्छा था, विशेषकर Prisma की तुलना में।
  • इसकी दस्तावेज़ीकरण अच्छी है, हालाँकि Prisma की दस्तावेज़ीकरण जितनी अच्छी नहीं है।

मैंने Sequelize को चुना, लेकिन मैंने प्रत्येक परीक्षण किए गए ORM के लिए एक फायदे और नुकसान की सूची भी तैयार की, इस आशा में कि यह लोगों को बेहतर ढंग से निर्धारित करने में मदद करेगी कि Sequelize या Prisma आपके उपयोग-केस के लिए काम करेगा या नहीं।

Sequelize के फायदे और नुकसान

फायदे:

  • इसमें एक sync() फ़ंक्शन है जो स्वचालित रूप से आपके लिए तालिकाएँ बनाता और संभालता है
  • जटिल joins (नेस्टेड डेटा) को संभाल सकता है
  • बहुत सारे फ़िल्टरिंग विकल्पों का समर्थन करता है (जैसे Regex)
  • मॉडल/स्कीमा निरूपण raw JavaScript में classes का उपयोग करके किया जाता है, जो अत्यधिक अनुकूलन योग्य हैं।
  • Sequelize आपके चुने हुए डेटाबेस(s) के लिए कनेक्शनों को संभालता है।
  • Sequelize कई read-connections का समर्थन करता है
  • raw SQL queries का समर्थन करता है।
  • 15 मई, 2023 तक:
    • NPM पर, Sequelize को आखिरी बार “14 days ago” अपडेट किया गया था और इसे 1,505,835 साप्ताहिक डाउनलोड मिलते हैं।
    • GitHub पर, Sequelize को आखिरी बार “yesterday” अपडेट किया गया था, इसके 4.2k Forks हैं, और 27.9k Stars हैं।
    • Sequelize के पास MIT लाइसेंस है और यह 10 वर्षों से अधिक समय से ओपन सोर्स है। इसलिए निकट भविष्य में इसके ओपन सोर्स बने रहने की बहुत अधिक संभावना है।

नुकसान:

  • मॉडल/स्कीमा निरूपण बहुत जटिल और बोझिल हो सकता है। उदाहरण के लिए, हमारे बड़े डेटासेट का Mongoose निरूपण लगभग 262 पंक्तियों का था (स्पेस सहित)। Sequelize के माध्यम से दर्शाया गया वही डेटासेट 564 पंक्तियों का था (स्पेस सहित)।
  • कुछ मामलों में Sequelize का syntax बहुत भ्रमित करने वाला और जटिल हो जाता है।
  • अपने डेटाबेस का माइग्रेशन करना (उसमें संपादन करना) बहुत परेशान करने वाला है। आप JavaScript migration template scripts उत्पन्न करने के लिए sequelize-cli का उपयोग कर सकते हैं। लेकिन, ऐसा प्रतीत होता है कि लगभग सभी ORMs में यही स्थिति है। एक relational database में माइग्रेट करना अधिकांश मामलों में आसान नहीं होता।
  • दस्तावेज़ीकरण इतना अच्छा नहीं है। यह बेहतर हुआ है लेकिन अभी भी सुधार की आवश्यकता है। लेकिन ChatGPT जैसे टूल्स के साथ, यह उतना बड़ा मुद्दा नहीं है जितना पहले हुआ करता था, क्योंकि ChatGPT के पास Sequelize की बहुत अच्छी समझ है, संभवतः इस कारण कि Sequelize एक दशक से मौजूद है।
  • Prisma की तुलना में Sequelize type-sensitive नहीं है, जो समस्याओं का कारण बन सकता है।
  • यह TypeScript का अच्छी तरह समर्थन नहीं करता, जो मेरे प्रोजेक्ट के लिए समस्या नहीं है, लेकिन कई अन्य प्रोजेक्ट्स के लिए यह एक बड़ा मुद्दा हो सकता है।

Prisma के फायदे और नुकसान

फायदे:

  • इसकी अपनी schema language है। इसका अर्थ है कि आप अपने schema/model को अधिक आसानी से और साफ़ तरीके से बना सकते हैं। उदाहरण के लिए, हमारे बड़े डेटासेट का Mongoose निरूपण लगभग 262 पंक्तियों का था (स्पेस सहित)। लेकिन Prisma द्वारा दर्शाया गया वही डेटासेट केवल 221 पंक्तियों का था (स्पेस सहित)।
  • Prisma के पास एक CLI टूल है जो आपके डेटाबेस के निर्माण और माइग्रेशन (संशोधन) को आसान बनाता है। जो बहुत सुविधाजनक है। यह कोई जादुई समाधान नहीं है, लेकिन ORM से अब तक मैंने जो सबसे अच्छा देखा है, वह यही है।
  • raw SQL queries का समर्थन करता है।
  • Prisma का कोड साफ़ और सरल है। आपको अभी भी Prisma के syntax को सीखना और समझना होगा, लेकिन यह Sequelize के syntax की तुलना में समझने में कहीं आसान है।
  • Prisma के पास एक client है जो Node.js और TypeScript के लिए स्वचालित रूप से query builders उत्पन्न करता है।
  • दस्तावेज़ीकरण बहुत बहुत अच्छा और साफ़ है। ChatGPT अभी भी मदद कर सकता है, लेकिन Prisma के बारे में यह Sequelize जितना अद्यतन नहीं है।
  • 15 मई, 2023 तक:
    • NPM पर, Prisma को आखिरी बार “6 days ago” अपडेट किया गया था और इसे 1,344,705 साप्ताहिक डाउनलोड मिलते हैं।
    • GitHub पर, Prisma को आखिरी बार “3 hours ago” अपडेट किया गया था, इसके 1.1k Forks हैं, और 31.3k Stars हैं।

नुकसान:

  • Postgres के लिए Regex filtering का समर्थन नहीं करता, लेकिन “contains”, “includes”, और “startsWith” filter विकल्पों का समर्थन करता है।
  • मेरे परीक्षण के अनुसार, Postgres में हमारे बड़े डेटासेट की प्रविष्टियाँ बनाने में Prisma काफी धीमा है। Sequelize ने उन बड़े प्रविष्टियों को लगभग 2.26 सेकंड प्रति प्रविष्टि (JSON file) की दर से बनाया। जबकि Prisma की दर लगभग 11.21 सेकंड प्रति प्रविष्टि (JSON file) थी। इन परिणामों के आधार पर, इस कार्य में Prisma Sequelize से लगभग 5 गुना धीमा है।
  • साथ ही, बड़े डेटासेट से एक प्रविष्टि हटाने पर लगभग 4 मिनट की प्रतीक्षा लगी, जो बहुत बहुत खराब है।
  • मेरे परीक्षणों में सबसे बड़े और सबसे जटिल डेटासेट से एक प्रविष्टि हटाने में Sequelize बहुत तेज़ था। डेटासेट के निर्माण के मामले में Sequelize को Prisma पर कोई बढ़त नहीं थी। दोनों को इस बड़े डेटासेट के लिए तीन-स्तरीय गहरे संबंध से निपटना पड़ा, इसलिए मैं कहूँगा कि यह एक उचित तुलना थी।
  • Prisma एक स्टार्टअप है, जिसका अर्थ है कि Prisma एक लाभ-उन्मुख कंपनी है, जिसे $56.5 million का वित्तपोषण मिला है। यह जानते हुए, Prisma का मुख्य ORM code/package Apache-2.0 लाइसेंस के साथ ओपन सोर्स है। यह अच्छा है, लेकिन चूँकि Prisma के निवेशक हैं, मुझे आश्चर्य नहीं होगा यदि वे अपने लाइसेंस के मामले में MongoDB जैसा कदम उठाएँ।

स्रोत