Joins এবং Eager Loading এর মাধ্যমে Multiple Tables Query করা

Active Record Query Interface - রুবি অন রেইল (Ruby on Rails) - Web Development

281

Ruby on Rails-এ joins এবং eager loading হল দুটি গুরুত্বপূর্ণ কৌশল, যা ডেটাবেসের একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি এবং ডেটা একসাথে লোড করার জন্য ব্যবহৃত হয়। এই কৌশলগুলির মাধ্যমে আমরা N+1 query problem থেকে মুক্তি পেতে পারি এবং ডেটাবেসের কর্মক্ষমতা উন্নত করতে পারি।


Joins ব্যবহার করে Multiple Tables Query করা

Rails-এ joins ব্যবহার করে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি এবং একসাথে ডেটা নিয়ে আসা যায়। সাধারণত, এটি INNER JOIN হিসেবে কাজ করে, যা দুটি টেবিলের মিলিত রেকর্ডগুলি ফেরত দেয়।

উদাহরণ: Users এবং Posts টেবিলের মধ্যে Joins

ধরা যাক, আমাদের একটি User মডেল এবং একটি Post মডেল আছে যেখানে User এবং Post এর মধ্যে সম্পর্ক রয়েছে। এক ব্যবহারকারীর একাধিক পোস্ট থাকতে পারে, অর্থাৎ এটি one-to-many relationship

class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  belongs_to :user
end

এখন, আমরা যদি ব্যবহারকারীদের সাথে তাদের পোস্টের ডেটা একসাথে নিয়ে আসতে চাই, তাহলে joins ব্যবহার করতে পারি।

users_with_posts = User.joins(:posts).select('users.name, posts.title')

এখানে User.joins(:posts) ব্যবহার করে users এবং posts টেবিলের মধ্যে একটি INNER JOIN করা হয়েছে। select মেথড ব্যবহার করে আমরা শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো নির্বাচন করেছি, যেমন users.name এবং posts.title


Joins এর মাধ্যমে Conditions এবং Filtering

Joins এর সাথে আপনি শর্ত (conditions) প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, আপনি যদি এমন ব্যবহারকারীদের খুঁজে বের করতে চান, যাদের পোস্টের শিরোনাম "Ruby on Rails" রয়েছে, তাহলে এটি করতে পারেন:

users_with_ruby_posts = User.joins(:posts).where(posts: { title: 'Ruby on Rails' })

এখানে, where(posts: { title: 'Ruby on Rails' }) শর্তটি posts টেবিলের title ফিল্ডে "Ruby on Rails" থাকা ব্যবহারকারীদের রেকর্ড ফিল্টার করে ফিরিয়ে দেবে।


Eager Loading ব্যবহার করা

Eager loading হল একটি কৌশল যা ডেটাবেসের একাধিক সম্পর্কিত টেবিল থেকে ডেটা একসাথে লোড করতে সহায়তা করে, যাতে N+1 query problem এড়ানো যায়। সাধারণত, যখন আপনি সম্পর্কিত টেবিলের ডেটা একের পর এক লোড করেন, তখন অনেক বেশি কোয়েরি রান হয় (একটি মূল কোয়েরি এবং প্রতিটি সম্পর্কিত রেকর্ডের জন্য আলাদা কোয়েরি)। এটির সমাধান হিসেবে eager loading ব্যবহার করা হয়।

Rails-এ eager loading এর জন্য includes ব্যবহার করা হয়।

উদাহরণ: Users এবং তাদের Posts লোড করা

ধরা যাক, আমাদের একটি User এবং Post মডেল রয়েছে, এবং আমরা ব্যবহারকারীদের সাথে তাদের সমস্ত পোস্ট লোড করতে চাই।

users = User.includes(:posts).all

এটি eager loading এর মাধ্যমে users এবং তাদের সাথে সম্পর্কিত posts ডেটা একসাথে লোড করবে, যাতে users এবং posts টেবিলের জন্য আলাদা আলাদা কোয়েরি চালাতে না হয়।


