Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户删除帐户时,保存用户详细信息和资源的最佳做法是什么?_Java_Php_Mysql_Asp.net_Node.js - Fatal编程技术网

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

Java 当用户删除帐户时,保存用户详细信息和资源的最佳做法是什么?,java,php,mysql,asp.net,node.js,Java,Php,Mysql,Asp.net,Node.js,首先,很抱歉文章中的标签让人困惑,但我想吸引来自多个后端环境的开发人员加入讨论。 因此,这个问题听起来可能令人困惑,但让我说得更清楚。 假设您有一个正在运行的SaaS应用程序,它保存敏感数据,如客户的交易、发票,可能还有一些合同,这些数据应该始终可用,并与一个确切的客户机相关联——几乎是需要的数据,以防有人需要它——要么是警察,要么是法官,政府,你明白这一点。 我找到了一个解决方案,但它不能完全解决我的问题,基本上解决方案是在用户类中使用类似的东西(示例是PHP,但它几乎适用于所有语言) 但是,

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

但是,如果用户/客户改变主意,使用他将获得的相同电子邮件和用户名再次注册,这种方法会有一个问题。用户已经存在错误,这可能会让他感到困惑,因为他毕竟删除了他的帐户。
我的想法是除了保留标记已删除之外,我还将创建命名策略,在用户名前面加上单词已删除,这将为用户解锁用户名,但我想“复制”用户名和电子邮件还有另一个问题。

在系统中保存用户证据时,您的方法是什么?让我们一劳永逸地解决这个问题。

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

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

我更喜欢后缀而不是前缀的原因是,后缀方法可以在不存在误报的情况下对电子邮件地址进行通配符搜索,而前缀使搜索更加细致。所以
SELECT*从那些喜欢电子邮件的用户那里user@example.com%“
为该用户生成所有记录(已删除或其他)

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

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


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

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

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

我更喜欢后缀而不是前缀的原因是,后缀方法可以在不存在误报的情况下对电子邮件地址进行通配符搜索,而前缀使搜索更加细致。所以
SELECT*从那些喜欢电子邮件的用户那里user@example.com%“
为该用户生成所有记录(已删除或其他)

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

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

然而,更现实的是,在大多数现实情况下,软删除最终会从生产数据库移出,并进入长期存档存储。我曾在几家公司工作过,这些公司都做过软删除,通常这种情况只是一个临时修复(通常是为了使其成为可能)
private $deleted = false;
get, set