Soft delete = không xoá 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 "đã xoá" về lý thuyết có thể được dùng lại.
Ví dụ ép email duy nhất chỉ trong nhóm user chưa bị xoá:
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 xoá 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 đã xoá.