0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng Dẫn Thực Hiện Soft Deletes Trong Prisma

Đăng vào 3 tuần trước

• 4 phút đọc

Hướng Dẫn Thực Hiện Soft Deletes Trong Prisma

Mục Lục

  1. Giới Thiệu
  2. Tại Sao Soft Deletes Lại Quan Trọng?
  3. Phác Thảo Kế Hoạch Xóa Dữ Liệu
  4. Mở Rộng Prisma Client
  5. Xóa Dữ Liệu Một Cách An Toàn
  6. Khôi Phục Dữ Liệu Đã Xóa
  7. Xử Lý Quan Hệ Dữ Liệu
  8. Mẹo Hiệu Suất
  9. Kết Luận
  10. 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:

  1. 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.
  2. 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.
  3. 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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
@@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

  1. 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.
  2. Làm thế nào để khôi phục dữ liệu đã xóa?
    Bạn có thể sử dụng phương thức restore để khôi phục dữ liệu.
  3. 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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào