2

我正在开发一个画廊,允许用户发布照片、评论、投票和执行许多其他任务。

现在我认为允许用户取消订阅并删除他们所有的数据是正确的。但是很难允许这样的事情,因为您冒着破坏您的应用程序的风险(例如,当评论有很多回复时我应该怎么做?我应该如何处理由不同用户修改的页面?)。

照片可以轻松删除,但对于其他数据(即评论,修订...),我认为有三种可能:

  • 将其分配给管理员
  • 将其分配给名为“removed-user”的用户
  • 维护当前的关联(即用户 ID)并且只重命名用户的数据(例如分配一个新的用户名,例如“removed-user-24”和一个不存在的电子邮件,例如“noreply-removed-user-24@mysite .com”

当我们允许用户删除其帐户时,应遵循哪些最佳做法?你如何实现它们(尤其是在 Rails 中)?

4

5 回答 5

5

我通常通过在用户上设置一个活动标志来解决此类问题,并在删除用户时简单地将活动设置为 false。这样,即使用户被“删除”,我也可以在整个系统中保持参照完整性。在业务层中,我总是在允许用户执行操作之前验证用户是否处于活动状态。在检索数据时,我还会过滤非活动用户。

于 2009-06-29T13:42:55.250 回答
2

通常要做的不是从数据库中删除它们,而是添加一个布尔标志字段,并使其对有效用户为真,对无效用户为假。您将必须添加代码以过滤标志。您还应该尽可能从用户那里删除所有相关数据。此标志的主要目的是保持链接完好无损。它是重命名用户数据的一种变体,但标志会更容易检查。

于 2009-06-29T13:40:56.377 回答
1

我通常不喜欢删除任何内容,而是选择使用状态将记录标记为已删除/未发布(使用 AASM,即充当状态机)。

我更喜欢状态和事件而不是只使用标志,因为您可以使用事件来更新属性和发送电子邮件等。然后检查状态以决定以后要做什么。

HTH。

于 2009-06-29T13:42:54.033 回答
1

理想情况下,您不想在系统中“硬删除”数据。我知道并且我们过去实施的最好的方法是“软删除”。在所有数据表中维护一个状态列,理想情况下是指该行是否处于活动状态。创建时的任何行默认为“活动”;但是,由于条目被删除;它们被禁用。

所有仅在“活动记录”的屏幕过滤结果上显示数据的选择查询。这样您可以获得以下优势: 1. 可以进行数据恢复。2. 可以有一个数据库级别的定时任务,可以处理一次硬删除;如果真的需要。(如 SQL 过程或其他东西) 3. 您可以有一个管理屏幕来决定您真正想要标记删除的帐户、条目等 4. 也可以使用相同的解决方案临时禁用帐户。

在我工作过的 prod 环境中,硬删除是严格禁止的。还为删除维护了事实审计。但是如果应用程序真的很小;这取决于用户。

我仍然建议在数据库级别进行定期清理的“虚拟删除”或“软删除”;这将是更高效和优化的清理方式。

于 2009-06-29T13:43:49.710 回答
1

我建议输入一个删除日期字段,其中包含用户取消订阅的日期/时间——不仅是用户记录,还包括与该用户相关的所有信息。该应用程序应在显示任何内容之前检查该字段。然后,您可以在删除日期后 30 天(您选择的时间)对所有记录运行硬删除。这将允许不显示信息(您可能需要在几个地方更新应用程序)、允许用户重新订阅(意外或重新考虑)的时间以及删除旧数据的预定过程。我将删除有关会员的所有信息以及有关会员的任何相关评论或他们之前发布的数据(照片等)

于 2009-06-29T17:51:20.870 回答