TypeORM-এ Relation এবং Join Tables
TypeORM একটি শক্তিশালী ORM (Object-Relational Mapping) টুল, যা JavaScript বা TypeScript দিয়ে ডেটাবেস ম্যানিপুলেশন সহজ করে তোলে। TypeORM সম্পর্কিত টেবিলগুলির মধ্যে join অপারেশন এবং relation ব্যবস্থাপনা করার জন্য অত্যন্ত কার্যকরী ফিচার সরবরাহ করে। এর মাধ্যমে আপনি One-to-One, One-to-Many, এবং Many-to-Many সম্পর্ক তৈরি করতে পারেন।
এখানে, আমরা Join Tables এবং Relation Options এর মাধ্যমে টেবিল সম্পর্কিত বিভিন্ন ডেটাবেস অপারেশন করার পদ্ধতি দেখবো।
১. TypeORM Relations কি?
TypeORM-এ, relations হল দুটি বা ততোধিক টেবিলের মধ্যে সম্পর্ক প্রতিষ্ঠা করার পদ্ধতি। এটি একটি ক্লাসের (Entity) মধ্যে অন্য ক্লাসের রেফারেন্স অন্তর্ভুক্ত করতে সাহায্য করে, যা ডেটাবেস টেবিলের মধ্যে সম্পর্ক তৈরি করে।
TypeORM-এ সম্পর্ক তৈরি করতে, আপনি @ManyToOne, @OneToMany, @ManyToMany, এবং @OneToOne ডেকোরেটর ব্যবহার করেন।
২. Relation Types
TypeORM-এ সম্পর্ক তিনটি মূল ধরনের হতে পারে:
- One-to-One (এক-এ-এক সম্পর্ক): এটি এমন একটি সম্পর্ক যেখানে একটি রেকর্ড একটি নির্দিষ্ট রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একজন ব্যবহারকারীর একটি প্রোফাইল।
- One-to-Many (এক-এ-অনেক সম্পর্ক): এখানে একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে। যেমন, একটি ব্লগ পোস্টের অনেক মন্তব্য।
- Many-to-Many (অনেক-এ-অনেক সম্পর্ক): এখানে অনেক রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকে। যেমন, একটি শিক্ষার্থী একাধিক কোর্সে ভর্তির মধ্যে যুক্ত থাকতে পারে।
৩. One-to-One Relation
একটি One-to-One সম্পর্ক তৈরি করতে @OneToOne এবং @JoinColumn ডেকোরেটর ব্যবহার করা হয়।
উদাহরণ: One-to-One Relation
ধরা যাক, আমরা একটি User এবং একটি Profile ক্লাস তৈরি করছি যেখানে প্রতিটি ইউজারের একটি প্রোফাইল থাকবে।
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Profile } from './Profile';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(() => Profile)
@JoinColumn() // এই লাইনটি প্রোফাইলের সাথে যুক্ত টেবিলটি নির্দিষ্ট করে
profile: Profile;
}
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
}
এখানে, User এবং Profile ক্লাসের মধ্যে এক-এ-এক সম্পর্ক স্থাপন করা হয়েছে, যেখানে User এর একটি প্রোফাইল থাকবে।
৪. One-to-Many এবং Many-to-One Relations
এখানে, একটি One-to-Many সম্পর্কের মধ্যে একটি User অনেক Post এর সাথে সম্পর্কিত হতে পারে। TypeORM-এ এই সম্পর্কটি তৈরি করতে @OneToMany এবং @ManyToOne ডেকোরেটর ব্যবহার করা হয়।
উদাহরণ: One-to-Many Relation
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Post } from './Post';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Post, post => post.user) // One User can have many Posts
posts: Post[];
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(() => User, user => user.posts) // Many Posts can belong to one User
user: User;
}
এখানে, User ক্লাসে OneToMany ডেকোরেটর ব্যবহার করা হয়েছে যা এক ব্যবহারকারীর অনেক পোস্ট থাকতে পারে, এবং Post ক্লাসে ManyToOne ডেকোরেটর ব্যবহার করা হয়েছে যাতে প্রতিটি পোস্ট একটি নির্দিষ্ট ইউজারের সাথে সম্পর্কিত থাকে।
৫. Many-to-Many Relation
Many-to-Many সম্পর্কের মধ্যে দুইটি টেবিলের মধ্যে অনেক রেকর্ড একে অপরের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি শিক্ষার্থী অনেক কোর্সে ভর্তি হতে পারে এবং একটি কোর্সে অনেক শিক্ষার্থী থাকতে পারে।
উদাহরণ: Many-to-Many Relation
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm';
import { Student } from './Student';
@Entity()
export class Course {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Student)
@JoinTable() // Many-to-many সম্পর্কের জন্য JoinTable ব্যবহৃত হয়
students: Student[];
}
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Course)
students: Course[];
}
এখানে, Course এবং Student ক্লাসের মধ্যে একটি Many-to-Many সম্পর্ক স্থাপন করা হয়েছে। @JoinTable() ডেকোরেটর ব্যবহার করা হয়েছে টেবিলের মধ্যে সম্পর্কের জন্য একটি Join Table তৈরি করতে।
৬. Join Tables in TypeORM
Many-to-Many সম্পর্কের ক্ষেত্রে, TypeORM একটি Join Table তৈরি করে যা উভয় টেবিলের মধ্যে সম্পর্ক বজায় রাখে। @JoinTable() ডেকোরেটর ব্যবহার করলে TypeORM নিজে থেকেই একটি টেবিল তৈরি করবে যেখানে উভয় টেবিলের প্রাইমারি কী থাকবে।
উদাহরণস্বরূপ, শিক্ষার্থী এবং কোর্সের মধ্যে সম্পর্কের জন্য, TypeORM একটি student_courses নামে টেবিল তৈরি করবে যা student_id এবং course_id ফিল্ড থাকবে।
৭. Relation Options
TypeORM সম্পর্কিত বিভিন্ন options সরবরাহ করে যা সম্পর্কের আচরণ কাস্টমাইজ করতে সাহায্য করে:
- cascade: ডেটাবেস অপারেশনগুলির জন্য একাধিক অটোমেটিক অপশন যেমন
insert,update,remove। - eager:
eagerঅপশন ব্যবহার করে সম্পর্কিত টেবিলগুলির ডেটা সরাসরি লোড করা যায়। - lazy:
lazyঅপশন ব্যবহার করে সম্পর্কিত ডেটা লোড করা বিলম্বিত করা যায়।
Cascade উদাহরণ:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Post, post => post.user, { cascade: true }) // Cascade insert/update/remove
posts: Post[];
}
Eager Loading উদাহরণ:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Post, post => post.user, { eager: true }) // Automatically load related posts
posts: Post[];
}
সারাংশ
TypeORM ডেটাবেস সম্পর্ক তৈরি এবং ম্যানেজ করার জন্য একটি শক্তিশালী ORM লাইব্রেরি। TypeORM ব্যবহার করে One-to-One, One-to-Many, এবং Many-to-Many সম্পর্ক খুব সহজে তৈরি করা যায় এবং @JoinTable() সহ বিভিন্ন relation options ব্যবহার করে সম্পর্কগুলির আচরণ কাস্টমাইজ করা যায়।
TypeORM-এর ডেকোরেটরগুলো (@ManyToOne, @OneToMany, @ManyToMany, @JoinColumn, ইত্যাদি) ডেটাবেস টেবিলগুলির মধ্যে সম্পর্ক সঠিকভাবে তৈরি এবং ম্যানেজ করতে সহায়তা করে, যার ফলে ডেটাবেস অপারেশনগুলির জটিলতা কমে যায়।
Read more