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

smtd7mpg  于 2023-02-18  发布在  PHP
关注(0)|答案(7)|浏览(132)
    • 问题**

在一个处理产品和订单的Web应用程序中,我希望维护以前的员工(用户)与他们处理的订单之间的信息和关系。我希望维护过时产品与包含这些产品的订单之间的信息和关系。
然而,我希望员工能够整理管理界面,如删除前员工,过时的产品,过时的产品组等。
我正在考虑实现软删除。那么,通常是如何实现的呢?
"我的第一React"
我的第一个想法是在每个应该是软删除的对象表中添加一个"flag_softdeleted TINYINT NOT NULL DEFAULT 0"列。
然后,我在每个相关的GUI中提供了一个"显示已删除"或"取消删除"按钮。单击此按钮,您将在结果中包括软删除的记录。每个已删除的记录都有一个"恢复"按钮。这是否有意义?
你的想法?
此外,我将感谢任何相关资源的链接。

2eafrhcq

2eafrhcq1#

我就是这么做的。我有一个is_deleted字段,默认值为0。然后查询只检查WHERE is_deleted = 0
我尽量避免硬删除。有时候硬删除是必要的,但我把它设为管理员专用功能。这样我们可以硬删除,但用户不能...

**编辑:**事实上,你可以利用这个功能在你的应用中设置多个软删除“层”。因此,每个软删除层都可以是一个代码:

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

如果列表太长,那么其他两个级别仍然允许管理员和管理员清理已删除的列表。而且由于前端代码只检查is_deleted = 0,所以它对前端是透明的...

sr4lhrrt

sr4lhrrt2#

使用软删除是一个常见的事情来实现,他们是死有用的很多事情,像:

  • 在用户删除某些内容时保存用户的数据
  • 删除某些内容时保存自己的数据
  • 对实际发生的事情作跟踪记录(一种审计)
  • 等等

有一件事我想指出,几乎每个人都错过了,它总是回来咬你的后面一块,你的应用程序的用户没有同样的理解一个 * 删除 * 你有。
有不同程度的删除。典型的用户删除东西时,他

  • 犯了一个错误,希望删 debugging 误数据
  • 不想再看到屏幕上的内容

问题是,如果不记录删除的“意图”,应用程序就无法区分错误数据(不应该创建)和历史正确数据。
请看以下数据:

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

某个用户不想显示商品B的价格,因为他们不再销售该商品了。于是他删除了该商品。另一个用户错误地创建了商品A的价格,于是他删除了该价格,并按预期创建了商品C的价格。现在,您能给我显示所有产品的价格列表吗?不能,因为您要么必须显示可能错误的数据(A),或者您必须排除当前价格以外的所有价格(C)。
当然,以上问题可以用很多方法来解决。我的观点是,YOU需要非常清楚YOU所指的删除是什么意思,并确保用户无法误解它。一种方法是强迫用户做出选择(隐藏/删除)。

63lcw9qa

63lcw9qa3#

如果我有命中该表的现有代码,我将添加列并更改表的名称。然后,我将创建一个与当前表同名的视图,该视图仅选择活动记录。这样,现有代码不会中断,您可以软删除列。如果您想查看已删除的记录,您可以从基表中选择,否则使用视图。

xdyibdwo

xdyibdwo4#

我一直只是使用一个你提到的 deleted 列。实际上没有什么比这更重要的了。不用删除记录,只要将 deleted 字段设置为true就行了。
我构建的一些组件允许用户查看所有删除的记录并恢复它们,其他组件只显示 deleted = 0的所有记录

dphi5xsq

dphi5xsq5#

你的想法确实有道理而且在生产中经常使用,但是,要实现它,你需要更新相当多的代码来解释新字段。2另一个选择是存档将“软删除”记录(移动)到单独的表或数据库中。这也是经常发生的事情,使问题成为维护问题,而不是(重新)编程。(您可以让一个表触发器对删除做出React,以存档删除的记录。)
我会做存档以避免对产品代码的重大更新。但是如果你想使用deleted-flag字段,使用它作为一个时间戳给予你一个布尔值以外的额外有用的信息。(Null =未删除。)您可能还需要添加DeletedBy字段以跟踪负责删除记录的用户。使用两个字段可以提供大量信息,告诉您谁删除了什么以及何时删除了什么。(两个额外字段的解决方案也可以在归档表/数据库中实现。)

llew8vvj

llew8vvj6#

我遇到过的最常见的场景就是您所描述的,一个tinyint甚至bit表示IsActiveIsDeleted的状态,根据这是“业务”数据还是“持久性”数据,它可能会尽可能透明地融入到应用程序/域逻辑中。比如直接存储在存储过程中,而不为应用程序代码所知。但听起来这是您需要的合法业务信息,因此需要在整个代码中都知道。(因此,用户可以查看已删除的记录,如您所建议的那样。)
我见过的另一种方法是使用两个时间戳的组合来显示给定记录的活动“窗口”。维护它需要更多的代码,但好处是可以安排一些东西在预定时间软删除自己。限时产品可以在创建时设置为这种方式。(要使记录无限期地处于活动状态,可以使用max值(或者只是某个遥远的未来日期),或者如果您同意的话,可以将结束日期设置为null)。
当然,还要进一步考虑不时删除/恢复的内容,并跟踪某种审计。标记方法只知道当前状态,时间戳方法只知道最近的窗口。但像审计跟踪这样复杂的内容绝对应该与相关记录分开存储。

mbjcgjjk

mbjcgjjk7#

相反,我将使用一个bin表来移动从其他表中删除的所有记录,删除标志的主要问题是,对于链接表,当试图插入新记录时,肯定会遇到双键错误。

bin表的结构可能如下所示:

id, table_name, data, date_time, user

地点

  • id 是自动递增的主键
  • table_name 是从中删除记录的表的名称
    • 数据包含 * JSON格式的记录,包含所有字段的名称和值
  • date_time 是删除的日期和时间
  • user 是执行操作的用户(如果系统提供)的标识符

这种方法不仅使您不必在每次查询时检查删除标志(想象一下有许多连接的查询),而且使您可以在表中只保留真正需要的数据,从而方便使用SQL客户端程序进行任何搜索和更正

相关问题