Sequelize বনাম Prisma
শুরু
বর্তমানে eBay-এ, আমি আমাদের অভ্যন্তরীণ টুলগুলোকে MongoDB থেকে Postgres-এ স্থানান্তর করছি। এটি এমন একটি প্রকল্প যা খুবই কঠিন, কিন্তু আমি এটিকে সরাসরি মোকাবিলা করতে উদ্দীপ্ত। গবেষণা করার সময়, আমি নির্ধারণ করেছি যে আমাদের কোডবেসের জন্য একটি ORM ব্যবহার করাই সবচেয়ে ভালো হবে, কারণ কোডবেসটি ইতিমধ্যেই Mongoose ব্যবহার করার জন্য নকশা করা ছিল। কিন্তু এখন চ্যালেঞ্জ হলো, কোন ORM আমাদের কোডবেসের জন্য সবচেয়ে ভালো হবে? এই ব্লগে, আমি সেই প্রশ্নটিতে গভীরভাবে যাব। দয়া করে লক্ষ্য করুন, আমার নিয়োগকর্তার সঙ্গে আমার যোগাযোগের প্রকৃতির কারণে আমি এই ব্লগে সবকিছু প্রকাশ করতে পারি না।
প্রয়োজনীয়তা
প্রকল্পের চাহিদার সতর্ক বিশ্লেষণের পর, আমি নিম্নলিখিত অপরিহার্য মানদণ্ডগুলো নির্ধারণ করেছি, যা যেকোনো ORM সমাধানকে পূরণ করতে হবে:
- একটি JavaScript প্যাকেজ হতে হবে; কারণ কোডের বেশিরভাগই JavaScript-এ লেখা
- Postgres এবং এর বেশিরভাগ বৈশিষ্ট্য সমর্থন করতে হবে
- এর কর্মক্ষমতা অবশ্যই Mongoose-এর সমপর্যায়ে বা তার চেয়ে ভালো হতে হবে
- ওপেন সোর্স এবং রক্ষণাবেক্ষণাধীন হতে হবে
ORM-সমূহ
অনেক গবেষণা করার পর, আমি নির্ধারণ করেছি যে প্রয়োজনীয়তার সঙ্গে সবচেয়ে ভালোভাবে মানানসই শীর্ষ তিনটি ORM হলো: Sequelize, Prisma, এবং TypeORM। শেষ পর্যন্ত আমি শুধু Sequelize এবং Prisma-র ওপর মনোযোগ দেওয়ার সিদ্ধান্ত নিয়েছি, কারণ সময়সীমার কারণে তিনটি ভিন্ন ORM সম্পূর্ণভাবে পরীক্ষা করার সময় আমার ছিল না।
পরীক্ষার পরিবেশ
আমার পরীক্ষার পরিবেশের জন্য, আমি Docker-এর মাধ্যমে Postgres চালিয়েছি। আমি আমাদের সবচেয়ে বড় এবং সবচেয়ে জটিল ডেটাসেটটি নিয়েছি, সেটিকে একটি ডকুমেন্ট কাঠামো থেকে একটি টেবিল কাঠামোতে রূপান্তর করেছি, এবং সেটি আমার স্থানীয় Postgres ইনস্ট্যান্সে যোগ করেছি। আমি ডেটাসেটটি কলাম, এক-থেকে-এক সম্পর্ক, এক-থেকে-অনেক সম্পর্ক, এবং কিছু JSONB কলাম ব্যবহার করে রূপান্তর করেছি।
সেখান থেকে, আমি এমন JavaScript কোড লিখতাম যা সেই নির্দিষ্ট ORM ব্যবহার করে এবং পরিমাপ করতাম:
- একটি এন্ট্রি তৈরি করতে কত সময় লাগবে
- একটি এন্ট্রি আপডেট করতে কত সময় লাগবে
- একটি নেস্টেড এন্ট্রি আপডেট করতে কত সময় লাগবে (সম্পর্ক এবং/অথবা একটি JSON-এ কী-মান)
- একটি এন্ট্রি মুছতে কত সময় লাগবে
- একটি এন্ট্রি কুয়েরি/আনা করতে কত সময় লাগবে
আমি প্রতিটি ORM পরীক্ষার পরিবেশের জন্য রিপো তৈরি করেছি। আমি এগুলো শেয়ার করতে খুবই চাই, কিন্তু প্রযুক্তিগতভাবে এগুলো eBay-এর মালিকানাধীন, তাই আমি সেগুলো শেয়ার করতে পারি না।
ফলাফল
২০২৩ সালের ১৫ মে-র দিকে, আমি সিদ্ধান্ত নিয়েছিলাম যে Sequelize আমাদের ব্যবহারের ক্ষেত্রে ভালো ORM, এবং এটিই হবে MongoDB থেকে Postgres-এ আমাদের মাইগ্রেশনের জন্য ব্যবহৃত ORM। শেষ পর্যন্ত, আমি Sequelize বেছে নিয়েছি কারণ:
- এটি “আসল অর্থে ওপেন-সোর্স” ছিল এবং কোনো অর্থায়িত স্টার্টআপ দ্বারা রক্ষণাবেক্ষণ করা হচ্ছিল না।
- Postgres-এর বেশিরভাগ বৈশিষ্ট্য সমর্থন করত।
- ভালো কর্মক্ষমতা ছিল, বিশেষ করে Prisma-র তুলনায়।
- ভালো ডকুমেন্টেশন ছিল, যদিও Prisma-র ডক্সের মতো এতটা ভালোভাবে নথিবদ্ধ ছিল না।
আমি Sequelize-এ স্থির হয়েছিলাম, কিন্তু আমি যে প্রতিটি ORM পরীক্ষা করেছি, সেগুলোর জন্য একটি সুবিধা ও অসুবিধার তালিকাও তৈরি করেছি এই আশায় যে এটি মানুষকে আরও ভালোভাবে নির্ধারণ করতে সাহায্য করবে যে Sequelize বা Prisma আপনার ব্যবহারের ক্ষেত্রে কাজ করবে কি না।
Sequelize-এর সুবিধা ও অসুবিধা
সুবিধাসমূহ:
- একটি sync() ফাংশন আছে যা স্বয়ংক্রিয়ভাবে আপনার জন্য টেবিল তৈরি ও পরিচালনা করে
- জটিল জয়েন (নেস্টেড ডেটা) সামলাতে পারে
- অনেক ফিল্টারিং বিকল্প সমর্থন করে (যেমন Regex)
- মডেল/স্কিমা উপস্থাপনাটি ক্লাস ব্যবহার করে সরাসরি JavaScript-এ করা হয়, যা অত্যন্ত কাস্টমাইজযোগ্য।
- Sequelize আপনার নির্বাচিত ডেটাবেসের জন্য সংযোগ পরিচালনা করে।
- Sequelize একাধিক read-connection সমর্থন করে
- raw SQL কুয়েরি সমর্থন করে।
- ২০২৩ সালের ১৫ মে পর্যন্ত:
- NPM-এ, Sequelize শেষবার আপডেট হয়েছিল “১৪ দিন আগে” এবং সাপ্তাহিক ১,৫০৫,৮৩৫ বার ডাউনলোড হয়।
- GitHub-এ, Sequelize শেষবার আপডেট হয়েছিল “গতকাল”, এতে 4.2k Forks এবং 27.9k Stars আছে।
- Sequelize-এর MIT লাইসেন্স আছে এবং এটি ১০ বছরেরও বেশি সময় ধরে ওপেন সোর্স। তাই নিকট ভবিষ্যতে এটি সম্ভবত ওপেন সোর্সই থাকবে।
অসুবিধাসমূহ:
- মডেল/স্কিমা উপস্থাপনাটি খুব জটিল এবং ভারী হয়ে যেতে পারে। উদাহরণস্বরূপ, আমাদের বড় ডেটাসেটের Mongoose উপস্থাপনাটি ছিল প্রায় 262 লাইন (স্পেসসহ)। একই ডেটাসেট Sequelize-এর মাধ্যমে উপস্থাপন করলে হয় 564 লাইন (স্পেসসহ)।
- Sequelize-এর সিনট্যাক্স কিছু ক্ষেত্রে সত্যিই বিভ্রান্তিকর এবং জটিল হয়ে ওঠে।
- আপনার ডেটাবেস মাইগ্রেট করা (এডিট করা) খুবই বিরক্তিকর। আপনি sequelize-cli ব্যবহার করে JavaScript মাইগ্রেশন টেমপ্লেট স্ক্রিপ্ট তৈরি করতে পারেন। কিন্তু, মনে হয় প্রায় সব ORM-এ একই অবস্থা। বেশিরভাগ ক্ষেত্রে রিলেশনাল ডেটাবেসে মাইগ্রেশন করা সহজ নয়।
- ডকুমেন্টেশন তেমন ভালো নয়। এটি উন্নত হয়েছে, কিন্তু এখনও কাজ দরকার। তবে ChatGPT-এর মতো টুলের সঙ্গে এটি এখন আর আগের মতো বড় সমস্যা নয়, কারণ ChatGPT-এর Sequelize সম্পর্কে খুব ভালো ধারণা আছে, সম্ভবত Sequelize এক দশক ধরে বিদ্যমান থাকার কারণেই।
- Prisma-এর তুলনায় Sequelize টাইপের প্রতি ততটা সংবেদনশীল নয়, যা সমস্যার সৃষ্টি করতে পারে।
- এটি TypeScript ভালোভাবে সমর্থন করে না, যা আমার প্রকল্পের জন্য সমস্যা নয়, কিন্তু অনেক অন্য প্রকল্পের জন্য এটি বড় সমস্যা হতে পারে।
Prisma-এর সুবিধা ও অসুবিধা
সুবিধাসমূহ:
- এর নিজস্ব স্কিমা ভাষা আছে। এর অর্থ হলো, আপনি আরও সহজে ও পরিচ্ছন্নভাবে আপনার স্কিমা/মডেল তৈরি করতে পারেন। উদাহরণস্বরূপ, আমাদের বড় ডেটাসেটের Mongoose উপস্থাপনাটি ছিল প্রায় 262 লাইন (স্পেসসহ)। কিন্তু Prisma দ্বারা উপস্থাপিত একই ডেটাসেট ছিল মাত্র 221 লাইন (স্পেসসহ)।
- Prisma-এর একটি CLI টুল আছে, যা আপনার ডেটাবেস তৈরি এবং মাইগ্রেশন (পরিবর্তন) প্রক্রিয়াকে আরও সহজ করে। যা খুবই সুবিধাজনক। এটি কোনো সর্বকাজের সমাধান নয়, কিন্তু এখন পর্যন্ত ORM থেকে দেখা সেরা জিনিসগুলোর একটি।
- raw SQL কুয়েরি সমর্থন করে।
- Prisma-র কোড পরিষ্কার ও সরল। আপনাকে এখনও Prisma-এর সিনট্যাক্স শিখতে এবং তা বুঝে নিতে হবে, কিন্তু এটি Sequelize-এর সিনট্যাক্সের তুলনায় অনেক সহজে বোঝা যায়।
- Prisma-এর একটি ক্লায়েন্ট আছে যা স্বয়ংক্রিয়ভাবে Node.js ও TypeScript-এর জন্য query builder তৈরি করে।
- ডকুমেন্টেশন খুবই, খুবই ভালো এবং পরিষ্কার। ChatGPT এখনও সাহায্য করতে পারে, কিন্তু Prisma সম্পর্কে এটি Sequelize-এর মতো আপ-টু-ডেট নয়।
- ২০২৩ সালের ১৫ মে পর্যন্ত:
- NPM-এ, Prisma শেষবার আপডেট হয়েছিল “৬ দিন আগে” এবং সাপ্তাহিক ১,৩৪৪,৭০৫ বার ডাউনলোড হয়।
- GitHub-এ, Prisma শেষবার আপডেট হয়েছিল “৩ ঘণ্টা আগে”, এতে 1.1k Forks এবং 31.3k Stars আছে।
অসুবিধাসমূহ:
- Postgres-এর জন্য Regex ফিল্টারিং সমর্থন করে না, তবে “contains”, “includes”, এবং “startsWith” ফিল্টার বিকল্প আছে।
- আমার পরীক্ষায়, Postgres-এ আমাদের বড় ডেটাসেটের এন্ট্রি তৈরি করতে Prisma উল্লেখযোগ্যভাবে ধীর ছিল। Sequelize ওই বড় এন্ট্রিগুলো তৈরি করেছিল প্রতি এন্ট্রিতে প্রায় 2.26 সেকেন্ড হারে (JSON ফাইল)। অন্যদিকে Prisma-এর হার ছিল প্রতি এন্ট্রিতে প্রায় 11.21 সেকেন্ড (JSON ফাইল)। এই ফলাফলের ভিত্তিতে, এই কাজে Prisma, Sequelize-এর তুলনায় প্রায় 5x ধীর।
- এছাড়াও, বড় ডেটাসেট থেকে একটি এন্ট্রি মুছতে প্রায় ৪ মিনিট অপেক্ষা করতে হয়েছে, যা খুবই, খুবই খারাপ।
- আমার পরীক্ষায় সবচেয়ে বড় এবং সবচেয়ে জটিল ডেটাসেটে একটি এন্ট্রি মুছতে Sequelize অনেক দ্রুত ছিল। ডেটাসেট নির্মাণের ক্ষেত্রে Sequelize-এর Prisma-এর ওপর কোনো সুবিধা ছিল না। এই বড় ডেটাসেটের জন্য উভয়কেই তিন-স্তর গভীর সম্পর্কের সঙ্গে মোকাবিলা করতে হয়েছে, তাই আমি বলব এটি একটি ন্যায্য তুলনা ছিল।
- Prisma একটি স্টার্টআপ, অর্থাৎ Prisma একটি লাভজনক কোম্পানি, যার 56.5 মিলিয়ন ডলার তহবিল রয়েছে। এটি জেনে, 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