Spring Boot JPA এর মাধ্যমে inheritance mapping সাধারণত ডাটাবেজ টেবিলগুলোর মধ্যে অবজেক্ট-ওরিয়েন্টেড ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। JPA (Java Persistence API) ৩টি প্রধান inheritance mapping কৌশল সমর্থন করে: Single Table, Table-per-Class, এবং Joined Table। প্রতিটি কৌশল ডেটাবেজের টেবিল গঠন এবং সম্পর্কের জন্য ভিন্ন উপায় প্রদান করে।
Inheritance Mapping এর উদ্দেশ্য
Inheritance Mapping ব্যবহৃত হয় যখন আপনি একটি মডেলকে অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে তৈরি করেন এবং তারপর সেই মডেলটিকে ডাটাবেজ টেবিলের মধ্যে ম্যাপ করতে চান। JPA তে, Inheritance Mapping এর মাধ্যমে বিভিন্ন সাবক্লাসের তথ্য মূল ক্লাসের সাথে যুক্ত করতে পারবেন।
Spring Boot JPA-তে Inheritance Mapping-এর জন্য তিনটি প্রধান কৌশল:
- Single Table Strategy
- Table-per-Class Strategy
- Joined Table Strategy
এই কৌশলগুলো JPA Entity ক্লাসগুলির মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়।
১. Single Table Strategy
Single Table Strategy হলো সবচেয়ে সহজ এবং জনপ্রিয় কৌশল যেখানে সমস্ত ইনহেরিটেড ক্লাসের জন্য একটি মাত্র টেবিল তৈরি হয়। সমস্ত সাবক্লাসের জন্য একটি সাধারণ টেবিল থাকবে, এবং discriminator column (একটি বিশেষ কলাম) ব্যবহার করে সাবক্লাসগুলি চিহ্নিত করা হবে। এই কৌশলে, সমস্ত ইনহেরিটেড ডেটা একটি টেবিলে জমা হয়, যার ফলে স্টোরেজ স্থান কমে যায়, কিন্তু এটি বড় স্কেল অ্যাপ্লিকেশনগুলিতে কিছু পারফরম্যান্স সমস্যা সৃষ্টি করতে পারে।
বৈশিষ্ট্য:
- কমপ্লেক্সিটি কম: একটি টেবিল ব্যবহার করে সমস্ত ক্লাসের ডেটা ম্যানেজ করা হয়।
- স্টোরেজ দক্ষতা: একটি মাত্র টেবিল ব্যবহারের কারণে স্টোরেজ কম থাকে।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
@DiscriminatorValue("FULL_TIME")
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
@Entity
@DiscriminatorValue("PART_TIME")
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
এখানে, Employee একটি অ্যাবস্ট্র্যাক্ট ক্লাস, এবং FullTimeEmployee ও PartTimeEmployee হল দুটি সাবক্লাস। সমস্ত ডেটা Employee টেবিলেই থাকবে, যেখানে employee_type কলাম দ্বারা সাবক্লাসগুলি আলাদা হবে।
২. Table-per-Class Strategy
Table-per-Class Strategy-এ প্রতিটি সাবক্লাসের জন্য একটি আলাদা টেবিল তৈরি হয়। এটি স্টোরেজ দিক থেকে আরও কার্যকর হতে পারে, কারণ প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল থাকে। তবে, এটি ডেটাবেসে reduntancy সৃষ্টি করতে পারে এবং joins এর প্রয়োজন হতে পারে।
বৈশিষ্ট্য:
- অলাদা টেবিল: প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি হয়।
- স্টোরেজের ক্ষেত্রে আরও স্থান নেওয়া: ডেটার পুনরাবৃত্তি হতে পারে, কারণ প্রতিটি টেবিলের জন্য পূর্ণ তথ্য থাকতে হবে।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
এখানে, Employee, FullTimeEmployee, এবং PartTimeEmployee ক্লাসগুলির প্রতিটির জন্য আলাদা আলাদা টেবিল তৈরি হবে। এই কৌশলে কোনও discriminator column ব্যবহৃত হয় না, এবং প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল থাকে।
৩. Joined Table Strategy
Joined Table Strategy একটি মিক্সড পদ্ধতি যেখানে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়, তবে সকল টেবিলের মধ্যে একটি join সম্পর্ক স্থাপিত থাকে। এটি normalized পদ্ধতিতে ডেটাবেস ডিজাইন তৈরি করে, যেখানে প্রতিটি টেবিলের মধ্যে শুধুমাত্র নির্দিষ্ট তথ্য থাকে। যখন ডেটা ফেচ করা হয়, তখন এই টেবিলগুলি একত্রে join করা হয়।
বৈশিষ্ট্য:
- ডেটাবেস ডিজাইন নরমালাইজড: ডেটার পুনরাবৃত্তি এড়ানো হয় এবং স্টোরেজ ব্যবহারে আরও দক্ষতা থাকে।
- পারফরম্যান্সে প্রভাব:
joinঅপারেশনগুলি ডেটার ফেচিং এর সময় পারফরম্যান্সে প্রভাব ফেলতে পারে।
উদাহরণ:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
এখানে, Employee, FullTimeEmployee, এবং PartTimeEmployee ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। Employee টেবিলের মূল তথ্য থাকবে, এবং FullTimeEmployee এবং PartTimeEmployee টেবিলগুলি তাদের নির্দিষ্ট ডেটা ধারণ করবে, এবং join অপারেশন ব্যবহৃত হবে।
সারাংশ
Spring Boot JPA তে Inheritance Mapping প্রয়োগের তিনটি প্রধান কৌশল:
- Single Table Strategy: একটি টেবিলের মধ্যে সমস্ত সাবক্লাসের ডেটা জমা হয়, এবং
discriminator columnদিয়ে সাবক্লাসগুলি চিহ্নিত করা হয়। - Table-per-Class Strategy: প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি হয়, তবে এতে কিছু স্টোরেজ পুনরাবৃত্তি থাকতে পারে।
- Joined Table Strategy: প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয় এবং join এর মাধ্যমে সম্পর্ক স্থাপন করা হয়, যা ডেটাবেস ডিজাইনে স্টোরেজের দক্ষতা বাড়ায়, তবে পারফরম্যান্সে কিছু প্রভাব ফেলতে পারে।
এই তিনটি কৌশল আপনাকে JPA Entity গুলির মধ্যে ইনহেরিটেন্স ম্যাপিং করার জন্য সুবিধা প্রদান করে, এবং আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্টোরেজ প্রয়োজন অনুযায়ী যেকোনো একটি কৌশল বেছে নিতে পারেন।