01前言
不知道大家有沒有遇到這麼一種業務場景,在業務中有個唯一限制A,當該業務進行邏輯删除後(設定标記為删除狀态),再往唯一限制列插入相同的值時,此時會報Duplicate entry,但在業務上,該值時必須要插入的。今天我們就來聊聊處理這種業務場景的幾種思路
02解決思路
方案一:不采用邏輯删除,直接實體删除
方案二:建立曆史表
主表進行實體删除,同時将删除的記錄儲存到曆史表中
方案三:取消表的唯一限制,同時引入redis來保證唯一限制
取消表的唯一限制,在項目中引入redis,通過redis來判重,新增時往redis set記錄,删除時,删除redis記錄
方案四:變更删除标記為時間戳
将删除狀态不以0,1表示,而是以時間戳為值,然後将删除狀态為與之前的唯一限制A重新組成唯一聯合限制index(A、del_flag),删除時變更del_flag的時間戳
方案五:保留删除标記,同時建立一個字段del_unique_key
保留删除狀态位,再新增一個字段del_unique_key,該字段預設值為0,字段類型和大小與主鍵id保持一緻,同時與原先的唯一限制重新組成聯合唯一限制index(A,del_unique_key),業務進行邏輯删除,變更del_unique_key的值為該删除行的主鍵id
03方案的取舍
方案一得從業務的角度上考慮了,如果實體删除,對業務無損,那就無所謂了。方案二等于需要删除的記錄的表都需要有曆史表,如果僅僅是用來實作記錄删除記錄,感覺有點大材小用。方案三引入redis,雖然也可以解決問題,但是又額外增加複雜度,同時還得保證redis和資料庫的一緻性。方案四和方案五其實實作的思路是一樣,不過如果已經是線上上跑的業務,還是推薦用第五種方案,畢竟新增字段正常對已有的業務影響相對較小,如果是第四種方案,直接将标志位修改為時間戳,可能還會涉及改頁面。如果是新增業務,第四種和第五種方案比較推薦