概述
软删除以纪律换取宽限期:每个读取与约束都必须考虑标记。应刻意提供恢复与清理路径,让恢复成为功能,而非手改数据库。
关键步骤
- 添加 deleted_at,以设置它代替执行 DELETE。
- 在每处普通读取与计数查询中过滤 deleted_at IS NULL。
- 提供恢复接口,在有限窗口内清除 deleted_at。
- 运行清理任务,硬删除超过保留窗口的行。
验证
- 删除行后它从列表中消失。
- 窗口内恢复可使其回归。
- 清理会移除超过保留窗口的行。
- 唯一约束仍允许重建同名记录。
注意事项
- 软删除让每个查询与约束都要额外过滤,必须一致应用。
- 它不能替代备份,本身也无法满足法律意义上的删除要求。
适用范围
本条目围绕「为软删除添加恢复接口」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
-- restore within the grace window
UPDATE notes SET deleted_at = NULL
WHERE id = $1 AND deleted_at > now() - interval '30 days';