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

kod*_*ire 2 sql delete-row

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

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

哪种方法更好?

Vig*_*r A 5

如此处 所述,下面列出了比较因素。由您根据以下因素做出决定

\n\n

易于设置

\n\n
    \n
  • 软删除更容易实现,因为它只涉及更新列,而硬删除还涉及将要删除的数据复制到审核表。
  • \n
\n\n
\n

优点:软删除

\n
\n\n

调试

\n\n
    \n
  • 软删除可以轻松调试由于\ndeleted_flag 导致的数据问题,但通过审核表进行调试也\n很容易。所以这是平局。
  • \n
\n\n
\n

优势 : 不适用

\n
\n\n

恢复数据

\n\n
    \n
  • 通过软删除恢复数据 \xe2\x80\x98deleted\xe2\x80\x99 非常容易,因为\nit 只需要取消设置deleted_flag。
  • \n
  • 但请注意,恢复数据的情况极为罕见。
  • \n
\n\n
\n

优点:软删除

\n
\n\n

查询活动数据

\n\n
    \n
  • 根据经验,我可以说,当开发人员忘记在 select 查询中添加 \xe2\x80\x98delete_flag = 0\xe2\x80\x99 条件时,就会出现许多问题。
  • \n
  • 如果您使用像 Doctrine 这样的 ORM 并启用了 \xe2\x80\x98soft delete\xe2\x80\x99 插件,那么这不会成为问题,因为 ORM 会负责\n添加此检查。
  • \n
\n\n
\n

优点:硬删除

\n
\n\n

查看简单性

\n\n
    \n
  • 将表中的所有数据作为活动数据与视图\n简单性相关(所见即所得 - 所见即所得)
  • \n
  • 在硬删除中,所有 \xe2\x80\x98deleted\xe2\x80\x99 数据将仅出现在审核表中,而系统中的其余表将具有 \xe2\x80\x98active\xe2\x80\x99 \n数据。因此硬删除存在关注点分离。
  • \n
\n\n
\n

优点:硬删除

\n
\n\n

经营业绩

\n\n
    \n
  • 更新比删除快一点(微秒)
  • \n
  • 因此,从技术上讲,软删除应该比硬删除更快(硬删除还需要考虑审核表插入)。
  • \n
\n\n
\n

优点:软删除

\n
\n\n

应用性能

\n\n
    \n
  • 速度\n\n
      \n
    • 为了支持软删除,所有选择查询都需要有一个条件\n\xe2\x80\x98WHERE delete_flag = 0\xe2\x80\x99。
    • \n
    • 在涉及 JOIN 的情况下,将会有多个这样的\n条件。具有较少条件的选择查询比\n具有条件的查询更快。
    • \n
  • \n
\n\n
\n

优点:硬删除

\n
\n\n
    \n
  • 大小\n\n
      \n
    • 为了支持更快的软删除,我们需要为每个表中的每个\ndelete_flag都有一个索引
    • \n
    • 此外,由于表已\n\xe2\x80\x98软删除\xe2\x80\x99数据+活动数据,因此表大小不断增加。
    • \n
    • 随着表大小的增加,查询可能会变慢。
    • \n
  • \n
\n\n
\n

优点:硬删除

\n
\n\n

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

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

优点:硬删除

\n
\n\n

级联

\n\n
    \n
  • 对于软删除,我们不能使用 \xe2\x80\x98ON DELETE\xe2\x80\x99 级联。另一种选择是创建一个 \xe2\x80\x98UPDATE\xe2\x80\x99 触发器来跟踪\ndeleted_flag。
  • \n
\n\n
\n

优点:硬删除

\n
\n