软删除最佳实践(PHP/MySQL)

2022-08-30 14:50:55

问题

在处理产品和订单的 Web 应用程序中,我希望维护前员工(用户)与他们处理的订单之间的信息和关系。我想维护过时产品和订单(包括这些产品)之间的信息和关系。

但是,我希望员工能够使管理界面变得混乱,例如删除以前的员工,过时的产品,过时的产品组等。

我正在考虑实现软删除。那么,人们通常如何做到这一点呢?

我的直接想法

我的第一个想法是在每个应该软删除的对象表中粘贴一个“TINYINT NOT NULL DEFAULT 0”列。或者也许使用时间戳代替?flag_softdeleted

然后,我在每个相关的GUI中提供了一个“显示已删除”或“取消删除”按钮。单击此按钮,您将在结果中包含软删除的记录。每个删除的记录都有一个“恢复”按钮。这有意义吗?

你的想法?

另外,我很感激任何相关资源的链接。


答案 1

我就是这样做的。我有一个默认为0的字段。然后查询只需检查。is_deletedWHERE is_deleted = 0

我尽量远离任何硬删除。它们有时是必要的,但我将其作为仅限管理员的功能。这样,我们可以硬删除,但用户不能...

编辑:实际上,您可以使用它来在应用程序中拥有多个软删除“层”。因此,每个都可以是一个代码:

  • 0-> 未删除
  • 1->软删除,显示在管理用户的已删除项目列表中
  • 2->软删除,不会显示给除管理员用户以外的任何用户
  • 3-> 仅对开发人员显示。

拥有其他2个级别仍将允许经理和管理员在删除的列表太长时清理它们。由于前端代码只是检查 ,因此它对前端是透明的...is_deleted = 0


答案 2

使用软删除是一件很常见的事情来实现,它们对很多事情都非常有用,比如:

  • 在用户删除某些内容时保存用户的数据
  • 删除某些内容时保存自己的数据
  • 记录真实发生的事情(一种审计)
  • 诸如此类

有一件事我想指出,几乎每个人都错过了,它总是回来咬你的后部。应用程序的用户对删除的理解与您不同。

有不同程度的删除。典型用户在以下情况下删除内容:

  • 犯了一个错误,想要删除坏数据
  • 不想再在屏幕上看到某些内容

问题是,如果不记录删除的意图,应用程序将无法区分错误数据(本应从未创建过的数据)和历史上正确的数据。

查看以下数据:

PRICES | item | price | deleted |
       +------+-------+---------+
       |   A  |  101  |    1    |
       |   B  |  110  |    1    |
       |   C  |  120  |    0    |
       +------+-------+---------+

某些用户不想显示项目 B 的价格,因为他们不再销售该项目。所以他删除了它。另一个用户通过误读为物料 A 创建了价格,因此他按预期删除了该价格并创建了物料 C 的价格。现在,你能给我看一个所有产品的价格清单吗?否,因为要么必须显示可能错误的数据 (A),要么必须排除除当前价格 (C) 之外的所有价格。

当然,上述问题可以通过多种方式处理。我的观点是,您需要非常清楚地了解删除的含义,并确保用户无法错过它。一种方法是强制用户做出选择(隐藏/删除)。


推荐