Soft delete = không xóa thật mà đánh dấu, thường bằng cột deleted_at. Hệ quả: gần như mọi query phải thêm WHERE deleted_at IS NULL, và điều này ảnh hưởng tới index lẫn unique constraint — vì một email "đã xóa" về lý thuyết có thể được dùng lại.
Ví dụ ép email duy nhất chỉ trong nhóm user còn sống:
sql
CREATE UNIQUE INDEX idx_users_email_not_deleted
ON users (email)
WHERE deleted_at IS NULL;Cần cân nhắc: chính sách lưu trữ, yêu cầu xóa thật (GDPR), bloat, đặt filter mặc định, và rủi ro lập trình viên quên lọc dòng đã xóa.