Sequelize विरुद्ध Prisma
सुरुवात
सध्या eBay मध्ये, मी आमची अंतर्गत साधने MongoDB वरून Postgres वर स्थलांतरित करत आहे. हा प्रकल्प अतिशय कठीण आहे, पण तो थेट हाती घेण्यासाठी मी उत्सुक आहे. संशोधन करताना, आमच्या कोडबेससाठी ORM वापरणे योग्य ठरेल असे मला आढळले, कारण कोडबेस आधीपासूनच Mongoose वापरण्यासाठी तयार करण्यात आला होता. पण आता आव्हान असे आहे की, आमच्या कोडबेससाठी कोणते ORM सर्वोत्तम ठरेल? या ब्लॉगमध्ये मी या प्रश्नाचा सखोल विचार करणार आहे. कृपया लक्षात घ्या की माझ्या नोकरीदात्याशी असलेल्या संबंधांच्या स्वरूपामुळे या ब्लॉगमध्ये मी सर्व काही उघड करू शकत नाही.
आवश्यकता
प्रकल्पाच्या गरजांचे काळजीपूर्वक विश्लेषण केल्यानंतर, कोणत्याही ORM उपायाने पूर्ण करणे आवश्यक असलेले पुढील निकष मी निश्चित केले:
- JavaScript पॅकेज असावे; कारण बहुतांश कोड JavaScript मध्ये लिहिलेला आहे
- Postgres आणि त्याच्या बहुतांश वैशिष्ट्यांना समर्थन असणे आवश्यक आहे
- त्याची कार्यक्षमता Mongoose इतकी किंवा त्याहून चांगली असणे आवश्यक आहे
- मुक्त-स्रोत आणि देखभाल केलेले असावे
ORM
बराच संशोधन केल्यानंतर, आवश्यकतांशी जुळणारे तीन प्रमुख ORM पुढीलप्रमाणे आहेत असे मला आढळले: Sequelize, Prisma, आणि TypeORM. अंतिम मुदतीमुळे तीन वेगवेगळ्या ORM ची पूर्ण चाचणी करण्यासाठी माझ्याकडे वेळ नव्हता, म्हणून शेवटी मी फक्त Sequelize आणि Prisma यांच्यावर लक्ष केंद्रित करण्याचा निर्णय घेतला.
चाचणीचे वातावरण
माझ्या चाचणीच्या वातावरणासाठी, मी Docker द्वारे Postgres चालवले. आमचा सर्वात मोठा आणि अधिक गुंतागुंतीचा डेटासेट घेतला, तो दस्तऐवज संरचनेतून सारणी संरचनेत रूपांतरित केला आणि माझ्या स्थानिक Postgres उदाहरणात जोडला. स्तंभ, एक-ते-एक संबंध, एक-ते-अनेक संबंध आणि काही JSONB स्तंभ वापरून मी डेटासेटचे रूपांतर केले.
त्यानंतर, मी त्या विशिष्ट ORM चा वापर करणारा JavaScript कोड लिहून पुढील गोष्टी मोजल्या:
- नोंद तयार करण्यासाठी किती वेळ लागेल
- नोंद अद्ययावत करण्यासाठी किती वेळ लागेल
- नेस्टेड नोंद (संबंध आणि/किंवा JSON मधील की-मूल्य) अद्ययावत करण्यासाठी किती वेळ लागेल
- नोंद हटवण्यासाठी किती वेळ लागेल
- नोंद क्वेरी/मिळवण्यासाठी किती वेळ लागेल
मी प्रत्येक ORM च्या चाचणी वातावरणासाठी रिपॉझिटरीज तयार केल्या. मला या रिपॉझिटरीज सामायिक करायला आवडेल, पण तांत्रिकदृष्ट्या त्यांची मालकी eBay कडे आहे, त्यामुळे मी त्या सामायिक करू शकत नाही.
परिणाम
15 मे 2023 च्या सुमारास, आमच्या वापराच्या बाबतीत Sequelize हे अधिक चांगले ORM आहे आणि MongoDB वरून Postgres वरच्या आमच्या स्थलांतरासाठी तेच ORM वापरले जावे असा मी निर्णय घेतला. शेवटी, मी 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 Forks आणि 27.9k Stars आहेत.
- Sequelize कडे MIT परवाना आहे आणि ते 10 वर्षांहून अधिक काळ मुक्त-स्रोत आहे. त्यामुळे नजीकच्या भविष्यातही ते मुक्त-स्रोत राहण्याची शक्यता सर्वाधिक आहे.
तोटे:
- मॉडेल/स्कीमा सादरीकरण खूप गुंतागुंतीचे आणि अनावश्यकपणे मोठे होऊ शकते. उदाहरणार्थ, आमच्या मोठ्या डेटासेटचे Mongoose सादरीकरण सुमारे 262 ओळींचे होते (रिकाम्या जागांसह). Sequelize द्वारे सादर केलेला तोच डेटासेट 564 ओळींचा आहे (रिकाम्या जागांसह).
- काही विशिष्ट परिस्थितींमध्ये Sequelize ची वाक्यरचना खरोखरच गोंधळात टाकणारी आणि गुंतागुंतीची होते.
- तुमचा डेटाबेस स्थलांतरित करणे (त्यात संपादन करणे) खूप त्रासदायक आहे. JavaScript स्थलांतर नमुना स्क्रिप्ट तयार करण्यासाठी तुम्ही sequelize-cli वापरू शकता. पण, जवळजवळ सर्व ORM मध्ये हीच परिस्थिती दिसते. संबंधात्मक डेटाबेसमध्ये स्थलांतर करणे बहुतांश वेळा सोपे नसते.
- दस्तऐवजीकरण फारसे चांगले नाही. त्यात सुधारणा झाली आहे, पण अजूनही कामाची गरज आहे. मात्र ChatGPT सारख्या साधनांमुळे ही समस्या पूर्वीइतकी मोठी राहिलेली नाही, कारण ChatGPT ला Sequelize चे खूप चांगले आकलन आहे; बहुधा Sequelize अस्तित्वात येऊन एक दशक झाले असल्यामुळे.
- Prisma च्या तुलनेत Sequelize प्रकाराबाबत तितके संवेदनशील नाही, ज्यामुळे समस्या उद्भवू शकतात.
- ते TypeScript ला चांगले समर्थन देत नाही, जे माझ्या प्रकल्पासाठी समस्या नाही, पण इतर अनेक प्रकल्पांसाठी मोठी समस्या ठरू शकते.
Prisma चे फायदे आणि तोटे
फायदे:
- त्याची स्वतःची स्कीमा भाषा आहे. याचा अर्थ असा की तुम्ही तुमची स्कीमा/मॉडेल अधिक सहजपणे आणि स्वच्छ पद्धतीने तयार करू शकता. उदाहरणार्थ, आमच्या मोठ्या डेटासेटचे Mongoose सादरीकरण सुमारे 262 ओळींचे होते (रिकाम्या जागांसह). पण Prisma द्वारे सादर केलेला तोच डेटासेट केवळ 221 ओळींचा होता (रिकाम्या जागांसह).
- Prisma कडे CLI साधन आहे, ज्यामुळे तुमचा डेटाबेस तयार करणे आणि स्थलांतरित करणे (बदल करणे) सोपे होते. हे अतिशय सोयीचे आहे. हा सर्व समस्यांवरचा उपाय नाही, पण ORM कडून मी आतापर्यंत पाहिलेली ही सर्वोत्तम गोष्ट आहे.
- कच्च्या SQL क्वेरींना समर्थन देते.
- Prisma चा कोड स्वच्छ आणि सोपा आहे. तुम्हाला अजूनही Prisma ची वाक्यरचना शिकावी लागते आणि ती समजून घ्यावी लागते, पण Sequelize च्या वाक्यरचनेपेक्षा ती समजणे खूप सोपे आहे.
- Prisma कडे एक क्लायंट आहे, जो Node.js आणि TypeScript साठी क्वेरी बिल्डर आपोआप तयार करतो.
- दस्तऐवजीकरण अतिशय चांगले आणि स्वच्छ आहे. ChatGPT अजूनही मदत करू शकते, पण Sequelize बाबत जितके अद्ययावत आहे तितके Prisma बाबत नाही.
- 15 मे 2023 रोजी:
- NPM वर, Prisma चे शेवटचे अद्यतन “6 दिवसांपूर्वी” झाले होते आणि त्याला साप्ताहिक 1,344,705 डाउनलोड मिळतात.
- 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 million इतका निधी असलेली नफ्यासाठी चालणारी कंपनी आहे. हे लक्षात घेता, Prisma चा मुख्य ORM कोड/पॅकेज Apache-2.0 परवान्याखाली मुक्त-स्रोत आहे. हे चांगले आहे, पण Prisma कडे गुंतवणूकदार असल्यामुळे, परवान्याच्या बाबतीत ते 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