Joins এবং Eager Loading এর মধ্যে পার্থক্য

  • Joins ব্যবহার করলে মূলত একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করা হয় এবং একসাথে ডেটা আনতে ব্যবহার হয়। তবে, এটি সাধারণত INNER JOIN হয়, যেখানে শুধুমাত্র মেলে এমন রেকর্ডগুলো ফিরিয়ে আনা হয়।
  • Eager Loading (যা includes এর মাধ্যমে করা হয়) ডেটাবেসে সম্পর্কিত টেবিলের সব রেকর্ড একসাথে লোড করার জন্য ব্যবহৃত হয়। এটি N+1 query problem থেকে মুক্তি পেতে সহায়তা করে, কারণ এখানে সব সম্পর্কিত রেকর্ড একসাথে লোড করা হয়।

Joins এবং Eager Loading এর Performance Optimization

Joins এবং Eager Loading উভয়ই ডেটাবেস কর্মক্ষমতা উন্নত করার জন্য গুরুত্বপূর্ণ কৌশল, তবে তাদের ব্যবহারে কিছু পার্থক্য রয়েছে:

  • Joins আপনাকে ডেটা মেলানোর জন্য একটি একক কোয়েরি তৈরি করতে সাহায্য করে এবং সাধারণত একসাথে সম্পর্কিত ডেটা বের করতে দ্রুত। তবে, এটি প্রয়োগ করতে হলে আপনি select বা where ক্লজ ব্যবহার করে আরও নির্দিষ্ট ডেটা বের করতে হবে।
  • Eager Loading সাধারণত এমন পরিস্থিতিতে উপকারী, যেখানে আপনি একাধিক সম্পর্কিত রেকর্ড একসাথে লোড করতে চান এবং N+1 query problem থেকে মুক্তি পেতে চান। এখানে Rails ডেটা একসাথে লোড করার জন্য একাধিক কোয়েরি চালায়, তবে এটি একাধিক কোয়েরি চালানোর কারণে সঠিকভাবে ব্যবহৃত হলে কর্মক্ষমতা উন্নত করতে সহায়তা করে।

Example: Users, Posts, এবং Comments এর Joins এবং Eager Loading

ধরা যাক, আমাদের User, Post, এবং Comment মডেল রয়েছে এবং আমরা এই সম্পর্কিত ডেটা একসাথে লোড করতে চাই। প্রথমে আমরা User এবং Post টেবিলের মধ্যে joins ব্যবহার করি:

users_with_posts = User.joins(:posts).where(posts: { title: 'Ruby on Rails' })

এখানে, আমরা users এবং posts টেবিলের মধ্যে INNER JOIN করেছি এবং title ফিল্ডের শর্তও প্রয়োগ করেছি।

এখন, eager loading ব্যবহার করে একই ডেটা একসাথে লোড করতে:

users_with_posts = User.includes(:posts).where(posts: { title: 'Ruby on Rails' })

এটি দুইটি আলাদা কোয়েরি চালিয়ে users এবং তাদের সম্পর্কিত posts একসাথে লোড করবে।


সারমর্ম

Rails-এ joins এবং eager loading দুটি শক্তিশালী কৌশল যা multiple tables query পরিচালনা করতে ব্যবহৃত হয়। Joins সাধারণত সম্পর্কিত টেবিলের মধ্যে ডেটা মেলানোর জন্য ব্যবহৃত হয়, যেখানে eager loading একাধিক সম্পর্কিত টেবিলের ডেটা একসাথে লোড করতে ব্যবহৃত হয়, যা N+1 query problem থেকে মুক্তি দেয়। এই দুটি কৌশল ডেটাবেসের কর্মক্ষমতা উন্নত করতে সহায়তা করে এবং জটিল কোয়েরি পরিচালনায় সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...