本人不才,不知這個「邏輯刪除」詞用的對不對,想表達的就是:當刪除時只是將 is_deleted 字段設置爲 1,而不是真的將這條記錄刪掉,關鍵詞多是 logic delete 或 soft delete。數據庫
查了一些資料,貌似支持「邏輯刪除」觀點的人是多數的:安全
有前輩提到一個觀點,真實世界是沒有刪除的。訂單做廢,用戶禁用,員工離職,文稿廢棄,優惠券做廢都是狀態的變化。因此 SQL 裏面 DELETE 在業務場景裏都不該該出現。插件
爲了安全,生產環境不能有人或有程序是對數據庫的表有 DELETE 權限的。設計
反對的聲音仍是有的:日誌
邏輯刪除的設計還會致使經常使用的 unique key 失效(固然用戶可將數據行中原來的碼和 is_deleted 一塊兒做爲 unique key,可是這樣又會出現,再次刪除時,系統中沒法出現兩個徹底相同的 ID,又都是 is_deleted=1 的記錄出現)。事務
被「刪除」的這條記錄若是在業務中與大量的表有關聯關係,那麼在刪除它時,就會引起不少的級聯的更新,或者判斷引用並提示用戶沒法修改正被引用的資源。而要保證這些所有更新無誤,又要求事務必定可靠,若產生了狀態不一致,那麼這些「髒數據」的維護也是很痛苦的。資源
當表中的記錄數愈來愈大時,查詢起來會愈來愈慢。get
我能理解具體問題須要具體分析,是要「邏輯刪除」仍是「物理刪除」,主要仍是要根據實際的業務場景,好比互聯網企業搜 /收集的我的信息、電商類平臺用戶的訂單、金融類平臺的交易記錄,確定是不能刪除的。可是對於一些維護中間狀態的數據,若是能夠經過記錄日誌實現「留檔」那麼就能夠真的刪掉它。it
不知道有沒有那種開源組件,能夠_自動實現_當我從一個表中物理刪除一條記錄時,它能夠幫我將它轉移到備份表中,我看了一個 MySQL 的審計插件,可是好像並不作這個用途的。或者有相似「 commit log 」那種東東,刪除時只須要記錄一個 log,有須要的時候能夠從日誌中恢復回來。ast
下附幾個我搜過的資料,但願能幫助和我同樣迷茫的童鞋:
「別刪除數據」 http://www.infoq.com/cn/news/2009/09/Do-Not-Delete-Data
「邏輯刪除真的不是一個好的設計 - 簡書」 http://www.jianshu.com/p/f37281576585
「 MySQL 刪除數據是加一個字段作標記,仍是將刪除的數據插入到另一張備份表裏,哪一種方案更好? - V2EX 」https://fast.v2ex.com/t/406208
「不作顯式刪除,而用 status=0 代替,是好的實踐麼? - V2EX 」 https://www.v2ex.com/t/363226