当用户删除帐户时,保存用户详细信息和资源的最佳做法是什么



首先很抱歉帖子中的标签令人困惑,但我想吸引来自多个后端环境的开发人员加入讨论
所以这个问题听起来可能令人困惑,但让我说得更清楚一些
让我们想象一下,你有一个正在运行的SaaS应用程序,它保存敏感数据,如客户的交易、发票,也许还有一些合同,这些数据应该始终可用,并与一个确切的客户相关联——几乎是需要的数据,以防有人需要——无论是警察、法官还是政府——你明白了
我发现了一个类似的问题,但它并不能完全解决我的问题,基本上解决方案是在你的用户类中有这样的东西(例如PHP,但它几乎适用于所有语言(

private $deleted = false;
get, set

但这种方法有一个问题,如果用户/客户端改变主意,使用他将获得的相同电子邮件和用户名再次注册,则用户已经存在错误,这可能会让他感到困惑,因为他毕竟删除了自己的帐户
我的想法是,除了删除标志外,我还创建了命名策略,在用户名前加上单词已删除,这将为用户解锁用户名,但我想"复制"用户名和电子邮件还会带来另一个问题
在系统中保留用户证据时,您的方法是什么?让我们一劳永逸地解决它。

前缀/后缀是正确的想法,但不幸的是,在现实世界的用例中它还不够好,因为如果用户创建一个帐户,删除它,再次创建一个具有相同用户名的帐户,然后再次删除它,会发生什么?现在您有一个重复的唯一FK问题。

更好的方法是用纳秒分辨率的时间戳来后缀用户名或电子邮件地址(以唯一密钥为准(。例如,假设数据库中的PK是用户的电子邮件user@example.com。现在他们决定删除他们的帐户,你只需将电子邮件更新为"user@example.com-" . hrtime(true),它现在会在PK后为你提供一个纳秒分辨率的时间戳。这使得你仍然可以查找旧帐户,同时可以用相同的电子邮件地址重新创建一个新帐户。

我更喜欢后缀而不是前缀的原因是,后缀方法可以在没有误报的情况下对电子邮件地址进行通配符搜索,而前缀则可以使搜索更加细致。因此SELECT * FROM users WHERE email LIKE 'user@example.com%'生成该用户的所有记录(删除或其他(。

当然,您可以在后面加上字符串.deleted-和时间戳,这样就更难意外地调出已删除的电子邮件(假设TLD.deleted在某个时刻从未创建(。

为已删除的帐户设置标志也是一个好主意,但使用上述方案通常是不必要的,因为用户通常无法猜测登录已删除帐户的时间戳(更重要的是,电子邮件验证机制应防止其作为有效电子邮件传递(。

但更现实的是,在大多数现实场景中,软删除最终会从生产数据库中移出,并转移到长期归档存储中。我曾为几家进行软删除的公司工作过,通常情况下,这种情况只是一种临时解决方案(通常是为了在给定的窗口或宽限期内恢复旧帐户(,但通常情况下的长期解决方案是最终将这些记录移到一个单独的数据库中。在生产中保留软删除的数据通常没有那么有用,而且几乎从来没有为程序员提供过任何真实的用例。

最新更新