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 कॉलम का उपयोग करके परिवर्तित किया।

वहाँ से, मैं उस विशेष ORM का उपयोग करने वाला JavaScript कोड लिखूँगा और मापूँगा:

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

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

परिणाम

लगभग 15 मई, 2023 को, मैंने निर्णय लिया कि Sequelize हमारे उपयोग के मामले के लिए बेहतर 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 सितारे हैं।

हानि:

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

स्रोत