返回学院
OPERATE经营手册

删除账号不是删一行 users:数据、订单和备份怎么办

账号、内容、日志、支付、发票、客服和备份往往分散在不同系统。删除功能要先建立数据地图,并区分可以立即擦除的个人数据与有合法保留理由的记录。

产品里加一个“Delete account”按钮很简单,真正执行删除通常不简单。

一个用户可能同时存在于认证 Provider、profiles 表、项目表、对象存储、邮件列表、分析系统、客服工单和支付记录里。只删除 users 主表,既可能留下大量孤儿个人数据,也可能把订单外键弄坏。

先区分账号身份和业务记录

认证账户负责登录,用户创建的内容属于业务数据,付款和退款又属于财务事实。三类数据生命周期未必相同。

例如用户要求删除个人资料和公开内容时,某些支付或税务记录可能仍需要因为法律、会计或争议处理理由保留。具体保留义务取决于地区和业务,不能用一条通用规则处理。

ICO 对英国数据保护的说明也明确指出,删除权并不是绝对权利;在某些法律义务、法律请求等情况下可能存在例外。

数据地图决定删除范围

实现按钮前,把与 user_id、email、phone、provider subject 相关的存储全部找出来。

每一项标记:立即删除、匿名化、按保留期继续保存、需要第三方同步删除、进入备份淘汰周期。

如果用户上传了文件,还要检查对象存储;如果内容发给过第三方 AI 或邮件服务,确认供应商侧可执行什么删除动作,而不是只清自己的数据库。

备份是最容易忘记的一层

ICO 的 erasure 指导专门讨论了 backup。有效删除请求可能需要覆盖备份环境,但技术上未必能立刻从每个不可变备份里抽出单个用户删除。

一种常见处理是让数据在备份保留周期后被覆盖,并确保这段时间处于 beyond use 状态,不再被正常业务使用。实际做法仍应结合你的备份机制和适用规则。

关键是隐私说明不要承诺“点击后所有副本瞬间消失”,如果系统根本做不到。

删除任务需要可恢复

跨多个 Provider 删除很容易半成功。数据库删了,邮件服务 API 超时;对象存储成功,认证 Provider 失败。若按钮请求本身承担全部工作,用户看到一个 500,却不知道已经删到哪里。

更稳的设计是创建持久化 deletion job,记录每个阶段状态,失败可重试;在任务完成后再关闭登录能力或按设计冻结账户,避免删除过程中继续产生新数据。

匿名化有时比硬删除更适合历史记录

例如订单必须保留,但没必要一直关联用户昵称和头像,可以移除非必要个人字段,保留订单编号、金额、时间等必要事实。

匿名化必须是真的无法再合理识别个人,而不是把 email 换成 hash 就宣称完全匿名。

如果你无法回答“一个用户的数据到底在哪里”,说明隐私政策、备份和供应商管理也很可能不清楚。账号删除不是一条 SQL,而是一套数据生命周期。

KEEP READING

继续看这个方向