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

时间:2017-07-13 10:50:26

标签: mysql sql database relational-database

最近,我偶然发现了以下问题:给出了一个简单的数据模型,其中包含" Books"和#34;作者"。每个" Book"提及"作者"。使用关系数据库实现持久性。除了添加书籍和作者外,还可以删除它们。通常,如果我想删除一个Author,我会执行SQL DELETE操作并删除相应的行。但是,我在其他项目中看到,人们不会打电话给DELETE。相反,他们添加某种活动/删除标记并将相应的行标记为"删除"。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

第三,delete可以阻止其他操作正常工作,因为表和行以及索引被锁定。这可能会减慢操作系统的速度,特别是在高峰期。

第四,delete可能很难保持关系完整性 - 特别是如果没有定义那些级联删除。

第五,存储便宜。处理能力便宜。因此,对于许多数据库而言,删除记录以恢复空间是不必要的。

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

相关问题