关系数据库:DELETE与“标记为删除”

Chr*_*ann 2 mysql sql database relational-database

最近,我偶然发现了以下问题:给出了一个简单的数据模型,其中包含“ Books”和“ Authors”。每个“书”都有对“作者”的引用。持久性是通过关系数据库实现的。除了添加书籍和作者,还可以删除它们。通常,如果要删除作者,我将执行SQL DELETE操作并删除相应的行。但是,在其他项目中,我没有看到有人打电话DELETE。相反,它们添加某种活动/已删除标志并将相应的行标记为“已删除”。

我的问题是:这是一般的最佳做法吗?有什么优势?我最好的猜测是:

  • 设置标志比DELETE操作具有更好的性能
  • 如果空间不足,仍然可以运行清理服务,以查找已删除的对象并删除相应的行
  • 设置删除标记对于数据库一致性更好,因为在上面的示例中删除“ Author”可能会破坏相应的“ Book条目”中的外键。

无论如何,这些只是猜测。有人知道答案吗?

Gor*_*off 5

不使用的原因有很多delete。首先,保持历史记录非常重要。我不会使用“只是”删除标志,而是使用有效日期。

其次,在操作系统中,这delete可能是昂贵的操作。该行需要从表,关联的索引中删除,然后可能会有级联的删除和触发器。

第三,delete由于表,行和索引被锁定,可能会阻止其他操作正常进行。这会降低操作系统的运行速度,尤其是在高峰时段。

第四,delete维护关系完整性可能很棘手-尤其是在未定义级联删除的情况下。

第五,存储很便宜。处理能力很便宜。因此,对于许多数据库来说,删除记录以恢复空间根本是没有必要的。

这并不意味着您应该始终避免删除记录。但是有非常正当的理由不急于删除数据。