- Hard delete:
DELETEthật, xoá hẳn hàng khỏi bảng. Dữ liệu biến mất. - Soft delete: không xoá mà đánh dấu đã xoá — thêm cột
deleted_at TIMESTAMP(tốt hơnis_deleted BOOLEANvì ghi lại cả thời điểm xoá); 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 làm hỏng FK từ dữ liệu liên quan còn tham chiếu (đơn hàng cũ trỏ tới user đã "xoá").
Cái giá của soft delete:
- Mọi truy vấn phải nhớ lọc hàng đã xoá — quên một chỗ là lộ dữ liệu đã "xoá" (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 xoá.
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 xoá thật (GDPR "quyền được lãng quên") — khi đó soft delete là chưa đủ.