你如何处理用户删除

时间:2010-08-27 09:36:20

标签: mysql database database-design

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

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

另一种选择是将User条目标记为可移动,并且不要将其作为用户查询的一部分提供。从理论上讲,如果有人想要使用类似的loginid作为被删除的用户,那么任何用户都无法从系统中删除,并且可能会出现问题。

想知道其他人如何处理这个问题?

2 个答案:

答案 0 :(得分:11)

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

这有两个好处:

  • 它不会填充其他表的外键约束;和
  • 它会保留所有关于你需要在某个时刻恢复它的机会的数据。

除非您的用户数量达到数十亿或者您的营业额非常高,否则保留旧用户不会对大多数数据库造成压力。

这可用于制定与SO相似的方案。当用户“消失”时,他们撰写的问题和答案仍然有作者信息,但它是灰色的。

如果您将用户信息清空(或者即使您有一个Unknown用户将帖子分配给您,如果您不想允许NULL),也不会有此信息。

答案 1 :(得分:2)

我会选择你最后提到的方法,即使用软删除。 有一个“活动”标志,并在删除用户后将其标记为非活动状态。

关于想要使用相同的用户ID,我建议不要将userId作为主键。

在这种情况下,您可以自由使用相同的用户ID - 只要您检查没有其他“活动”用户 - 除非没有其他“活跃”用户

,否则您不允许旧用户重新激活其ID

但是,这种方法要求所有其他表的外键应该是一些IDENTITY列,而不是您的用户ID本身。 如果你已经完成了(如果你还没有使用ID,可能需要很多架构更改),我没有看到这种方法的任何其他潜在问题