为数据库实体启用“取消删除”的最佳实践?

时间:2011-08-19 22:38:27

标签: mysql database-design

这适用于使用PHP / MySQL的CRM应用程序。用户可以“删除”诸如客户,联系人,注释等各种实体。我只是希望它被删除到应用程序中,而不是实际从数据库中删除实体,而是保存在数据库中,并且如果以后需要,可以“恢复”。甚至可能会在应用程序中添加某种“回收站”。

我想过几种方法可以做到这一点:

  1. 将删除的实体移动到另一个表。 (customer to customer_deleted)

  2. 更改实体的属性。 (启用为false)

  3. 我确信还有其他方法,每个方法都有自己对数据库大小,性能等的影响,我只是想知道通常建议的方法是做什么的?

2 个答案:

答案 0 :(得分:1)

我会将两者结合起来:

  1. 将标记deleted设置为true
  2. 使用cronjob将一段时间后的条目移动到ARCHIVE
  3. 类型的表格中
  4. 如果您需要恢复条目,select into文章表并从存档
  5. 中删除

    为什么我会这样走?

    • 如果客户删除了错误的客户,则可以执行恢复操作
    • 几个月/月之后,文章表可能会长大很多,所以我会将所有被删除的条目存档一周p.a。

答案 1 :(得分:0)

通常的做法是将deleted_at列设置为用户删除实体的日期(默认为null)。您还可以添加deleted_by列,以标记是谁删除了它。使用某种删除列使FK关系更容易使用,因为这些不会中断。通过将行移动到新表,您必须更新FK(如果您取消删除,则再次更新它们)。缺点是您必须确保所有查询都排除已删除的行(如果将行移动到新表,则不会出现问题)。许多ORM使这种过滤更容易,这取决于您使用的是什么。