SQLAlchemy তে Table-per-Class Inheritance (TPCI) প্যাটার্ন ব্যবহার করা হয় যখন আমরা একাধিক ক্লাসের জন্য আলাদা টেবিল তৈরি করতে চাই, তবে প্রতিটি টেবিলেই একই ফিল্ডগুলি থাকবে। এর মানে হল যে প্রতিটি সাবক্লাসের জন্য একটি আলাদা টেবিল থাকবে, এবং প্রতি টেবিলের মধ্যে শুধু সেই সাবক্লাসের নিজস্ব ফিল্ডগুলি থাকবে, যেখানে অভ্যন্তরীণভাবে বাইরের টেবিলের প্রাথমিক কীগুলি ব্যবহৃত হবে।
এটি মূলত যখন আপনি যদি আপনার ওবজেক্ট মডেলগুলোকে আলাদা টেবিলগুলিতে সংরক্ষণ করতে চান, এবং সম্পর্কিত ডেটা একসাথে থাকুক।
SQLAlchemy তে Table-per-Class Inheritance ব্যবহারের উদাহরণ:
ধরা যাক, আমাদের একটি Person এবং তার দুটি সাবক্লাস Employee এবং Manager রয়েছে।
কোড উদাহরণ:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
Base = declarative_base()
# Parent class
class Person(Base):
__tablename__ = 'person'
id = Column(Integer, primary_key=True)
name = Column(String)
__mapper_args__ = {
'polymorphic_identity': 'person',
'polymorphic_on': id
}
# Subclass: Employee
class Employee(Person):
__tablename__ = 'employee'
id = Column(Integer, ForeignKey('person.id'), primary_key=True)
job_title = Column(String)
__mapper_args__ = {
'polymorphic_identity': 'employee'
}
# Subclass: Manager
class Manager(Person):
__tablename__ = 'manager'
id = Column(Integer, ForeignKey('person.id'), primary_key=True)
department = Column(String)
__mapper_args__ = {
'polymorphic_identity': 'manager'
}
# Database setup
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Adding some data
manager1 = Manager(name='Alice', department='HR')
employee1 = Employee(name='Bob', job_title='Engineer')
session.add(manager1)
session.add(employee1)
session.commit()
# Querying the data
for person in session.query(Person).all():
print(f"{person.name} - {person.__class__.__name__}")
কোডের ব্যাখ্যা:
- Person হল প্যারেন্ট ক্লাস। এর একটি টেবিল থাকবে
personনামে। - Employee এবং Manager হল সাবক্লাস। প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল হবে:
employeeএবংmanager। ForeignKeyব্যবহার করা হয়েছে, যাতেEmployeeএবংManagerক্লাসগুলি তাদের প্যারেন্টPersonক্লাসেরidসুত্রের মাধ্যমে যুক্ত থাকে।__mapper_args__তেpolymorphic_identityনির্ধারণ করে দেওয়া হয়েছে, যাতে প্রতিটি টেবিল আলাদা আলাদা ইনস্ট্যান্সের জন্য সঠিক সাবক্লাস সংজ্ঞায়িত করতে পারে।
ফলাফল:
Alice - Manager
Bob - Employee
উপকারিতা:
- ডেটা বিচ্ছিন্নতা: প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল থাকে, ফলে ডেটা কাঠামো এবং সম্পর্কগুলি পরিষ্কার থাকে।
- প্রতিটি টেবিলের জন্য প্রপার্টি আলাদা রাখা: প্রতিটি সাবক্লাসের নিজস্ব কাস্টম ফিল্ড থাকবে, যা প্রধান টেবিল থেকে আলাদা থাকে।
- পর্যাপ্ত ফ্লেক্সিবিলিটি: আপনি প্রয়োজন অনুযায়ী টেবিলের মাঝে সম্পর্ক নির্ধারণ করতে পারেন এবং ডেটাবেসের গঠন কাস্টমাইজ করতে পারেন।
সীমাবদ্ধতা:
- কঠিন জটিলতা: টেবিলগুলো আলাদা হওয়ায় জটিলতা বেড়ে যেতে পারে। যখন একাধিক টেবিলের ডেটা একত্রিত করতে হবে, তখন কমপ্লেক্স কোয়েরি তৈরি হতে পারে।
- সম্পর্কের জটিলতা: টেবিলগুলির মধ্যে সম্পর্কের জটিলতা বাড়তে পারে যখন অনেকগুলো সাবক্লাস থাকে।
এটি Table-per-Class Inheritance এর একটি সাধারণ উদাহরণ যা SQLAlchemy তে ব্যবহৃত হতে পারে।