2017-07-13 36 views
0

最近,我偶然發現了以下問題:Given是一個帶有「Books」和「Authors」的簡單數據模型。每本「書」都有一個「作者」的參考。持久性是通過關係數據庫實現的。除了添加書籍和作者外,還可以刪除它們。通常,如果我想刪除作者,我會執行SQL DELETE操作並刪除相應的行。但是,我在其他項目中看到,人們不會撥打DELETE。相反,他們添加某種活動/刪除標誌並將相應的行標記爲「已刪除」。關係數據庫:DELETE與「刪除標記」

我的問題是:這是一般的最佳做法嗎?有什麼優勢?我最好的猜測是:

  • 設置一個標誌,具有比DELETE操作
  • 有更好的表現。如果你運行的空間,它仍然可以運行清理服務,查找刪除的對象,並刪除相應的行
  • 設置一個刪除標誌是數據庫一致性更好,因爲「作者」的例子刪除上面的程序可以在相應的「簿條目破壞外鍵。

不管怎樣,這些都只是猜測。是否有人知道答案?

回答

2

有很多原因不使用delete。首先,保持歷史可能非常重要。我不會使用「僅」刪除標誌,而是使用有效日期。

其次,在運營系統中,delete可能是一個昂貴的操作。該行需要從表中刪除,從關聯索引中刪除,然後可能會級聯刪除和觸發器。

第三,delete可以防止其他操作的工作很好,因爲表和行和索引被鎖定。這可能會減慢運營系統,特別是在高峯期。

四,delete維護關係完整性可能會非常棘手 - 特別是如果沒有定義那些級聯刪除。

第五,存儲很便宜。處理能力很便宜。所以,對於很多數據庫來說,刪除記錄來恢復空間是不必要的。

這並不意味着您應該始終避免刪除記錄。但是不急於刪除數據是非常有道理的。