先說背景:某日我測試時一下子刪了很重要的東西,一篇重要的文章,立即後悔了,但是卻發現沒有“資源回收筒”,資料表是直接物理刪除的,我的內心是崩潰的……
此後無論做什麼,我都會記住這個深刻的教訓,給自己留一顆後悔藥,總會在建表時留一個is_del
欄位以表示是否被刪除了……,所有的刪除不直接物理刪除,然後我就很嘚瑟,再也不怕誤刪了……
但是現在碰到了一個麻煩,某個欄位是唯一索引的,而我暫時不想用這個資料就把它刪了,當然不是真刪了,用is_del
標示而已,但是問題就是我現在要添加的一個資料和這個“被刪除”行裡面的唯一欄位重複了,導致我現在如果不真的把那個刪了的話我就添加不了這行資料了。
我想到了兩個解決辦法:不知道合不合理:
1:刪除時將要刪除的資料“剪下”到另外一張“資源回收筒暫存資料表”
2:只剪下要刪除的行的部分資料,比如上文中的唯一索引那個欄位,將當前的衝突欄位資料擦除,放到另外一張暫存資料表上面,用主鍵對應就可以了。
我總覺得是不是我的想法有問題,總感覺欠妥,但又不知道怎麼做,希望有經驗的大神解答指點下哈?
回複內容:
先說背景:某日我測試時一下子刪了很重要的東西,一篇重要的文章,立即後悔了,但是卻發現沒有“資源回收筒”,資料表是直接物理刪除的,我的內心是崩潰的……
此後無論做什麼,我都會記住這個深刻的教訓,給自己留一顆後悔藥,總會在建表時留一個is_del
欄位以表示是否被刪除了……,所有的刪除不直接物理刪除,然後我就很嘚瑟,再也不怕誤刪了……
但是現在碰到了一個麻煩,某個欄位是唯一索引的,而我暫時不想用這個資料就把它刪了,當然不是真刪了,用is_del
標示而已,但是問題就是我現在要添加的一個資料和這個“被刪除”行裡面的唯一欄位重複了,導致我現在如果不真的把那個刪了的話我就添加不了這行資料了。
我想到了兩個解決辦法:不知道合不合理:
1:刪除時將要刪除的資料“剪下”到另外一張“資源回收筒暫存資料表”
2:只剪下要刪除的行的部分資料,比如上文中的唯一索引那個欄位,將當前的衝突欄位資料擦除,放到另外一張暫存資料表上面,用主鍵對應就可以了。
我總覺得是不是我的想法有問題,總感覺欠妥,但又不知道怎麼做,希望有經驗的大神解答指點下哈?
如果要足夠最佳化的解,那自然是移到其他表去,這樣既不妨礙當前表資料,又利用當前表高效的工作。
如果圖方便,可以弄個複合式索引,將is_del
也納入其中。
一般情況下 唯一索引 只能給id
nickname
之類的欄位
一條記錄is_del
的時候id
nickname
之類的被使用了就是被使用,不應該再出現,拿nickname
來說,這條記錄被刪除,應該被當作封鎖而不是常規的刪除,某個nickname
被刪或者被封鎖以後這個欄位不應該再被拿出來使用。
刪除的時候先把這個記錄複製到到資源回收筒
`被刪除資料備份`表可以做,但是更好的做法應該是處理你的唯一索引,確定你這個欄位是否真的需要唯一索引
如果不嫌麻煩就做個日誌系統,所有增刪改的資料都寫入日誌,然後如果有誤操作再根據日誌做復原操作
放到另一張表裡邊吧,保險,而且當你查詢刪除資料的時候可能速度會快一些。不過我感覺放到臨時刪除表的時候,id應該重建了,不然你再刪除相同id的資料,麻煩還是會出現。
建表的時候保留is_delete欄位是一個很好的習慣。
按照你說的,你刪除資料後,又要添加一個和已經刪除記錄的唯一索引欄位相同的記錄,可見你已經刪除的記錄在業務中應該不會在用到了。
我想到的解決方案是:
1.將唯一欄位和is_delete欄位一起設定成唯一索引,這種加入後面需要將刪除的記錄恢複使用很容易處理;
2.在插入唯一重複的記錄時,將刪除的記錄移到history表中,這種原表更簡單,不過後面要恢複以前的記錄有點麻煩;
3.如果插入唯一重複記錄的情況比較多,建議直接採取刪除時候就移到history表中,這樣插入的時候方便。
親,windows系統的資源回收筒難道避免了誤刪重要檔案的結局嗎?
我覺得你想的太多了,從你的故事背景就可以看出來你的立場出了問題。作為一個開發人員,你需要滿足客戶的要求,比如刪除文章這種事情根本不是你應該做的,如果使用者自己刪錯了東西他自己去後悔,和你有什麼關係?就像咱們在這裡發東西,刪掉之後能找回來嗎?開發人員需要為此負責嗎?
日誌其實是很重要的東西,但是通常使用日誌不是為了找回資料,而是為了分析問題,實際上mysql本身也可以開啟日誌,那個可以協助你找回資料,為什麼要在php上重新搞一遍呢?
所以,我的看法是除非客戶說:我們使用的時候經常刪錯東西,別做物理刪除了,這個時候才需要考慮is_del這種方法。但是一般也要講清楚,使用這個方式之後資料就永遠不會刪除了,千萬別說還有一個功能可以把標記為is_del的資料真正刪除,那還是解決不了經常刪錯東西問題。
程式不可能解決使用者犯下的錯誤,所以根本沒必要想太多。對於有些人來說,就算你設計了is_del1,is_del2,is_delN,錯刪資料的事情還是會發生。