【问题标题】:How to facilitate `soft delete` of data while facilitating `physical delete` as well?如何在方便“物理删除”的同时方便“软删除”数据?
【发布时间】:2019-06-23 20:04:46
【问题描述】:

我有一个 MySQL 数据库,其中一些表与外键互连。好吧,您可以在下面查看示例。

如果需要,我需要确保可以删除两个父子。但我还需要确保系统会执行软删除(只需标记为已删除,无需物理删除它们),以便我们可以恢复数据或使用它们进行分析。

  1. 我知道我可以通过启用ON DELETE CASCADE 轻松删除两个父子节点。但是在这里我可能会永远丢失成千上万的数据并且无法恢复。不小心删了就乱了。

  2. 我知道我可以禁用ON DELETE CASCADE 并在数据库表中添加另一个字段来标记记录deleted。因此,如果一条记录被删除,它将被简单地标记为已删除,并且不会显示在应用程序中,而它们将显示在数据库中。这种情况下的问题是,如果parent 被标记为已删除,那么我必须将所有children 也标记为已删除,至少在我的系统中是这样。另一方面,如果我真的想删除记录,那将是一个相当大的麻烦,我必须先删除所有child记录。

那么更好的选择应该是什么?我对制作影子表、存档表、视图等过于复杂并不感兴趣。

我能想到的最佳选择如下。

  1. 启用DELETE ON CASCADE。但不要将记录delete 方法暴露给普通用户。仅向管理员公开这些方法。

  2. delete_flag 字段添加到表中。该字段将标记一条记录是否被删除。将这些方法公开给普通用户和管理员,因为它实际上不会删除任何内容。

请让我知道这种方式是否好或您有更好的选择?另外,如果我的方式更好,当父母的delete_flag发生变化时如何更新孩子的delete_flag

【问题讨论】:

  • @Raymond Nijland 据我所知,PO 正在谈论一个包含产品信息的表格和一个关于这些产品类别的表格。它没有任何个人的个人数据,因此 GDPR 不适用,因为它仅适用于个人数据,不适用于产品数据

标签: java mysql database hibernate mysql-workbench


【解决方案1】:

我是这样处理这种事情的。

  1. 避免级联约束,

  2. 我在每张桌子上放了一个expiry_datestamp 列。

  3. 我将实时数据查询设置为 AND (expiry_datestamp IS NULL OR expiry_datestamp < NOW())

  4. 软删除行时,我使用UPDATE ... SET expiry_datestamp = NOW()

  5. 这样就可以查看数据并查看最近软删除的内容和时间。

  6. 我创建了清除程序来删除过期的东西,方法是在父记录之前明确删除子记录。 (不依赖于 CASCADE CONSTRAINT 功能)。这些程序可以每月或每周运行,也可以按您需要的任何时间表运行。

  7. 如果您将新记录中的 expiry_date 值设置为远在未来的特定日期,则可以简化 (x IS NULL OR x < NOW()) 过滤器。

注意。您当然可以使用deleted 列而不是我更复杂的expiry_date 方法。 如果您这样做,请确保您的查询是 AND deleted = 0 而不是 AND deleted <> 1。不等式过滤器的性能不如等式过滤器。

关于 GDPR:这是一个真正令人担忧的问题,也是令人头疼的问题。如果您的政策规定您在用户最后一次输入个人身份信息三个月后删除个人身份信息,那么您可以让您的清除程序处理该操作。您说得对,产品信息不是个人信息。

编辑:我的程序:我不喜欢授予 Web 应用程序用户对硬删除行的 MySQL 权限,而只是对它们进行软删除。在我的工作流程中,在具有更高权限的清除作业中执行此操作更安全。我避免 CASCADE CONSTRAINTS 因为我不喜欢副作用:我想在 DELETE(或 UPDATE)违反约束时捕获并停止它们。我相信创建我的清除程序以明确删除相关行是更安全和更好的编程实践。

您可能有不同的偏好。

【讨论】:

  • 感谢您的回复。那么为什么要避免cascade 而它可以让一切变得轻松呢?在我的情况下,数据将在需要时通过 GUI 程序手动删除,没有自动化过程。关于 GDPR,别担心,没有这样的问题。用户可以选择deletedeactivatedelete 表示物理删除,deactivate 表示软删除。
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多