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