ডাটাবেস বা API থেকে বড় পরিমাণের ডাটা ছোট ছোট টুকরো করে ইউজারকে দেখানোর প্রক্রিয়াকে Pagination (পেজিনেশন) বলা হয়। যখন আমাদের টেবিলে হাজার হাজার বা লাখ লাখ ডাটা থাকে, তখন একবারে সব ডাটা লোড না করে পেজ আকারে লোড করা হয়।
সবচেয়ে জনপ্রিয় দুটি পেজিনেশন পদ্ধতি হলো Offset Pagination এবং Cursor Pagination। নিচে এ দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো:
১. Offset Pagination (অফসেট পেজিনেশন)
এটি পেজিনেশনের সবচেয়ে সাধারণ এবং সহজ পদ্ধতি। আমরা সাধারণত ওয়েবসাইটে যে ১, ২, ৩, ৪ নম্বর পেজ বা "Next/Previous" বাটন দেখি, সেটি বেশিরভাগ সময় অফসেট পেজিনেশন দিয়েই করা হয়।
এটি কীভাবে কাজ করে?
এটি ডাটাবেসের LIMIT এবং OFFSET ক্লজ ব্যবহার করে কাজ করে।
LIMIT: একটি পেজে কয়টি ডাটা দেখানো হবে (Page Size)।
OFFSET: কয়টি ডাটা বাদ দিয়ে (Skip) পরের ডাটাগুলো নেওয়া শুরু হবে।
উদাহরণ:
ধরি, প্রতি পেজে আমরা ৫টি করে ডাটা দেখাতে চাই (LIMIT = 5)।
Page 1:
LIMIT 5 OFFSET 0(প্রথম ৫টি ডাটা আসবে)Page 2:
LIMIT 5 OFFSET 5(প্রথম ৫টি বাদ দিয়ে ৬ থেকে ১০ নম্বর ডাটা আসবে)Page 3:
LIMIT 5 OFFSET 10(প্রথম ১০টি বাদ দিয়ে ১১ থেকে ১৫ নম্বর ডাটা আসবে)
-- ২ নম্বর পেজের জন্য SQL কুয়েরি (ডাটা আইডি ১ থেকে ১০ পর্যন্ত থাকলে ৬-১০ নম্বর ডাটা আসবে)
SELECT * FROM products ORDER BY id DESC LIMIT 5 OFFSET 5;
সুবিধা (Pros):
যেকোনো পেজে সরাসরি যাওয়া যায় (Jump to Page): ইউজার চাইলে সরাসরি ১০ বা ৫০ নম্বর পেজে ক্লিক করে চলে যেতে পারে।
টোটাল পেজ সংখ্যা জানা যায়: ডাটাবেস থেকে মোট রো (Total Rows) কাউন্ট করে খুব সহজেই
Total Pages = Total Rows / Page Sizeবের করা যায়।বাস্তবায়ন করা সহজ: প্রায় সব ফ্রেমওয়ার্ক এবং ডাটাবেসে এটি বাই-ডিফল্ট সাপোর্ট করে।
অসুবিধা (Cons):
পারফরম্যান্স ড্রপ (Performance Issue): অফসেট যত বড় হবে, ডাটাবেসের গতি তত কমবে। যদি আপনি
OFFSET 100000 LIMIT 10দেন, তবে ডাটাবেসকে প্রথমে ১ লক্ষ ডাটা মেমোরিতে রিড (Scan) করতে হবে, তারপর সেগুলো ফেলে দিয়ে শেষের ১০টি ডাটা রিটার্ন করতে হবে। এটি বড় ডাটাবেসের জন্য অত্যন্ত ধীরগতির।ডাটা ডুপ্লিকেশন বা বাদ পড়া (Data Inconsistency): ইউজার যখন পেজ ১ থেকে পেজ ২-এ যাচ্ছে, তার মাঝে যদি নতুন কোনো ডাটা ডাটাবেসে ইনসার্ট হয়, তবে পেজ ১-এর শেষ ডাটাটি পেজ ২-এ আবার চলে আসতে পারে (Data Drift)।
২. Cursor Pagination (কার্সার পেজিনেশন)
বড় বড় সোশ্যাল মিডিয়া প্ল্যাটফর্ম (যেমন: Facebook, Instagram, Twitter) যেখানে আনলিমিটেড স্ক্রোলিং (Infinite Scroll) থাকে, সেখানে কার্সার পেজিনেশন ব্যবহার করা হয়।
এটি কীভাবে কাজ করে?
এখানে কোনো পেজ নম্বর বা অফসেট থাকে না। পরিবর্তে, শেষ যে ডাটাটি লোড হয়েছে, তার একটি নির্দিষ্ট ইউনিক আইডেন্টিফায়ার (যেমন: ID বা Created Timestamp) পরবর্তী রিকোয়েস্টের জন্য Cursor বা পয়েন্টার হিসেবে ব্যবহার করা হয়। ডাটাবেস সরাসরি সেই পয়েন্টারের পর থেকে ডাটা খোঁজা শুরু করে।
উদাহরণ:
ধরি, প্রতি পেজে ৫টি করে ডাটা দেখাব (LIMIT = 5) এবং ডাটাগুলো ID দিয়ে সাজানো (Order by ID)।
Request 1 (প্রথম পেজ):
SELECT * FROM posts ORDER BY id DESC LIMIT 5;ধরি, শেষ ডাটার ID হলো
42। API রেসপন্সে ডাটার সাথেnext_cursor: 42পাঠিয়ে দেওয়া হবে।
Request 2 (দ্বিতীয় পেজ): ফ্রন্টএন্ড থেকে পরবর্তী রিকোয়েস্টে
cursor=42পাঠানো হবে।SQLSELECT * FROM posts WHERE id < 42 ORDER BY id DESC LIMIT 5;ডাটাবেস সরাসরি ৪২-এর নিচের আইডিগুলো স্ক্যান করবে, ফলে আগের ডাটাগুলো তাকে রিড করতে হবে না।
সুবিধা (Pros):
অসাধারণ পারফরম্যান্স (High Performance): ডাটাবেস সরাসরি ইনডেক্স করা কার্সার (যেমন: ID) দিয়ে কুয়েরি করে। ডাটাবেসে কোটি কোটি ডাটা থাকলেও কার্সার পেজিনেশনের গতি সবসময় একই থাকে, কারণ একে কোনো ডাটা স্কিপ করতে হয় না।
ডাটা সবসময় নির্ভুল থাকে (Consistent Data): পেজ স্ক্রোল করার মাঝখানে নতুন ডাটা ইনসার্ট বা ডিলিট হলেও কোনো ডাটা ডুপ্লিকেট বা মিস হয় না, কারণ কুয়েরি সবসময় একটি নির্দিষ্ট পয়েন্টের সাপেক্ষে হয়।
অসুবিধা (Cons):
সরাসরি নির্দিষ্ট পেজে যাওয়া যায় না (No Random Access): আপনি হুট করে ৫ নম্বর বা ১০ নম্বর পেজে যেতে পারবেন না। আপনাকে অবশ্যই ক্রমান্বয়ে (Sequential) Next বা Previous করে যেতে হবে।
টোটাল পেজ কাউন্ট করা কঠিন: যেহেতু আমরা পুরো ডাটা স্ক্যান করি না, তাই মোট কতগুলো পেজ আছে তা ইউজারকে আগে থেকে দেখানো যায় না।
কোডিং একটু জটিল: কুয়েরি লজিক এবং কার্সার জেনারেট (অনেক সময় ID ও টাইমস্ট্যাম্প মিলিয়ে Base64 এনকোড করে কার্সার বানানো হয়) করা কিছুটা জটিল।
Comments
Post a Comment