Hướng Dẫn Thực Hiện Soft Deletes Trong Prisma
Mục Lục
- Giới Thiệu
- Tại Sao Soft Deletes Lại Quan Trọng?
- Phác Thảo Kế Hoạch Xóa Dữ Liệu
- Mở Rộng Prisma Client
- Xóa Dữ Liệu Một Cách An Toàn
- Khôi Phục Dữ Liệu Đã Xóa
- Xử Lý Quan Hệ Dữ Liệu
- Mẹo Hiệu Suất
- Kết Luận
- Câu Hỏi Thường Gặp
Giới Thiệu
Trong quá trình phát triển ứng dụng, việc xóa dữ liệu một cách an toàn và hiệu quả là điều cần thiết. Kịch bản thường gặp là một khách hàng vô tình xóa một số bản ghi và hỏi liệu có thể khôi phục lại không. Câu trả lời thường là “Không.” Tuy nhiên, với phương pháp soft delete, bạn có thể tránh được tình huống đáng tiếc này.
Soft delete cho phép bạn đánh dấu một bản ghi là đã xóa mà không thực sự loại bỏ nó khỏi cơ sở dữ liệu. Điều này giúp bạn có thể khôi phục dữ liệu dễ dàng hơn mà không cần phải tìm kiếm trong các bản sao lưu.
Tại Sao Soft Deletes Lại Quan Trọng?
Lợi Ích Của Soft Deletes
- Khôi phục dễ dàng: Khi người dùng vô tình xóa dữ liệu, bạn có thể khôi phục nhanh chóng mà không cần phải nhờ đến bản sao lưu.
- Ghi lại lịch sử: Theo dõi thời điểm bản ghi được đánh dấu là đã xóa, điều này có thể hữu ích cho kiểm tra và tuân thủ.
- An toàn trong thay đổi quan hệ: Tránh lỗi do bản ghi phụ thuộc bị mất tích, các mối quan hệ vẫn được giữ nguyên.
Phác Thảo Kế Hoạch Xóa Dữ Liệu
Để thực hiện soft delete, bạn cần thực hiện các bước sau:
- Thêm một cột đặc biệt gọi là “soft deletion identifier” vào bảng dữ liệu của bạn. Cột này có thể là kiểu boolean hoặc datetime.
- Cập nhật các truy vấn cơ sở dữ liệu để bỏ qua các bản ghi đã được đánh dấu là đã xóa.
- Khi người dùng xóa một bản ghi, cập nhật cột này với thời gian hiện tại hoặc ID của người dùng đã xóa.
Ví Dụ Cấu Trúc Bảng
prisma
model User {
id String @id @default(uuid())
email String @unique
name String
deleted_at DateTime? @db.Timestamptz
}
model Post {
id String @id @default(uuid())
title String
content String?
author User @relation(fields: [authorId], references: [id])
authorId String
deleted_at DateTime? @db.Timestamptz
}
Mở Rộng Prisma Client
Để Prisma hiểu được cột “deleted_at”, bạn cần mở rộng Prisma Client. Bằng cách sử dụng client.$extends, bạn có thể thêm các phương thức tùy chỉnh và xử lý truy vấn một cách tự động.
Ví Dụ Về Mở Rộng
javascript
const softDeleteExtension = Prisma.defineExtension((client) =>
client.$extends({
name: "softDeleteExtension",
query: { $allModels: { /* overrides */ } },
model: { $allModels: { /* custom methods */ } },
})
);
Xóa Dữ Liệu Một Cách An Toàn
Với soft delete, phương thức delete sẽ được xử lý như sau:
javascript
async delete({ args, query, model }) {
args.where = { ...args.where, deleted_at: null };
return (client as any)[model].update({
where: { ...args.where },
data: { deleted_at: new Date() },
});
}
Khôi Phục Dữ Liệu Đã Xóa
Bạn có thể dễ dàng khôi phục dữ liệu đã xóa bằng cách sử dụng phương thức restore:
javascript
async restore(where: Record<string, unknown>) {
return (this as any).update({
where,
data: { deleted_at: null as unknown as Date },
});
}
Xử Lý Quan Hệ Dữ Liệu
Khi sử dụng soft delete, bạn cần phải xử lý các mối quan hệ một cách cẩn thận. Khi xóa một người dùng, bạn cũng cần phải soft delete tất cả các bài viết của họ.
Ví Dụ Xử Lý Quan Hệ
javascript
async delete({ args, query, model }) {
return client.$transaction(async (tx) => {
const user = await (tx as any).user.findFirst({
where: args.where,
});
await (tx as any).post.updateMany({
where: { authorId: user.id, deleted_at: null },
data: { deleted_at: new Date() },
});
});
}
Mẹo Hiệu Suất
Để đảm bảo hiệu suất khi sử dụng soft delete, bạn nên thêm chỉ mục cho cột deleted_at:
prisma
@@index([deleted_at])
Tối Ưu Hóa Truy Vấn
Sử dụng truy vấn với điều kiện deleted_at: null để đảm bảo không bao gồm các bản ghi đã xóa.
Kết Luận
Soft delete không chỉ giúp bảo vệ dữ liệu mà còn tăng tính linh hoạt trong quản lý dữ liệu của bạn. Hãy áp dụng các phương pháp đã đề cập để tối ưu hóa ứng dụng của bạn.
Câu Hỏi Thường Gặp
- Soft delete là gì?
Soft delete là phương pháp đánh dấu bản ghi là đã xóa mà không xóa thực sự khỏi cơ sở dữ liệu. - Làm thế nào để khôi phục dữ liệu đã xóa?
Bạn có thể sử dụng phương thứcrestoređể khôi phục dữ liệu. - Có cần sử dụng chỉ mục cho cột deleted_at không?
Có, việc này giúp tăng hiệu suất truy vấn.
Nếu bạn có bất kỳ câu hỏi nào khác hoặc muốn thảo luận thêm, hãy để lại ý kiến của bạn trong phần bình luận dưới đây!