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

25 php mysql database-design soft-delete

问题

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

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

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

我的直接想法

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

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

你的意见?

此外,我很感激任何相关资源的链接.

irc*_*ell 32

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

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

编辑:事实上,你可以使用它在你的应用程序中有多个软删除"层".所以每个都可以是一个代码:

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

拥有其他2个级别仍然允许管理员和管理员清理已删除的列表,如果它们太长.由于前端代码只是检查is_deleted = 0,它对前端是透明的...

  • ENUM可能会优于0,1,2,4.ENUM将自我记录,就像表演一样. (2认同)

Ron*_*nis 9

使用软删除是很常见的事情,它们对许多事情都很有用,例如:

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

我想指出的一件事是,几乎所有人都会想念,并且总是会在后面的部分中咬你.您的应用程序的用户与删除的理解不同.

有不同程度的删除.典型的用户在他(s)时删除东西

  • 做了一个错误,并希望删除不良数据
  • 不想再看到屏幕上的东西了

问题是如果你没有记录删除的意图,你的应用程序就无法区分错误的数据(应该永远不会创建)和历史上正确的数据.

看看以下数据:

PRICES | item | price | deleted |
       +------+-------+---------+
       |   A  |  101  |    1    |
       |   B  |  110  |    1    |
       |   C  |  120  |    0    |
       +------+-------+---------+
Run Code Online (Sandbox Code Playgroud)

某些用户不想显示商品B的价格,因为他们不再销售该商品.所以他删除了它.另一个用户通过误导为物品A创建了价格,因此他将其删除并按预期为物品C创建了价格.现在,您能告诉我所有产品的价格清单吗?不,因为要么必须显示潜在的错误数据(A),要么必须排除除当前价格之外的所有数据(C).

当然,上述内容可以通过多种方式处理.我的观点是,必须非常清楚什么有一个删除的意思,并确保有没有办法为用户missunderstand它.一种方法是强制用户做出选择(隐藏/删除).


HLG*_*GEM 5

如果我有现有的代码命中该表,我会添加该列并更改表的名称.然后我将创建一个与当前表同名的视图,该视图仅选择活动记录.这样,现有的代码都没有破坏,你可以拥有软删除列.如果要查看已删除的记录,请从基表中进行选择,否则使用该视图.