Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Speed Optimization
  5. ( ডাটাবেস অপ্টিমাইজেশন )select_related এবং prefetch_related

( ডাটাবেস অপ্টিমাইজেশন )select_related এবং prefetch_related

Django-তে select_related এবং prefetch_related দুটি ফাংশন ডেটাবেস অপ্টিমাইজেশনের জন্য ব্যবহৃত হয়, কিন্তু তাদের কাজের ধরন এবং ব্যবহার ক্ষেত্রে কিছু পার্থক্য রয়েছে। নিচে আমি ব্যাখ্যা করেছি কোন ক্ষেত্রে select_related এবং কোন ক্ষেত্রে prefetch_related ব্যবহার করা উচিত।

1. select_related কখন ব্যবহার করবেন?

select_related সাধারণত ForeignKey এবং OneToOne সম্পর্কগুলোর জন্য ব্যবহৃত হয়। এটি ডেটাবেসে SQL JOIN করে কাজ করে এবং একাধিক টেবিলের ডেটা এক কোয়েরিতে নিয়ে আসে।

কবে ব্যবহার করবেন?

  • যখন আপনি ForeignKey বা OneToOne সম্পর্ক ব্যবহার করছেন।
  • যখন আপনার সম্পর্কিত মডেলের ডেটা প্রয়োজন এবং এই ডেটাগুলো এক কোয়েরিতে ফেচ করা সম্ভব।

কীভাবে কাজ করে?

  • select_related মূলত JOIN করে সম্পর্কিত মডেলের ডেটা সংগ্রহ করে। এটি প্রতিটি সম্পর্কিত টেবিলের ডেটা একসাথে নিয়ে আসে, তাই একাধিক কোয়েরির প্রয়োজন হয় না।

উদাহরণ:

ধরুন, আপনার Employee মডেলে ForeignKey হিসাবে Department আছে:

# models.py
class Department(models.Model):
    name = models.CharField(max_length=100)

class Employee(models.Model):
    name = models.CharField(max_length=100)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)

কোয়েরি:

# View
employees = Employee.objects.select_related('department').all()

SQL JOIN Query:

SELECT employee.id, employee.name, department.name
FROM employee
INNER JOIN department ON employee.department_id = department.id;

2. prefetch_related কখন ব্যবহার করবেন?

prefetch_related সাধারণত ManyToMany এবং ForeignKey সম্পর্কগুলোর জন্য ব্যবহৃত হয় যেখানে একাধিক টেবিলের মধ্যে সম্পর্কিত ডেটা পৃথক কোয়েরির মাধ্যমে ফেচ করা হয়। এটি Python লেভেলে সম্পর্কিত মডেলগুলিকে ক্যাশ করে এবং আলাদা কোয়েরির মাধ্যমে ডেটা ফেচ করে।

কবে ব্যবহার করবেন?

  • যখন আপনি ManyToMany সম্পর্ক ব্যবহার করছেন।
  • যখন সম্পর্কিত মডেলের মধ্যে একাধিক ডেটা ফেচ করতে হবে।
  • যখন আপনার ForeignKey সম্পর্ক আছে এবং সেগুলোর মধ্যে multiple related records রয়েছে (যেমন, একাধিক সম্পর্কিত অবজেক্ট)।

কীভাবে কাজ করে?

  • prefetch_related আলাদা কোয়েরির মাধ্যমে ডেটা ফেচ করে এবং তারপর সেগুলিকে Python স্তরে মেমরিতে সম্পর্কিত করে।

উদাহরণ:

ধরুন, আপনার Student এবং Course মডেলের মধ্যে ManyToMany সম্পর্ক আছে:

# models.py
class Course(models.Model):
    name = models.CharField(max_length=100)

class Student(models.Model):
    name = models.CharField(max_length=100)
    courses = models.ManyToManyField(Course)

কোয়েরি:

# View
students = Student.objects.prefetch_related('courses').all()

SQL Queries:

SELECT * FROM student;
SELECT * FROM course INNER JOIN student_courses ON course.id = student_courses.course_id WHERE student_courses.student_id IN (1, 2, 3);

select_related বনাম prefetch_related সংক্ষেপে তুলনা

বৈশিষ্ট্যselect_relatedprefetch_related
প্রধান সম্পর্কForeignKey, OneToOneManyToMany, ForeignKey (multiple related records)
কাজের ধরনডাটাবেসে JOIN করে একটি কোয়েরিতে ডেটা আনেআলাদা কোয়েরি চালিয়ে ডেটা আনে এবং Python স্তরে ক্যাশ করে
কোয়েরি সংখ্যাসাধারণত একাধিক টেবিল থেকে এক কোয়েরিআলাদা কোয়েরি চালানো হয়
দক্ষতাসম্পর্কিত টেবিলে কম সংখ্যক ডেটা থাকলে দ্রুততরবড় টেবিলে এবং একাধিক সম্পর্কিত ডেটার ক্ষেত্রে কার্যকর

কখন কোনটা ব্যবহার করবেন তা সহজে মনে রাখার টিপস:

  1. যদি One-to-One বা ForeignKey সম্পর্ক থাকে এবং আপনি নিশ্চিত যে প্রতিটি সম্পর্কিত মডেল থেকে শুধুমাত্র একটি ডেটা লাগবে, তাহলে select_related ব্যবহার করুন।
  2. যদি Many-to-Many সম্পর্ক থাকে বা ForeignKey সম্পর্কের ক্ষেত্রে একাধিক ডেটা ফেচ করতে হয়, তাহলে prefetch_related ব্যবহার করুন।

আশা করছি, এই ব্যাখ্যাটি select_related এবং prefetch_related এর মধ্যে পার্থক্য এবং কোন ক্ষেত্রে কোনটা ব্যবহার করতে হবে তা বুঝতে সাহায্য করবে।

How can we help?