Mysql 您如何处理用户的删除

Mysql 您如何处理用户的删除,mysql,database,database-design,Mysql,Database,Database Design,应用程序中的用户参与论坛并创建各种实体。在模式中,将这些表中的引用标记回用户表作为外键引用。我们无法从数据库中删除此用户条目,因为它有几个可以删除的外键约束 一种寻址方法是将其他表中的用户字段设置为可空,以便在删除用户条目之前将这些值标记为可空。从其他表中删除信息根本不是一个选项,因为这将导致不一致(例如,删除属于用户的论坛帖子将导致问题) 另一个选项是只将用户条目标记为可移动,而不将其作为用户查询的一部分。从理论上讲,这意味着任何用户都不能从系统中删除,如果有人想使用与删除的用户类似的logi

应用程序中的用户参与论坛并创建各种实体。在模式中,将这些表中的引用标记回用户表作为外键引用。我们无法从数据库中删除此用户条目,因为它有几个可以删除的外键约束

一种寻址方法是将其他表中的用户字段设置为可空,以便在删除用户条目之前将这些值标记为可空。从其他表中删除信息根本不是一个选项,因为这将导致不一致(例如,删除属于用户的论坛帖子将导致问题)

另一个选项是只将用户条目标记为可移动,而不将其作为用户查询的一部分。从理论上讲,这意味着任何用户都不能从系统中删除,如果有人想使用与删除的用户类似的loginid,这可能是一个问题


想知道,其他人是如何解决这个问题的?

我们通常只是软删除用户。换句话说,在users表中有一列指示它们不再处于活动状态,并修改所有查询,以便它们仅对活动用户起作用

这有两个好处:

  • 它不会用其他表填充外键约束;及
  • 它保留了所有数据,以防您在某个时候需要恢复这些数据
除非您的用户数量达到数十亿,或者您的营业额非常高,否则保留老用户不会给大多数数据库带来压力

这可以用来制定一个类似的计划。当用户“消失”时,他们编写的问题和答案仍然有作者信息,但会变灰


如果您将用户信息置零(或者即使您有一个
未知的
用户来分配帖子,如果您不想允许置零),您也不会有此信息。

我会采用您上次提到的方法,即使用软删除。 具有“活动”标志,并在删除用户后将其标记为不活动

关于想要使用相同的userid,我建议不要将userid作为主键

在这种情况下,您可以自由使用相同的用户ID -只要您检查没有其他“活动”用户 -除非没有其他“活动”用户,否则不允许旧用户重新激活其Id

但是,这种方法要求所有其他表的外键都应该是某种标识类型的列,而不是用户ID本身。
如果这样做了(如果您还没有使用ID,那么可能需要对模式进行大量更改),我看不出这种方法有任何其他潜在问题

+1始终软删除用户。此外,出于审计目的,通常会存储用户名,而不是用户id FK,以防愚蠢的管理员恢复不活动的用户并将id重新分配给新员工。这可能会有一些数据保护问题,因此请咨询律师,或者至少看起来像律师的人。每当用户被删除时,我通常会将deleted column设置为true,对于可行的查询,只选择deleted=false的用户。您可以在表上创建视图,自动过滤掉软删除的用户。如果以后每个人都忘记在where子句中添加“deleted=0”条件,这将节省大量时间和麻烦。@Tom-你是说如果我们将删除的用户数据保留在生产系统中,我们会有问题吗