Soft Deletes এবং Auditing এর ভূমিকা
Soft Deletes এবং Auditing হল ডেটাবেস পরিচালনার দুটি গুরুত্বপূর্ণ ধারণা, যা TypeORM সহ যেকোনো ORM লাইব্রেরি ব্যবহারের সময় কার্যকরী হয়। এগুলি ডেটাবেসে ডেটার ইতিহাস এবং সুরক্ষা বজায় রাখতে সাহায্য করে। TypeORM এ Soft Deletes হল এমন একটি প্রক্রিয়া যেখানে ডেটা সরাসরি মুছে ফেলা হয় না, বরং একটি বিশেষ ফিল্ডে স্ট্যাটাস পরিবর্তন করা হয়। Auditing হল ডেটার পরিবর্তন লগ রাখা, যা পরিবর্তনগুলির ইতিহাস ট্র্যাক করতে সাহায্য করে।
এই গাইডে, আমরা Soft Deletes এবং Auditing ব্যবহার করার সেরা কৌশলগুলির উপর আলোচনা করব এবং কীভাবে TypeORM এ এগুলি কার্যকরীভাবে ব্যবহার করা যায় তা দেখব।
Soft Deletes
Soft Deletes হল একটি কৌশল যেখানে ডেটাকে ডিলিট না করে, একটি ফিল্ডে (যেমন deletedAt) তার ডিলিট স্ট্যাটাস পরিবর্তন করা হয়। এতে ডেটা ডিলিট হওয়া সত্ত্বেও ডেটাবেসে বিদ্যমান থাকে এবং প্রয়োজন হলে পুনরুদ্ধার করা যায়।
TypeORM-এ Soft Deletes ব্যবহার করতে @DeleteDateColumn() ডেকোরেটর ব্যবহার করা হয়, যা একটি টেবিলের একটি কলামকে ডিলিট হওয়া ডেটার ট্র্যাকিং করার জন্য চিহ্নিত করে।
Soft Deletes এর উদাহরণ:
ধরা যাক, আমাদের একটি User টেবিল রয়েছে এবং আমরা Soft Delete করতে চাই।
import { Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@DeleteDateColumn()
deletedAt: Date; // Soft delete field
}
এখানে, @DeleteDateColumn() ফিল্ডটি ব্যবহার করা হয়েছে যা ডেটার ডিলিট হওয়ার সময় তার deletedAt টাইমস্ট্যাম্প রেকর্ড করবে।
Soft Delete অপারেশন:
এখন, আপনি যদি User ডেটা ডিলিট করতে চান, তবে সেটি সরাসরি মুছে না গিয়ে deletedAt ফিল্ডে টাইমস্ট্যাম্প সেট হবে।
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = connection.getRepository(User);
// Soft Delete (Set deletedAt field)
const user = await userRepository.findOne(1);
await userRepository.softRemove(user); // Soft delete
console.log("User soft deleted:", user);
}).catch(error => console.log(error));
এখানে softRemove() মেথডটি ব্যবহার করা হয়েছে, যা ইউজারকে সরাসরি মুছে না ফেলে deletedAt ফিল্ডে টাইমস্ট্যাম্প ইনসার্ট করবে।
Soft Delete রিকভারি (Recovery):
যেহেতু ডেটা ডিলিট হয়নি, আপনি restore() মেথড ব্যবহার করে ডেটা পুনরুদ্ধার করতে পারেন:
// Restore soft deleted user
await userRepository.restore(user.id); // Recover soft deleted user
Auditing
Auditing হল ডেটার পরিবর্তন ট্র্যাক করার প্রক্রিয়া, যা সিস্টেমের মধ্যে সমস্ত পরিবর্তন এবং এর সাথে সংশ্লিষ্ট ইউজারের লগ রাখে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি ডেটা পরিবর্তনের ইতিহাস বজায় রাখতে চান বা ডেটার পরিবর্তনগুলির জন্য ব্যবহৃত ফিচারগুলো ট্র্যাক করতে চান।
TypeORM-এ Auditing করার জন্য createdAt, updatedAt, এবং deletedAt এর মতো কলাম ব্যবহার করা হয়। আপনি @CreateDateColumn(), @UpdateDateColumn(), এবং @DeleteDateColumn() ডেকোরেটর ব্যবহার করে এসব ফিল্ড যোগ করতে পারেন।
Auditing এর উদাহরণ:
ধরা যাক, আমাদের একটি Product টেবিল রয়েছে এবং আমরা সেটির Auditing চালু করতে চাই।
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
এখানে, @CreateDateColumn() এবং @UpdateDateColumn() ব্যবহার করা হয়েছে, যা Product এন্টিটির createdAt এবং updatedAt ফিল্ডগুলো অটোমেটিকালি আপডেট করবে।
Auditing তথ্য যাচাই:
যখন আপনি Product এন্টিটি সেভ বা আপডেট করবেন, TypeORM স্বয়ংক্রিয়ভাবে createdAt এবং updatedAt ফিল্ডে টাইমস্ট্যাম্প সেট করবে।
import { createConnection } from "typeorm";
import { Product } from "./entity/Product";
createConnection().then(async connection => {
const productRepository = connection.getRepository(Product);
// Create a new product
const newProduct = new Product();
newProduct.name = "Laptop";
newProduct.price = 1000;
await productRepository.save(newProduct);
// Fetch product and check auditing columns
const product = await productRepository.findOne(newProduct.id);
console.log(product.createdAt); // createdAt will be set
console.log(product.updatedAt); // updatedAt will be set
// Update the product
product.price = 1200;
await productRepository.save(product);
console.log(product.updatedAt); // updatedAt will be updated
}).catch(error => console.log(error));
এখানে, যখন একটি Product সেভ বা আপডেট করা হয়, createdAt এবং updatedAt ফিল্ডে টাইমস্ট্যাম্প অটোমেটিকালি যোগ বা আপডেট হবে।
Soft Deletes এবং Auditing এর সমন্বয়
Soft Deletes এবং Auditing একত্রে ব্যবহারের মাধ্যমে আপনি আরও উন্নত ডেটা ম্যানেজমেন্ট সিস্টেম তৈরি করতে পারেন। উদাহরণস্বরূপ, যখন একটি রেকর্ড Soft Delete হয়, তখন আপনি সেই রেকর্ডের ইতিহাস (যেমন createdAt, updatedAt, deletedAt) রাখতে পারেন, যা ভবিষ্যতে রেকর্ডটি পুনরুদ্ধার বা ডেটা অডিট করতে সাহায্য করবে।
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from "typeorm";
@Entity()
export class Order {
@PrimaryGeneratedColumn()
id: number;
@Column()
productName: string;
@Column()
amount: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt: Date; // Soft Delete field
}
এখানে, Order এন্টিটির জন্য Soft Delete এবং Auditing ফিল্ডগুলো একত্রে ব্যবহার করা হয়েছে, যার ফলে আমরা createdAt, updatedAt, এবং deletedAt এর মাধ্যমে সমস্ত পরিবর্তন এবং ডিলিট হিস্ট্রি ট্র্যাক করতে পারব।
সারাংশ
Soft Deletes এবং Auditing হল ডেটাবেসের কার্যকরী ম্যানেজমেন্ট টুলস, যা TypeORM এর মধ্যে ডেটা ম্যানিপুলেশন এবং ইতিহাস ট্র্যাকিং সহজ করে তোলে। Soft Deletes এন্টিটি সরাসরি মুছে না ফেলে, তার পরিবর্তে ডিলিট টাইমস্ট্যাম্প সেট করে এবং Auditing সকল পরিবর্তনের ইতিহাস ট্র্যাক করে রাখে। TypeORM এ এগুলির মাধ্যমে আপনি ডেটার সুরক্ষা এবং ইতিহাস বজায় রেখে আরও কার্যকরী ডেটাবেস পরিচালনা করতে পারেন।
Soft Deletes কি?
Soft Delete একটি কৌশল যেখানে ডেটা ডিলিট করা হয় না, বরং ডেটাবেসে তার অবস্থান বা স্টেট পরিবর্তন করা হয়, যেন তা পরে পুনরুদ্ধারযোগ্য হয়। এটি এমন সময় ব্যবহৃত হয় যখন আপনি ডেটা হারানোর ঝুঁকি এড়াতে চান, কিন্তু আপনি আর সেই ডেটা ব্যবহার করতে চান না। সাধারণত, একটি deletedAt বা isDeleted কলাম ব্যবহার করে Soft Delete পরিচালিত হয়, যেখানে deletedAt কলামটি ডেটার ডিলিট হওয়া সময়ের স্ট্যাম্প হিসেবে কাজ করে বা isDeleted কলামটি true হয়ে থাকে।
TypeORM-এ Soft Delete একটি জনপ্রিয় ফিচার এবং এটি ব্যবহার করা খুবই সহজ। এটি আপনাকে ডেটা ডিলিট করার পরেও সেই ডেটাকে পুনরুদ্ধার করতে এবং প্রয়োজন হলে ফিরে পেতে সাহায্য করে। Soft Delete ব্যবহার করার জন্য TypeORM @DeleteDateColumn() এবং softDelete() মেথড ব্যবহার করে।
TypeORM-এ Soft Delete ব্যবহারের উপায়
TypeORM-এ Soft Delete কার্যকর করার জন্য আপনাকে কিছু সহজ ধাপ অনুসরণ করতে হবে।
১. @DeleteDateColumn() ডেকোরেটর ব্যবহার করা
TypeORM-এ Soft Delete কার্যকর করার জন্য আপনাকে প্রথমে Entity ক্লাসে একটি @DeleteDateColumn() ডেকোরেটর যোগ করতে হবে। এটি deletedAt নামক একটি কলাম তৈরি করবে, যা ডেটা ডিলিট হওয়ার সময়ের স্ট্যাম্প সংরক্ষণ করবে।
উদাহরণ:
ধরা যাক, আমাদের একটি User Entity রয়েছে এবং আমরা Soft Delete ফিচার যুক্ত করতে চাই।
import { Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@DeleteDateColumn()
deletedAt: Date | null;
}
এখানে, @DeleteDateColumn() ডেকোরেটর ব্যবহার করা হয়েছে, যা deletedAt নামক একটি কলাম তৈরি করবে। যখন একটি User ডিলিট হবে, তখন deletedAt কলামে ডিলিট হওয়ার সময়ের স্ট্যাম্প সংরক্ষিত হবে এবং এটি ডেটাবেসে বাস্তবিকভাবে মুছে যাবে না।
২. Soft Delete করার পদ্ধতি
TypeORM-এ Soft Delete করার জন্য softDelete() মেথড ব্যবহার করা হয়। এটি ডেটাকে সরাসরি মুছে না ফেলে, deletedAt কলামে বর্তমান সময়ের স্ট্যাম্প যোগ করে।
উদাহরণ:
import { createConnection, getRepository } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = getRepository(User);
// একটি User তৈরি করা
const user = new User();
user.name = "John Doe";
user.email = "john.doe@example.com";
await userRepository.save(user);
console.log("User created:", user);
// User কে Soft Delete করা
await userRepository.softDelete(user.id);
console.log("User soft deleted");
}).catch(error => console.log(error));
এখানে, softDelete() মেথড ব্যবহার করা হয়েছে, যা User কে ডিলিট না করে deletedAt কলামে ডিলিট হওয়ার সময় স্ট্যাম্প সংরক্ষণ করবে। এই ফিচারটি মূলত অ্যাপ্লিকেশন ব্যবহারকারীকে ডেটা হারানোর ঝুঁকি থেকে বাঁচায়।
৩. Soft Delete করা ডেটা ফেরত পাওয়া
যেহেতু ডেটা সরাসরি মুছে ফেলা হয় না, আপনি Soft Deleted ডেটা পুনরুদ্ধার করতে পারেন। TypeORM-এ withDeleted() মেথড ব্যবহার করে আপনি Soft Deleted ডেটাও ফিরে পেতে পারেন।
উদাহরণ:
createConnection().then(async connection => {
const userRepository = getRepository(User);
// Soft Deleted ডেটা ফিরে পাওয়া
const deletedUser = await userRepository.findOne({ where: { id: 1 }, withDeleted: true });
console.log("Deleted User:", deletedUser);
}).catch(error => console.log(error));
এখানে, withDeleted: true ব্যবহার করে আপনি Soft Deleted ডেটা খুঁজে পেতে পারেন। এটি আপনাকে ডেটাবেসে মুছে যাওয়া বা ডিলিট হওয়া ডেটার উপর কাজ করতে সহায়তা করে।
৪. Soft Deleted ডেটা পার্মানেন্টলি মুছে ফেলা
যদি আপনি চান যে, Soft Deleted ডেটা একেবারে ডিলিট হয়ে যাক, তাহলে remove() মেথড ব্যবহার করতে পারেন। এটি সরাসরি ডেটাবেস থেকে ডেটাকে মুছে ফেলবে।
উদাহরণ:
createConnection().then(async connection => {
const userRepository = getRepository(User);
// User কে পার্মানেন্টলি ডিলিট করা
await userRepository.remove(user);
console.log("User permanently deleted");
}).catch(error => console.log(error));
এখানে, remove() মেথড ব্যবহার করা হয়েছে যা Soft Deleted ডেটাকে ডেটাবেস থেকে পুরোপুরি মুছে ফেলবে।
Soft Delete এর সুবিধা
- ডেটা হারানো রোধ: Soft Delete ডেটাকে ডিলিট না করে, পরে পুনরুদ্ধার করার সুযোগ দেয়।
- ডেটার ইতিহাস রাখা: আপনি ডেটা কখন ডিলিট হয়েছিল তা দেখতে পারেন, কারণ
deletedAtকলামটি ডিলিট হওয়া সময়ের স্ট্যাম্প সংরক্ষণ করে। - ডেটা পুনরুদ্ধার: ডিলিট করা ডেটা সহজে ফিরে পাওয়া যায়।
- ডেটা অডিটিং: অনেক সময় সফট ডিলিট ব্যবহৃত হয় ডেটার পরিবর্তন ট্র্যাক করতে, যেমন রেকর্ডের জীবনের প্রতিটি স্টেজ ধারণ করা।
সারাংশ
Soft Delete হল একটি শক্তিশালী কৌশল যা ডেটাকে সরাসরি মুছে না ফেলে, তাকে ডেটাবেসে রেখে তার অবস্থান পরিবর্তন করে রাখে। TypeORM-এ Soft Delete করার জন্য @DeleteDateColumn() এবং softDelete() মেথড ব্যবহৃত হয়। এতে deletedAt কলাম ব্যবহার করে ডেটার ডিলিট হওয়া সময়ের স্ট্যাম্প সংরক্ষণ করা হয়। আপনি যদি কখনও ডেটা ফিরে পেতে চান, তবে withDeleted() মেথড ব্যবহার করতে পারেন। এই ফিচারটি ডেটার ইতিহাস ট্র্যাক করা, পুনরুদ্ধার করা এবং সুরক্ষিতভাবে ডেটা পরিচালনা করার জন্য খুবই কার্যকর।
Soft Deletes কি?
Soft Delete একটি কৌশল যেখানে ডেটা ডিলিট করা হয় না, বরং ডেটাবেসে তার অবস্থান বা স্টেট পরিবর্তন করা হয়, যেন তা পরে পুনরুদ্ধারযোগ্য হয়। এটি এমন সময় ব্যবহৃত হয় যখন আপনি ডেটা হারানোর ঝুঁকি এড়াতে চান, কিন্তু আপনি আর সেই ডেটা ব্যবহার করতে চান না। সাধারণত, একটি deletedAt বা isDeleted কলাম ব্যবহার করে Soft Delete পরিচালিত হয়, যেখানে deletedAt কলামটি ডেটার ডিলিট হওয়া সময়ের স্ট্যাম্প হিসেবে কাজ করে বা isDeleted কলামটি true হয়ে থাকে।
TypeORM-এ Soft Delete একটি জনপ্রিয় ফিচার এবং এটি ব্যবহার করা খুবই সহজ। এটি আপনাকে ডেটা ডিলিট করার পরেও সেই ডেটাকে পুনরুদ্ধার করতে এবং প্রয়োজন হলে ফিরে পেতে সাহায্য করে। Soft Delete ব্যবহার করার জন্য TypeORM @DeleteDateColumn() এবং softDelete() মেথড ব্যবহার করে।
TypeORM-এ Soft Delete ব্যবহারের উপায়
TypeORM-এ Soft Delete কার্যকর করার জন্য আপনাকে কিছু সহজ ধাপ অনুসরণ করতে হবে।
১. @DeleteDateColumn() ডেকোরেটর ব্যবহার করা
TypeORM-এ Soft Delete কার্যকর করার জন্য আপনাকে প্রথমে Entity ক্লাসে একটি @DeleteDateColumn() ডেকোরেটর যোগ করতে হবে। এটি deletedAt নামক একটি কলাম তৈরি করবে, যা ডেটা ডিলিট হওয়ার সময়ের স্ট্যাম্প সংরক্ষণ করবে।
উদাহরণ:
ধরা যাক, আমাদের একটি User Entity রয়েছে এবং আমরা Soft Delete ফিচার যুক্ত করতে চাই।
import { Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
@DeleteDateColumn()
deletedAt: Date | null;
}
এখানে, @DeleteDateColumn() ডেকোরেটর ব্যবহার করা হয়েছে, যা deletedAt নামক একটি কলাম তৈরি করবে। যখন একটি User ডিলিট হবে, তখন deletedAt কলামে ডিলিট হওয়ার সময়ের স্ট্যাম্প সংরক্ষিত হবে এবং এটি ডেটাবেসে বাস্তবিকভাবে মুছে যাবে না।
২. Soft Delete করার পদ্ধতি
TypeORM-এ Soft Delete করার জন্য softDelete() মেথড ব্যবহার করা হয়। এটি ডেটাকে সরাসরি মুছে না ফেলে, deletedAt কলামে বর্তমান সময়ের স্ট্যাম্প যোগ করে।
উদাহরণ:
import { createConnection, getRepository } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = getRepository(User);
// একটি User তৈরি করা
const user = new User();
user.name = "John Doe";
user.email = "john.doe@example.com";
await userRepository.save(user);
console.log("User created:", user);
// User কে Soft Delete করা
await userRepository.softDelete(user.id);
console.log("User soft deleted");
}).catch(error => console.log(error));
এখানে, softDelete() মেথড ব্যবহার করা হয়েছে, যা User কে ডিলিট না করে deletedAt কলামে ডিলিট হওয়ার সময় স্ট্যাম্প সংরক্ষণ করবে। এই ফিচারটি মূলত অ্যাপ্লিকেশন ব্যবহারকারীকে ডেটা হারানোর ঝুঁকি থেকে বাঁচায়।
৩. Soft Delete করা ডেটা ফেরত পাওয়া
যেহেতু ডেটা সরাসরি মুছে ফেলা হয় না, আপনি Soft Deleted ডেটা পুনরুদ্ধার করতে পারেন। TypeORM-এ withDeleted() মেথড ব্যবহার করে আপনি Soft Deleted ডেটাও ফিরে পেতে পারেন।
উদাহরণ:
createConnection().then(async connection => {
const userRepository = getRepository(User);
// Soft Deleted ডেটা ফিরে পাওয়া
const deletedUser = await userRepository.findOne({ where: { id: 1 }, withDeleted: true });
console.log("Deleted User:", deletedUser);
}).catch(error => console.log(error));
এখানে, withDeleted: true ব্যবহার করে আপনি Soft Deleted ডেটা খুঁজে পেতে পারেন। এটি আপনাকে ডেটাবেসে মুছে যাওয়া বা ডিলিট হওয়া ডেটার উপর কাজ করতে সহায়তা করে।
৪. Soft Deleted ডেটা পার্মানেন্টলি মুছে ফেলা
যদি আপনি চান যে, Soft Deleted ডেটা একেবারে ডিলিট হয়ে যাক, তাহলে remove() মেথড ব্যবহার করতে পারেন। এটি সরাসরি ডেটাবেস থেকে ডেটাকে মুছে ফেলবে।
উদাহরণ:
createConnection().then(async connection => {
const userRepository = getRepository(User);
// User কে পার্মানেন্টলি ডিলিট করা
await userRepository.remove(user);
console.log("User permanently deleted");
}).catch(error => console.log(error));
এখানে, remove() মেথড ব্যবহার করা হয়েছে যা Soft Deleted ডেটাকে ডেটাবেস থেকে পুরোপুরি মুছে ফেলবে।
Soft Delete এর সুবিধা
- ডেটা হারানো রোধ: Soft Delete ডেটাকে ডিলিট না করে, পরে পুনরুদ্ধার করার সুযোগ দেয়।
- ডেটার ইতিহাস রাখা: আপনি ডেটা কখন ডিলিট হয়েছিল তা দেখতে পারেন, কারণ
deletedAtকলামটি ডিলিট হওয়া সময়ের স্ট্যাম্প সংরক্ষণ করে। - ডেটা পুনরুদ্ধার: ডিলিট করা ডেটা সহজে ফিরে পাওয়া যায়।
- ডেটা অডিটিং: অনেক সময় সফট ডিলিট ব্যবহৃত হয় ডেটার পরিবর্তন ট্র্যাক করতে, যেমন রেকর্ডের জীবনের প্রতিটি স্টেজ ধারণ করা।
সারাংশ
Soft Delete হল একটি শক্তিশালী কৌশল যা ডেটাকে সরাসরি মুছে না ফেলে, তাকে ডেটাবেসে রেখে তার অবস্থান পরিবর্তন করে রাখে। TypeORM-এ Soft Delete করার জন্য @DeleteDateColumn() এবং softDelete() মেথড ব্যবহৃত হয়। এতে deletedAt কলাম ব্যবহার করে ডেটার ডিলিট হওয়া সময়ের স্ট্যাম্প সংরক্ষণ করা হয়। আপনি যদি কখনও ডেটা ফিরে পেতে চান, তবে withDeleted() মেথড ব্যবহার করতে পারেন। এই ফিচারটি ডেটার ইতিহাস ট্র্যাক করা, পুনরুদ্ধার করা এবং সুরক্ষিতভাবে ডেটা পরিচালনা করার জন্য খুবই কার্যকর।
TypeORM-এ Soft Delete এবং Auditing
TypeORM একটি শক্তিশালী ORM (Object-Relational Mapping) যা TypeScript এবং JavaScript-এর জন্য ডিজাইন করা হয়েছে এবং এটি ডেটাবেস পরিচালনা করতে অনেক সুবিধা প্রদান করে। Soft Delete এবং Auditing হল দুটি গুরুত্বপূর্ণ ফিচার যা ডেটাবেস ম্যানেজমেন্ট এবং অ্যাপ্লিকেশন ডেভেলপমেন্টে খুবই সহায়ক।
- Soft Delete হল একটি কৌশল, যেখানে ডেটা সরাসরি ডিলিট না করে, একটি নির্দিষ্ট কলামে তার স্টেট পরিবর্তন করা হয় (যেমন
isDeleted: true), যাতে সেই ডেটাটি ভবিষ্যতে পুনরুদ্ধার করা সম্ভব হয়। - Auditing হল একটি পদ্ধতি যার মাধ্যমে আপনার অ্যাপ্লিকেশনে ডেটার পরিবর্তন লগ করা হয়, যেমন কবে কোন ব্যবহারকারী ডেটা পরিবর্তন করেছে বা কোন তথ্য আপডেট হয়েছে।
TypeORM-এ এই ফিচারগুলো বাস্তবায়ন করতে Decorators ব্যবহার করা হয়, যা ডেটা সঠিকভাবে ট্র্যাক করা এবং পরিচালনা করার জন্য সহায়ক।
১. Soft Delete
Soft Delete ব্যবহার করার মাধ্যমে আপনি ডেটা সরাসরি ডিলিট না করে, ডেটার একটি ফ্ল্যাগ বা স্টেট পরিবর্তন করেন। TypeORM এ Soft Delete বাস্তবায়ন করতে @DeleteDateColumn() ডেকোরেটর ব্যবহার করা হয়।
Soft Delete এর উদাহরণ:
ধরা যাক, আপনার একটি User টেবিল আছে এবং আপনি চান যে, যখন একটি User ডিলিট হবে, তখন সেটি সম্পূর্ণভাবে ডাটাবেস থেকে মুছে না গিয়ে deletedAt ফিল্ডে তার ডিলিট টাইম স্ট্যাম্প রাখবে।
import { Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@DeleteDateColumn()
deletedAt: Date | null; // This column is used for soft delete
}
এখানে, @DeleteDateColumn() ডেকোরেটরটি deletedAt কলামটি তৈরি করে, যা null থাকবে যখন ব্যবহারকারী ডিলিট হবে না, আর ডিলিট হওয়ার সময় এটি ডিলিটের সময়ের তারিখ বা টাইমস্ট্যাম্প রাখবে।
Soft Delete অপারেশন:
import { createConnection } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const userRepository = connection.getRepository(User);
// নতুন ইউজার তৈরি করা
const user = new User();
user.name = "John Doe";
await userRepository.save(user);
// ইউজারকে Soft Delete করা
await userRepository.softDelete(user.id);
console.log("User Soft Deleted");
}).catch(error => console.log(error));
এখানে, softDelete() মেথড ব্যবহার করে ইউজারকে soft delete করা হয়েছে, যার ফলে deletedAt ফিল্ডে ডিলিট টাইমস্ট্যাম্প সংরক্ষিত হয়েছে, এবং ডেটা ফিজিক্যালি ডিলিট হয়নি।
Soft Delete এর পরে Find অপারেশন:
const deletedUser = await userRepository.findOne({ where: { id: user.id } });
console.log(deletedUser); // This will return null if the user is soft deleted
Soft Delete করার পর, findOne() কলের মাধ্যমে আপনি ডিলিট করা রেকর্ডটি খুঁজে পাবেন না। তবে, soft remove মেথড ব্যবহার করলে, আপনি সমস্ত রেকর্ড সহ ডিলিট হওয়া রেকর্ডগুলোও দেখতে পারবেন।
const allUsersIncludingDeleted = await userRepository.find({ withDeleted: true });
console.log(allUsersIncludingDeleted); // This will include the deleted users
২. Auditing
Auditing হল ডেটার পরিবর্তন লগ করার একটি পদ্ধতি, যাতে আপনি জানতে পারেন কবে এবং কিভাবে ডেটা পরিবর্তিত হয়েছে। TypeORM এ Auditing করতে @CreateDateColumn() এবং @UpdateDateColumn() ডেকোরেটর ব্যবহার করা হয়, যা তৈরি এবং আপডেটের তারিখ রেকর্ড করে।
Auditing এর উদাহরণ:
ধরা যাক, আপনি একটি Product টেবিল তৈরি করেছেন এবং আপনি চান যে, প্রতিটি নতুন Product তৈরি হওয়ার সময় তৈরি তারিখ (createdAt) এবং আপডেট হওয়া সময় (updatedAt) স্বয়ংক্রিয়ভাবে সংরক্ষিত হোক।
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
এখানে, @CreateDateColumn() এবং @UpdateDateColumn() ডেকোরেটরটি স্বয়ংক্রিয়ভাবে createdAt এবং updatedAt কলামে তারিখ এবং সময় রাখে। যখন একটি নতুন রেকর্ড তৈরি হয়, তখন createdAt এ তৈরি তারিখ সংরক্ষিত হবে এবং যখন সেই রেকর্ড আপডেট হবে, তখন updatedAt এ আপডেটের তারিখ সংরক্ষিত হবে।
Auditing এর মাধ্যমে ডেটার পরিবর্তন ট্র্যাক করা:
import { createConnection } from "typeorm";
import { Product } from "./entity/Product";
createConnection().then(async connection => {
const productRepository = connection.getRepository(Product);
// নতুন প্রোডাক্ট তৈরি করা
const product = new Product();
product.name = "Laptop";
product.price = 1500;
await productRepository.save(product);
console.log("Product Created:", product);
// প্রোডাক্ট আপডেট করা
product.price = 1400;
await productRepository.save(product);
console.log("Product Updated:", product);
}).catch(error => console.log(error));
এখানে, Product তৈরি এবং আপডেট করার সময় createdAt এবং updatedAt কলামে সিস্টেমের তারিখ স্বয়ংক্রিয়ভাবে রেকর্ড হয়ে যাবে।
৩. Soft Delete এবং Auditing একসাথে ব্যবহার
TypeORM এ আপনি Soft Delete এবং Auditing একসাথে ব্যবহার করতে পারেন, যাতে যখন কোন এন্টিটি ডিলিট হয়, তখন ডেটার পরিবর্তন এবং ডিলিটের তথ্য উভয়ই ট্র্যাক করা যায়।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from "typeorm";
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt: Date | null;
}
এখানে, Soft Delete এর জন্য @DeleteDateColumn() ব্যবহার করা হয়েছে এবং Auditing এর জন্য @CreateDateColumn() এবং @UpdateDateColumn() ব্যবহার করা হয়েছে। এর ফলে, আপনি ডিলিট করা তথ্য, তৈরি হওয়া সময় এবং আপডেট হওয়া সময় ট্র্যাক করতে পারবেন।
Soft Delete এবং Auditing একসাথে অপারেশন:
import { createConnection } from "typeorm";
import { Product } from "./entity/Product";
createConnection().then(async connection => {
const productRepository = connection.getRepository(Product);
// নতুন প্রোডাক্ট তৈরি করা
const product = new Product();
product.name = "Smartphone";
product.price = 700;
await productRepository.save(product);
console.log("Product Created:", product);
// প্রোডাক্ট ডিলিট করা (soft delete)
await productRepository.softDelete(product.id);
console.log("Product Soft Deleted:", product);
}).catch(error => console.log(error));
এখানে, Product এন্টিটি তৈরি, আপডেট এবং ডিলিট হওয়ার সময় সকল তথ্য স্বয়ংক্রিয়ভাবে সংরক্ষিত হবে এবং আপনি Soft Delete এবং Auditing উভয় ফিচার একসাথে ব্যবহার করতে পারবেন।
সারাংশ
Soft Delete এবং Auditing ডেকোরেটরের মাধ্যমে TypeORM-এ ডেটা পরিচালনার ক্ষেত্রে আরও উন্নত ফিচার যোগ করা যায়। Soft Delete এর মাধ্যমে ডেটা সরাসরি ডিলিট না করে তার স্থিতি পরিবর্তন করা হয়, এবং Auditing এর মাধ্যমে ডেটার পরিবর্তন এবং অন্যান্য কার্যক্রম লগ করা হয়। TypeORM এ এই ফিচারগুলো ডেকোরেটরের মাধ্যমে সহজেই বাস্তবায়ন করা যায়, যা ডেটাবেস ব্যবস্থাপনায় আরও কার্যকরী এবং নির্ভরযোগ্য সিস্টেম তৈরি করতে সহায়তা করে।
Data Integrity: একটি পরিচিতি
Data Integrity হল একটি ডেটাবেসের সঠিকতা, সম্পূর্ণতা এবং নির্ভরযোগ্যতার নিশ্চয়তা। এটি নিশ্চিত করে যে ডেটা সঠিকভাবে ইনপুট করা হয়েছে এবং ডেটাবেসের মধ্যে কোন ভুল বা অমিল নেই। ডেটাবেসে ডেটা ইন্টিগ্রিটি রক্ষা করা একটি গুরুত্বপূর্ণ অংশ যখন আপনি একটি অ্যাপ্লিকেশন তৈরি করছেন যা অনেক ডেটা ম্যানিপুলেশন এবং রিলেশনাল ডেটা সম্পর্ক ব্যবহার করে।
TypeORM এ ডেটা ইন্টিগ্রিটি রক্ষা করার জন্য বেশ কিছু পদ্ধতি এবং ভালো অভ্যাস রয়েছে, যেগুলি সঠিকভাবে ব্যবহার করলে ডেটাবেসের মধ্যে অপ্রত্যাশিত পরিবর্তন থেকে বিরত থাকা যায় এবং ডেটার সঠিকতা নিশ্চিত করা যায়।
TypeORM-এ Data Integrity রক্ষা করার উপায়
- Constraints এবং Validation ব্যবহার করা
- Transactions ব্যবহার করা
- Cascade Operations সাবধানে ব্যবহার করা
- Proper Indexing
- Unique এবং Not Null Constraints প্রয়োগ করা
- Data Type Consistency বজায় রাখা
১. Constraints এবং Validation ব্যবহার করা
TypeORM এ, constraints ব্যবহার করে ডেটাবেসে কিছু সুনির্দিষ্ট নিয়ম বা সীমাবদ্ধতা সেট করা যায়, যা ডেটা ইনপুট বা পরিবর্তনের সময় সঠিকতা বজায় রাখে।
- Unique Constraints: এটি নিশ্চিত করে যে কোনো নির্দিষ্ট কলামের মধ্যে একই মান পুনরাবৃত্তি হবে না।
- Not Null Constraints: এটি নিশ্চিত করে যে একটি কলামে NULL মান থাকতে পারবে না।
- Check Constraints: এটি কলামের মধ্যে ভ্যালিড মান থাকা নিশ্চিত করতে সাহায্য করে।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true }) // Ensures uniqueness
email: string;
@Column()
name: string;
@Column({ type: 'int', nullable: false }) // Ensures the field can't be null
age: number;
@Column({ type: 'boolean', default: true }) // Default value for active field
isActive: boolean;
}
এখানে, email কলামে unique: true ব্যবহার করা হয়েছে যা নিশ্চিত করে যে ডুপ্লিকেট ইমেইল ইনপুট হতে পারবে না।
২. Transactions ব্যবহার করা
TypeORM এ transactions ব্যবহার করে আপনি একাধিক ডেটাবেস অপারেশনকে একটি একক একক প্রক্রিয়ায় সম্পাদন করতে পারেন। এটি নিশ্চিত করে যে একাধিক ডেটাবেস অপারেশন একত্রে সফলভাবে সম্পন্ন হবে, অথবা যদি কোনো অপারেশন ব্যর্থ হয়, তবে পুরো ট্রানজেকশনটি রিভার্ট (rollback) করা হবে, ফলে ডেটাবেসের ইন্টিগ্রিটি বজায় থাকে।
উদাহরণ:
import { createConnection, getManager } from "typeorm";
import { User } from "./entity/User";
createConnection().then(async connection => {
const entityManager = getManager();
// Start a transaction
await entityManager.startTransaction();
try {
const user1 = new User();
user1.name = "John Doe";
user1.email = "john.doe@example.com";
await entityManager.save(user1);
const user2 = new User();
user2.name = "Jane Doe";
user2.email = "jane.doe@example.com";
await entityManager.save(user2);
// Commit transaction if all operations are successful
await entityManager.commitTransaction();
} catch (error) {
// Rollback transaction if any error occurs
await entityManager.rollbackTransaction();
console.log("Transaction failed: ", error);
}
});
এখানে, দুইটি User তৈরি করা হয়েছে এবং উভয় ইনসার্ট সফল হলে commitTransaction করা হয়েছে। যদি কোনো ত্রুটি হয়, তবে পুরো ট্রানজেকশন রোলব্যাক হবে এবং ডেটাবেসের ইন্টিগ্রিটি বজায় থাকবে।
৩. Cascade Operations সাবধানে ব্যবহার করা
TypeORM এ, Cascade Operations ব্যবহার করে আপনি এক Entity-এ পরিবর্তন করলে সম্পর্কিত অন্যান্য Entity-এ সেই পরিবর্তনগুলিকে স্বয়ংক্রিয়ভাবে প্রয়োগ করতে পারেন। তবে, Cascade Operations ব্যবহারের সময় সতর্ক থাকতে হবে, কারণ এর মাধ্যমে অপ্রত্যাশিত ডেটা পরিবর্তন হতে পারে।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Post } from "./Post";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Post, post => post.user, { cascade: true })
posts: Post[];
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(type => User, user => user.posts)
user: User;
}
এখানে, cascade: true ব্যবহার করা হয়েছে যা নিশ্চিত করে যে যখন User ডিলিট হবে, তখন তার সম্পর্কিত Post গুলোও ডিলিট হয়ে যাবে। Cascade অপারেশনটি সাবধানে ব্যবহার করা উচিত যাতে ডেটা অনিচ্ছাকৃতভাবে মুছে না যায়।
৪. Proper Indexing
ডেটাবেসে সঠিক indexing করলে ডেটা রিডিং এবং রাইটিং এর কার্যক্ষমতা বৃদ্ধি পায় এবং এটি ডেটা ইন্টিগ্রিটি বজায় রাখতে সাহায্য করে। যখন বড় ডেটাসেট এবং অনেক রিলেশনাল টেবিল থাকে, তখন proper indexing অত্যন্ত গুরুত্বপূর্ণ।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm";
@Entity()
@Index("IDX_USER_EMAIL", ["email"]) // Creating an index on email column
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
@Column()
name: string;
}
এখানে, @Index ডেকোরেটরের মাধ্যমে email কলামে একটি ইনডেক্স তৈরি করা হয়েছে, যা ডেটা সঠিকভাবে এবং দ্রুত অনুসন্ধান করতে সাহায্য করবে।
৫. Unique এবং Not Null Constraints প্রয়োগ করা
Unique এবং Not Null Constraints ডেটা ইন্টিগ্রিটি নিশ্চিত করতে ব্যবহৃত হয়। Unique constraint নিশ্চিত করে যে কোনো নির্দিষ্ট কলামে ডুপ্লিকেট ভ্যালু থাকবে না, এবং Not Null constraint নিশ্চিত করে যে কোনো কলামে NULL ভ্যালু থাকতে পারবে না।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true }) // Unique constraint to ensure no duplicate emails
email: string;
@Column({ nullable: false }) // Not null constraint
name: string;
}
এখানে, email কলামে unique: true এবং name কলামে nullable: false ব্যবহার করা হয়েছে, যা ডেটা ইন্টিগ্রিটি নিশ্চিত করবে।
৬. Data Type Consistency বজায় রাখা
TypeORM-এ Data Types এর সাথে সঠিক সামঞ্জস্য বজায় রাখা খুবই গুরুত্বপূর্ণ। এটি নিশ্চিত করবে যে একটি টেবিলের মধ্যে ডেটার ধরণ সঠিক এবং সুনির্দিষ্ট থাকে। TypeORM-এ বিভিন্ন ডেটা টাইপ যেমন string, number, boolean, Date, float, ইত্যাদি ব্যবহার করা হয়, যা ডেটাবেসের সঠিক তথ্য রাখার জন্য প্রয়োজনীয়।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: "varchar", length: 100 })
email: string;
@Column({ type: "int", default: 0 })
age: number;
@Column({ type: "boolean", default: true })
isActive: boolean;
}
এখানে, email, age এবং isActive কলামের জন্য সঠিক ডেটা টাইপ ব্যবহার করা হয়েছে যাতে ডেটা ইন্টিগ্রিটি বজায় থাকে।
সারাংশ
Data Integrity রক্ষা করা একটি গুরুত্বপূর্ণ কাজ যখন TypeORM এর মাধ্যমে ডেটাবেস পরিচালনা করা হয়। Constraints, Transactions, Cascade Operations, Indexing, এবং Data Type Consistency ব্যবহার করে আপনি আপনার ডেটাবেসে ডেটার সঠিকতা, নিরাপত্তা এবং নির্ভরযোগ্যতা নিশ্চিত করতে পারেন। এই পদ্ধতিগুলি ডেটাবেসের ভুল, অপ্রত্যাশিত পরিবর্তন এবং ডেটার অনুপস্থিতি প্রতিরোধ করতে সহায়তা করবে।
Read more