গ্রাফকিউএল (GraphQL)-এ Pagination হল একটি গুরুত্বপূর্ণ ফিচার, যা ডেটা একাধিক পৃষ্ঠায় ভাগ করে ক্লায়েন্টের কাছে পাঠানোর জন্য ব্যবহৃত হয়। যখন ডেটার পরিমাণ খুব বড় হয়, তখন একযোগে সব ডেটা ফেরত পাঠানো কার্যকরী নয়। Pagination এর মাধ্যমে ডেটার ছোট ছোট অংশ সরবরাহ করা হয়, যাতে ক্লায়েন্ট একবারে একটি নির্দিষ্ট পরিমাণ ডেটা দেখতে পারে।
গ্রাফকিউএল-এ দুটি প্রধান Pagination কৌশল ব্যবহৃত হয়: Offset-Based Pagination এবং Cursor-Based Pagination।
Offset-Based Pagination
Offset-Based Pagination হল সবচেয়ে প্রচলিত এবং সাধারণ Pagination পদ্ধতি। এই পদ্ধতিতে, ডেটা একটি নির্দিষ্ট পরিমাণে বিভক্ত করা হয় এবং ক্লায়েন্টের পক্ষে পরবর্তী বা পূর্ববর্তী ডেটা পাওয়ার জন্য একটি skip এবং limit অথবা offset এবং limit প্যারামিটার ব্যবহার করা হয়। সাধারণত, একটি skip প্যারামিটার ব্যবহার করে নির্দিষ্ট পরিমাণ ডেটা উপেক্ষা করা হয় এবং limit প্যারামিটার ব্যবহার করে কতগুলি ফলাফল ফেরত আসবে তা নির্ধারণ করা হয়।
উদাহরণ:
ধরা যাক, একটি Post টাইপ আছে, যার মধ্যে id, title, এবং content রয়েছে, এবং আপনি একটি posts কুয়েরি তৈরি করতে চান যেখানে ডেটা পেজিনেট করা হবে।
Schema:
type Post {
id: ID!
title: String!
content: String!
}
type Query {
posts(skip: Int, limit: Int): [Post]
}
এখন, আপনি যখন কুয়েরি করবেন:
query {
posts(skip: 0, limit: 10) {
id
title
content
}
}
এখানে:
- skip: ডেটার কোন অংশ উপেক্ষা করা হবে (এই ক্ষেত্রে 0 থেকে শুরু)।
- limit: কতগুলি পোস্ট ফেরত আসবে (এই ক্ষেত্রে 10টি পোস্ট)।
Offset-Based Pagination এর সুবিধা:
- সহজ Implement করা যায়, কারণ এটি একটি সাধারণ কুয়েরি এবং ফলাফল পাওয়ার জন্য সহজ প্যারামিটার ব্যবহার করে।
- ইউজার ইন্টারফেস এ সহজে প্রয়োগ করা যায়।
অসুবিধা:
- ডেটা পরিবর্তন হলে সমস্যা হতে পারে: যদি কোনও পোস্ট মুছে যায় বা নতুন পোস্ট যোগ করা হয়, তবে পরবর্তী পৃষ্ঠার ডেটা সঠিকভাবে ফেরত আসতে পারে না। এর ফলে skip এবং limit এর মান সঠিকভাবে কাজ না করার সম্ভাবনা থাকে।
- বৃহৎ ডেটা সেটের জন্য কম্প্লেক্স হতে পারে, কারণ প্রতিবার নতুন ডেটা ফেরত পাওয়ার জন্য সার্ভারকে skip করার সংখ্যা হিসাব করতে হয়।
Cursor-Based Pagination
Cursor-Based Pagination একটি উন্নত পদ্ধতি, যা ডেটার নির্দিষ্ট পয়েন্ট বা cursor ব্যবহার করে পরবর্তী বা পূর্ববর্তী ডেটা অ্যাক্সেস করতে সহায়ক হয়। প্রতিটি ডেটা রেকর্ডের সাথে একটি cursor থাকে, যা একটি নির্দিষ্ট ডেটার অবস্থান নির্দেশ করে। ক্লায়েন্ট cursor ব্যবহার করে পরবর্তী পৃষ্ঠায় পৌঁছাতে পারে। এটি সাধারণত ডেটার অর্ডার বজায় রাখতে এবং offset-based pagination এর সমস্যা এড়াতে সাহায্য করে।
উদাহরণ:
ধরা যাক, আমাদের Post টাইপের ডেটা রয়েছে এবং আমরা cursor-based pagination ব্যবহার করতে চাই।
Schema:
type Post {
id: ID!
title: String!
content: String!
cursor: String! # Cursor ফিল্ড
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
endCursor: String
startCursor: String
}
type PostConnection {
edges: [Post]
pageInfo: PageInfo
}
type Query {
posts(first: Int, after: String, last: Int, before: String): PostConnection
}
এখানে:
firstএবংafterপ্যারামিটারগুলি প্রথম কয়েকটি পোস্টের জন্য ব্যবহার করা হয়, এবং পরবর্তী পৃষ্ঠার জন্য cursor ব্যবহার করা হয়।lastএবংbeforeপ্যারামিটারগুলি পূর্ববর্তী পৃষ্ঠা দেখতে সহায়ক হয়।
Cursor-Based Pagination Query Example:
query {
posts(first: 5, after: "cursor_value") {
edges {
id
title
content
cursor
}
pageInfo {
hasNextPage
hasPreviousPage
endCursor
startCursor
}
}
}
এখানে:
- first: প্রথম 5টি পোস্ট পেতে নির্দেশ করে।
- after: যে পোস্টের পর থেকে নতুন পোস্ট শুরু হবে, তার cursor।
- endCursor: সর্বশেষ পোস্টের cursor, যা পরবর্তী পৃষ্ঠার জন্য ব্যবহৃত হবে।
- hasNextPage: যদি পরবর্তী পৃষ্ঠা থাকে তাহলে true হবে।
- hasPreviousPage: পূর্ববর্তী পৃষ্ঠা থাকলে true হবে।
Cursor-Based Pagination এর সুবিধা:
- ডেটা অর্ডার সঠিক রাখা: ডেটার অবস্থান ও সময় পরিবর্তনের কারণে cursor-based pagination ডেটার অর্ডার এবং সঠিকতা বজায় রাখে।
- পোস্ট মুছে ফেলা বা যোগ করা হলে সমস্যার সমাধান: cursor-based pagination ডেটার যেকোনো পরিবর্তন (যেমন নতুন ডেটা যোগ করা বা পুরোনো ডেটা মুছে ফেলা) সহ কাজ করতে পারে, কারণ এটি একটি নির্দিষ্ট
cursorপয়েন্ট ব্যবহার করে।
অসুবিধা:
- কিছুটা জটিল: offset-based pagination এর তুলনায় এটি কিছুটা জটিল হতে পারে, বিশেষ করে ডেটা রিটার্ন করার প্রক্রিয়া এবং
cursorতৈরির জন্য অতিরিক্ত লজিক প্রয়োজন। - গ্রাফকিউএল স্কিমা আরও জটিল: cursor-based pagination বাস্তবায়ন করতে আপনাকে আরো জটিল স্কিমা এবং pageInfo এর মতো অতিরিক্ত ফিল্ড যুক্ত করতে হয়।
সারাংশ
Offset-Based Pagination এবং Cursor-Based Pagination দুটি জনপ্রিয় কৌশল গ্রাফকিউএল পেজিনেটিংয়ে ব্যবহৃত হয়। Offset-Based Pagination সহজ এবং দ্রুত বাস্তবায়নযোগ্য হলেও, এতে ডেটার পরিবর্তনের কারণে সমস্যা সৃষ্টি হতে পারে। অপরদিকে, Cursor-Based Pagination ডেটার অবস্থান নির্ধারণের মাধ্যমে সঠিক ফলাফল প্রদান করে এবং পরিবর্তিত ডেটার ক্ষেত্রে আরও নির্ভরযোগ্য, তবে এটি কিছুটা জটিল। গ্রাফকিউএল-এ এই দুটি কৌশল ডেটার পৃষ্ঠায় বিভক্তি এবং ক্লায়েন্টের প্রয়োজন অনুযায়ী ডেটা সরবরাহের ক্ষেত্রে অত্যন্ত কার্যকরী।
Read more