要删除,更改实体的标志 VS 移动到另一个 table?

To delete, Changing the flag of entity VS Moving to another table?

我应该将列 deleted 更改为 1 以将其视为已删除,还是最好将记录移至另一个 table?

标志方法很好,因为以后的选择将搜索较少的记录。 第二种方法有点复杂,不是吗?

哪种方法更好?

如前所述 here 比较因素 如下所列。这取决于您根据以下因素做出决定

易于设置

  • 软删除更容易实现,因为它只涉及更新 硬删除时的列还涉及将数据复制到 删除审核 table.

Advantage : Soft Delete

调试

  • 软删除使得调试由于 deleted_flag 但是通过审计 table 调试也很容易 可能的。所以这是平手。

Advantage : NA

正在恢复数据

  • 通过软删除恢复“删除”的数据非常容易,因为 它只是涉及取消设置 deleted_flag.
  • 但是请注意,恢复数据的情况极为罕见。

Advantage : Soft Delete

正在查询活动数据

  • 根据经验,我可以说当 开发人员忘记在 select 查询是由于哪些问题引起的。
  • 如果你使用像 Doctrine 这样的 ORM 和“软删除”插件 启用,那么这将不是问题,因为 ORM 负责 添加此检查。

Advantage : Hard Delete

查看简单性

  • 将 table 中的所有数据作为与视图相关的活动数据 简单(WYSIWYG - 所见即所得)
  • 在硬删除中,所有“删除”的数据只会出现在审计中 table 而系统中的其余 table 将具有“活动” 数据。因此硬删除存在关注点分离。

Advantage : Hard Delete

操作性能

  • 更新比删除快一点(微秒)
  • 所以软删除在技术上应该比硬删除更快( 还有审核 table 插入要考虑)。

Advantage : Soft Delete

应用程序性能

  • 速度
    • 要支持软删除,所有 select 查询都需要有一个条件 '哪里 delete_flag = 0'.
    • 在涉及 JOIN 的情况下,会有多个这样的 状况。 Select 条件较少的查询比 有条件者

Advantage : Hard Delete

  • 尺寸
    • 为了支持更快的软删除,我们需要为每个索引创建一个索引 delete_flag 在每个 table
    • 此外,table 大小不断增加,因为 table 已经 “软删除”数据 + 活动数据。
    • 查询会随着 table 大小的增加而变慢。

Advantage : Hard Delete

数据库功能兼容性 唯一索引

  • 唯一索引通过防止多个 在数据库级别出现一行。
  • 软删除可防止使用唯一索引。
  • 此外,我们无法更新 A1-B1 的旧软删除条目 因为这意味着重写一些数据会导致丢失 记录的数据(例如:更新日期时间或其他一些 deleted_by 列 如果存在)

Advantage : Hard Delete

级联

  • 对于软删除,我们不能使用'ON DELETE'级联。这 另一种方法是创建一个“更新”触发器来跟踪 deleted_flag.

Advantage : Hard Delete