Table Per Class Hierarchy (TPC) হল একটি হাইব্রিড ইনহেরিটেন্স মডেল যেখানে পুরো ক্লাস হায়ারার্কি একটিমাত্র টেবিলের মধ্যে সংরক্ষিত হয়। এই মডেলটি সাধারণত ছোট অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয় যেখানে একাধিক ক্লাসের ডেটা একই টেবিলের মধ্যে সংরক্ষিত থাকে।
NHibernate এ Table Per Class Hierarchy মডেলটি সাধারণত Discriminator কলাম ব্যবহার করে বাস্তবায়িত করা হয়, যা ক্লাসের ধরন বা টেবিলের বিভিন্ন সাবক্লাসের মধ্যে পার্থক্য তৈরি করে।
Table Per Class Hierarchy Mapping এর সুবিধা
- সহজ টেবিল স্ট্রাকচার: একাধিক ক্লাসের জন্য একটি টেবিল তৈরি হয়, যা ডেটাবেসের জটিলতা কমাতে সাহায্য করে।
- ভাল পারফরম্যান্স: যেহেতু একটিমাত্র টেবিল ব্যবহৃত হয়, তাই কুয়েরি পারফরম্যান্স অনেক ভালো হতে পারে।
- ডেটা রিডানডেন্স: এই মডেলে, ডেটা রিডানডেন্স কমে যায়, কারণ একই টেবিলের মধ্যে সব ডেটা থাকে।
TPC মডেল কিভাবে কাজ করে
এখানে Employee এবং তার FullTimeEmployee এবং PartTimeEmployee এর উদাহরণ ব্যবহার করা হবে।
- Employee ক্লাসটি একটি বেস ক্লাস হিসেবে কাজ করবে।
- FullTimeEmployee এবং PartTimeEmployee ক্লাসগুলো হল সাবক্লাস, যেগুলোর সব ডেটা Employee টেবিলেই সঞ্চিত থাকবে।
1. ক্লাস মডেল তৈরি
প্রথমে, তিনটি ক্লাস তৈরি করা হবে — Employee, FullTimeEmployee, এবং PartTimeEmployee।
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class FullTimeEmployee : Employee
{
public virtual double Salary { get; set; }
}
public class PartTimeEmployee : Employee
{
public virtual double HourlyRate { get; set; }
}
এখানে:
- Employee হল বেস ক্লাস।
- FullTimeEmployee এবং PartTimeEmployee হল সাবক্লাস যেগুলি Employee এর বৈশিষ্ট্যগুলি উত্তরাধিকারসূত্রে গ্রহণ করে।
2. hibernate.cfg.xml ফাইল কনফিগার করা
NHibernate এ Table Per Class Hierarchy ম্যাপিং করতে, আপনাকে Discriminator কলাম কনফিগার করতে হবে যা প্রতিটি সাবক্লাসের মধ্যে পার্থক্য করবে। এই উদাহরণে, Employee টেবিলটি তিনটি ক্লাসের জন্য একটি টেবিল হবে এবং Discriminator কলামটি ঠিক করবে কোন সাবক্লাসের ডেটা।
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="hibernate.dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="hibernate.connection.connection_string">Server=yourserver;Database=yourdb;Integrated Security=True;</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Discriminator সেটিংস -->
<mapping class="FullTimeEmployee">
<join table="Employee">
<key column="Id"/>
<discriminator column="EmployeeType" type="string"/>
</join>
</mapping>
<mapping class="PartTimeEmployee">
<join table="Employee">
<key column="Id"/>
<discriminator column="EmployeeType" type="string"/>
</join>
</mapping>
</session-factory>
</hibernate-configuration>
এখানে:
- Discriminator কলামটি EmployeeType নামে তৈরি করা হয়েছে, যা সিদ্ধান্ত নেবে কোন ক্লাসের ডেটা সেই রেকর্ডের জন্য প্রযোজ্য।
- hibernate.hbm2ddl.auto প্রপার্টিটি
updateহিসেবে সেট করা হয়েছে, যাতে NHibernate স্বয়ংক্রিয়ভাবে ডেটাবেসের স্কিমা আপডেট করে।
3. Database Schema
এই মডেলে, Employee টেবিলটি তৈরি হবে যা তিনটি ক্লাসের তথ্য ধারণ করবে। টেবিলটি এমন হবে:
CREATE TABLE Employee (
Id INT PRIMARY KEY,
Name VARCHAR(255),
Salary FLOAT, -- FullTimeEmployee এর জন্য
HourlyRate FLOAT, -- PartTimeEmployee এর জন্য
EmployeeType VARCHAR(50) -- Discriminator কলাম
);
এই টেবিলটি তিনটি সাবক্লাসের (FullTimeEmployee, PartTimeEmployee, Employee) তথ্য সংরক্ষণ করবে। EmployeeType কলামটি ব্যবহার করা হবে বিভিন্ন সাবক্লাসের মধ্যে পার্থক্য করতে।
4. Data Insert এবং Select
FullTimeEmployee এবং PartTimeEmployee এর জন্য ডেটা সন্নিবেশ ও পড়া খুবই সহজ হবে, কারণ সমস্ত ডেটা Employee টেবিলে একত্রিত হয়ে থাকবে।
Data Insert Example:
public void InsertEmployee()
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
try
{
var fullTimeEmployee = new FullTimeEmployee
{
Name = "John Doe",
Salary = 50000
};
session.Save(fullTimeEmployee);
var partTimeEmployee = new PartTimeEmployee
{
Name = "Jane Smith",
HourlyRate = 20
};
session.Save(partTimeEmployee);
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
}
}
Data Read Example:
public Employee GetEmployeeById(int id)
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
return session.Get<Employee>(id); // সকল Employee সন্নিবেশ করা যাবে
}
}
5. Table Per Class Hierarchy এর সীমাবদ্ধতা
- ডেটা রিডানডেন্স: একই টেবিলের মধ্যে একাধিক ক্লাসের ডেটা থাকলে কিছু রিডানডেন্স হতে পারে।
- মেডেল তৈরি করা: যদি খুব জটিল ইনহেরিটেন্স হায়ারার্কি থাকে তবে একটিমাত্র টেবিলের মধ্যে সব ডেটা রাখা কঠিন হয়ে যেতে পারে।
Table Per Class Hierarchy Mapping হলো এমন একটি পদ্ধতি যা ছোট অ্যাপ্লিকেশন বা সহজ ক্লাস হায়ারার্কির জন্য বেশ কার্যকর। তবে বড় এবং জটিল ডেটাবেসের জন্য এই পদ্ধতি কিছু সীমাবদ্ধতা তৈরি করতে পারে, এবং এমন পরিস্থিতিতে অন্যান্য ইনহেরিটেন্স ম্যাপিং পদ্ধতি (যেমন Table Per Subclass বা Table Per Concrete Class) ব্যবহার করা হতে পারে।
Read more