我正在开发一个图库,允许用户发布照片,评论,投票和执行许多其他任务。
现在我认为允许用户取消订阅并删除所有数据是正确的。但是很难允许这样的事情,因为你冒着破坏应用程序的风险(例如,当评论有很多回复时我该怎么办?对于不同用户有很多修订的页面,我该怎么做?)。
可以轻松删除照片,但对于其他数据(即评论,修订......)我认为有三种可能性:
当我们允许用户删除其帐户时,要遵循哪些最佳做法?你如何实现它们(特别是在Rails中)?
答案 0 :(得分:5)
我通常通过在用户上设置活动标志来解决此类问题,并在删除用户时简单地将active设置为false。这样,即使用户被“删除”,我也会在整个系统中保持参照完整性。在业务层中,我始终在允许用户执行操作之前验证用户是否处于活动状态。我还会在检索数据时过滤非活动用户。
答案 1 :(得分:2)
通常要做的是不是从数据库中删除它们,而是添加一个布尔标志字段,使有效用户为true,无效用户为false。您将不得不添加代码来过滤标志。您还应该从用户中删除所有相关数据。此标志的主要目的是保持链接不变。它是重命名用户数据的一种变体,但标志更容易检查。
答案 2 :(得分:1)
我通常不喜欢删除任何内容,而是选择使用状态将记录标记为已删除/未发布(使用AASM即作为状态机)。
我更喜欢使用状态和事件来使用标志,因为您可以使用事件来一次性更新属性和发送电子邮件等。然后检查状态以决定稍后要做什么。
HTH。
答案 3 :(得分:1)
理想情况下,在系统中,您不希望“硬删除”数据。我所知道的以及我们过去实施的最佳方式是“软删除”。在所有数据表中维护状态列,理想情况下是指行是否处于活动状态。创建时的任何行默认为“活动”;但是条目被删除;他们被激活了。
在屏幕上显示数据的所有选择查询仅显示“活动记录”。这样您就可以获得以下优势: 1.数据恢复是可能的。 2.您可以在数据库级别上安排一个计划任务,该任务可以在某种程度上处理一次硬删除;如果真的需要。 (像SQL程序或其他东西) 3.您可以拥有一个管理界面,以便能够决定您真正想要删除哪些帐户,条目等 4.使用相同的解决方案也可以实现暂时禁用帐户。
在我工作过的prod环境中,硬删除是严格的禁忌。对删除也进行了事实审计。但如果申请真的很小;它取决于用户。
我仍然建议在db级别定期清理“虚拟删除”或“软删除”;这将是更快的效率和优化的清理方式。
答案 4 :(得分:1)
我建议输入一个删除日期字段,其中包含用户取消订阅的日期/时间 - 不仅包括用户记录,还包括与该用户相关的所有信息。应用程序应在显示任何内容之前检查字段。然后,您可以在删除日期后30天(您选择的时间)对所有记录运行硬删除。这将允许信息不被显示(您可能需要在几个地方更新应用程序),允许用户重新订阅的时间(意外或重新思考)以及删除旧数据的计划过程。我会删除有关该成员的所有信息以及有关该成员或其先前发布的数据的任何相关评论(照片等)