數據大多是軟刪除的,而有時候遇到聯合主鍵就頭疼了,例如
public class Thumbup { public int Id {get;set;} public int UserId {get;set;} public int BlogId {get;set;} public bool IsDeleted {get;set;} }
在這個點贊表中,每人只能贊一次,因此通過聯合主鍵(UserId, BlogId) 實現唯一約束。 但是當軟刪除之后,再贊一次的時候,就無法插入數據了,因為違反了唯一性約束。解決這個問題,第一想法就是把 IsDeleted 改成
public DateTimeOffSet DaletedAt {get;set;}
再修改聯合主鍵包含 DaletedAt,這樣就避免了軟刪除之后,無法插入新數據了。但是這樣的話,索引也變得更復雜了,應該會導致操作數據的效率降低,那么是不是還有更好的解決辦法呢?外事不決問 Google,果然這個問題早就有很多人遇到了,有人把 IsDeleted 字段改成 public Guid DeletedToken {get;set;} 利用不重復的 Guid 來實現,也是一個思路,但是問題依舊。
還有一個更好的解決辦法,不過需要數據庫支持,那就是有條件的唯一索引,意思就是給索引加一個條件,偽代碼:Create Index on (UserId & BlogId) where IsDeleted == false
目前用的 mongodb 有 partial index ,其他數據庫等遇到再更新。