GitLab ghost user 设计决策

sorra 发表于 02/24 17:50 修改于 02/24 17:52 阅读数869

还在讨论状态,编程工作已完成大半:https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7393

背景

删除一个用户时会自动级联删除他所创建的所有对象,然而,不应该删除他所创建的issues, merge requests等公共对象!

这些对象需要有author,这就要引入ghost user的概念,被删除的用户变成ghost user。

有两种可能的设计:

  1. 创建一个全局唯一的ghost user,把用户所创建的公共对象都移到他名下,然后彻底删除用户(用户的私有对象如snippets, todos会自动级联删除)。
  2. 把每个被删除的用户就地转换成ghost user,公共对象的创建者不用改变,但是用户的私有对象如snippets, todos会被删除(需要用代码来挨个删除)。

观点

JIRA, SuccessFactors等企业级应用的做法是:不删除用户,但是要冻结用户,用户名被备注为"已失效",像这样John Doe (deactivated)

作为一个围观群众,我认为第二种设计更好。虽然GitLab的讨论中认为第二种的复杂度还略高一些,但是第二种的可维护性更好。

正如Nick Thomas说:

both approaches require us to maintain lists of things to do and update them as new associations are added.

I think my preference is still for the multiple ghosts approach. It errs on the side of not deleting things that should be deleted, whereas the 'move to a single ghost' approach errs on the side of deleting things that should not be deleted. We can fix the former in a data migration, but we can't fix the latter.

但是他们视频讨论后突然决定采用第一种了,理由是更符合Active Record的“级联删除”风格。

现在最新的讨论是管理员可以先软删除(soft-delete)用户,再决定是否硬删除(hard-delete)用户。

企业级应用要严格管理数据的权限和合法性;互联网应用常常不在意这类问题,用户甚至无法停用自己的账号!