দুটি কৌশল: offset-based (limit/offset) এবং cursor-based। GraphQL-এ built-in pagination নেই, তবে community-এর মান হলো Relay Connection spec, যা cursor pagination-কে আনুষ্ঠানিক রূপ দেয়।
দুটি কৌশল: offset-based (limit/offset) এবং cursor-based। GraphQL-এ built-in pagination নেই, তবে community-এর মান হলো Relay Connection spec, যা cursor pagination-কে আনুষ্ঠানিক রূপ দেয়।
items(limit: 10, offset: 20)) সরল কিন্তু live data-তে ভেঙে পড়ে: user page করার সময় কোনো row যোগ হলে item গুলো সরে যায় এবং আপনি duplicate বা ফাঁক দেখেন। গভীর offset-এ এটি ধীরও হয়ে যায় (DB তখনও এড়িয়ে যাওয়া row গুলো scan করে)।একটি connection list-টিকে edges (প্রতিটিতে একটি cursor ও node) এবং pageInfo দিয়ে মুড়ে রাখে:
type Query {
posts(first: Int!, after: String): PostConnection! # first = page size, after = cursor
}
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
type PostEdge {
cursor: String! # opaque token for THIS node's position
node: Post! # the actual item
}
type PageInfo {
endCursor: String # feed this back as 'after' for the next page
hasNextPage: Boolean! # so the client knows when to stop
}
// resolver: fetch ONE extra row to compute hasNextPage cheaply
const rows = await db.posts.find({ after: args.after, limit: args.first + 1 });
const hasNextPage = rows.length > args.first;
const page = rows.slice(0, args.first);
return {
edges: page.map((p) => ({ node: p, cursor: encodeCursor(p.id) })),
pageInfo: { endCursor: page.at(-1) && encodeCursor(page.at(-1).id), hasNextPage },
};
Cursor-টি opaque — সাধারণত sort key-এর একটি base64 — তাই client এটিকে সংখ্যা নয়, একটি token হিসেবে গণ্য করে।
Offset বনাম cursor বেছে নেওয়া দেখায় আপনি concurrent write-এর অধীনে consistency এবং গভীর-page performance বোঝেন। Relay connection-এর গঠন জানা গুরুত্বপূর্ণ কারণ Apollo/Relay client-গুলোর এর জন্য built-in cache handling আছে।
বিস্তারিত উত্তরসহ IT ইন্টারভিউ প্রশ্নের একটি লাইব্রেরি — জুনিয়র থেকে সিনিয়র পর্যন্ত।
দান করুন