2017-07-13 15 views
0

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

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

  • 设置一个标志,具有比DELETE操作
  • 有更好的表现。如果你运行的空间,它仍然可以运行清理服务,查找删除的对象,并删除相应的行
  • 设置一个删除标志是数据库一致性更好,因为“作者”的例子删除上面的程序可以在相应的“簿条目破坏外键。

不管怎样,这些都只是猜测。是否有人知道答案?

回答

2

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

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

第三,delete可以防止其他操作的工作很好,因为表和行和索引被锁定。这可能会减慢运营系统,特别是在高峰期。

四,delete维护关系完整性可能会非常棘手 - 特别是如果没有定义那些级联删除。

第五,存储很便宜。处理能力很便宜。所以,对于很多数据库来说,删除记录来恢复空间是不必要的。

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