- Hard delete:
DELETEthật, xóa hẳn hàng khỏi bảng. Dữ liệu biến mất. - Soft delete: không xóa mà đánh dấu đã xóa — thêm cột
deleted_at TIMESTAMP(tốt hơnis_deleted BOOLEANvì ghi lại cả thời điểm xóa); mọi truy vấn "còn sống" phải thêm điều kiệnWHERE deleted_at IS NULL.
Soft delete được gì:
- Khôi phục được (undo), giữ lịch sử/audit.
- Không phá vỡ FK từ dữ liệu liên quan còn tham chiếu (đơn hàng cũ trỏ tới user đã "xóa").
Cái giá của soft delete:
- Mọi truy vấn phải nhớ lọc hàng đã xóa — quên một chỗ là lộ dữ liệu đã "xóa" (dùng global query filter của ORM hoặc view để lọc tự động; vd EF Core query filter).
- Ràng buộc UNIQUE vướng: email của user đã soft-delete vẫn chiếm chỗ → cần unique index có điều kiện (partial index WHERE deleted_at IS NULL).
- Bảng tăng kích thước theo thời gian; index kém hiệu quả nếu nhiều dữ liệu đã đánh dấu xóa.
Khi nào dùng gì:
- Soft delete: dữ liệu quan trọng cần audit/khôi phục, hay bị tham chiếu (user, đơn hàng, bài viết).
- Hard delete: dữ liệu tạm/khối lượng lớn, hoặc yêu cầu pháp lý phải xóa thật (GDPR "quyền được lãng quên") — khi đó soft delete là chưa đủ.