代码之家  ›  专栏  ›  技术社区  ›  PeakGen

如何在方便“物理删除”的同时方便“软删除”数据?

  •  -1
  • PeakGen  · 技术社区  · 7 年前

    enter image description here

    如果需要,我需要确保可以删除父子关系。但我还需要确保系统将执行 软删除 (只标记为 删除 无需实际删除它们),因此我们可以恢复数据或将其用于分析。

    1. 我知道我可以通过启用 ON DELETE CASCADE

    2. 我知道我可以禁用 关于删除级联 deleted . 所以,若一条记录被删除,它将被简单地标记为已删除,并且不会显示在应用程序中,而它们将显示在数据库中。本场景中的问题是,如果 parent 被标记为已删除,则我必须标记所有 children 至少在我的系统中也被删除了。从另一方面来说,如果我真的想删除记录,那将是一个相当混乱的局面,我将不得不删除所有记录 child

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

    1. DELETE ON CASCADE . 但不要公开记录 delete 方法向一般用户提供。仅向管理员公开这些方法。

    2. 添加 delete_flag 字段到表。此字段将标记是否删除记录。向普通用户和管理员公开这些方法,因为它不会删除任何内容。

    删除标志 当父母的 发生了什么变化?

    1 回复  |  直到 7 年前
        1
  •  1
  •   O. Jones    7 年前

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

    1. 避免级联约束,

    2. 我放了一个 expiry_datestamp

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

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

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

    6. 我创建清除程序来删除过期的内容,方法是在父记录之前显式删除子记录。(不依赖级联约束功能)。这些程序可以每月或每周运行,也可以按您需要的任何时间表运行。

    7. (x IS NULL OR x < NOW())

    笔记你当然可以使用 deleted 而不是我的更复杂的 expiry_date 如果你这样做 ,请确保您的查询 AND deleted = 0 AND deleted <> 1 . 不平等过滤器的性能不如平等过滤器。

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

    :我的过程:我不想授予web应用程序用户MySQL硬删除行的权限,只想软删除行。在我的工作流程中,在具有更高权限的清除作业中这样做更安全。我避免级联约束,因为我不喜欢副作用:我希望捕获并停止违反约束的删除(或更新)。我相信,创建清除过程以明确删除依赖行更安全、更好的编程实践。

    您可能有不同的偏好。