數(shù)據(jù)庫邏輯刪除的解決方案探討

為什么我會看到這篇文章?

你可能是一個程序員,在簡書的搜索框上輸入了“數(shù)據(jù)庫邏輯刪除解決方案”并點擊了搜索按鈕源请。

- 本文章有很多廢話绢涡,如果不想看直接拉到底部 -



我遇到什么問題了?

在進行數(shù)據(jù)庫設(shè)計時,你的公司認為數(shù)據(jù)對于公司來說存在重大意義(即便是已經(jīng)刪除的數(shù)據(jù))呕缭,因此你被強制要求對于數(shù)據(jù)的刪除只能使用邏輯刪除,即增加一個標記字段來記錄該數(shù)據(jù)的刪除狀態(tài)。

你遇到了這樣一個場景瘟判,你的某個字段需要添加唯一鍵約束怨绣,因此你可能想了個辦法,用業(yè)務來控制唯一鍵拷获。例如你的數(shù)據(jù)表中name是唯一的梨熙,現(xiàn)在你需要插入一條name = a的記錄:

然而你的服務運行了一段時間后你還是發(fā)現(xiàn)了數(shù)據(jù)庫中存在 name = a 且 is_delete = 0 的多條字段,大部分是由于以下原因:


你發(fā)現(xiàn)在業(yè)務層面這個問題似乎是無法避免的刀诬,于是你開始考慮從數(shù)據(jù)庫層面避免該問題咽扇。你決定在name字段添加唯一鍵約束,但很快就否定了這個想法陕壹,因為這樣根本沒法進行刪除质欲,所以你開始在網(wǎng)上尋找解決辦法。



有沒有解決這個問題的辦法糠馆?

百度嘶伟、谷歌幫幫我。

在網(wǎng)上搜尋很久以后又碌,我看到了簡書上一篇比較好的文章:邏輯刪除真的不是一個好的設(shè)計九昧。該文章提供了三個方法: 1.放棄mysql? 2.添加delete_token字段? 3.使用數(shù)據(jù)倉庫,評論區(qū)機智網(wǎng)友還提出了方法2的改進: 方法2.5毕匀。

方法2铸鹰,即為數(shù)據(jù)庫添加新的一列delete_token,當某一條記錄需要刪除時皂岔,將該字段設(shè)置為一個UUID蹋笼,將name、delete_token設(shè)置為唯一鍵躁垛,這樣當is_delete=0時剖毯,delete_token保持一個默認值,能夠有效地限制name唯一教馆,當記錄被刪除時逊谋,由于delete_token是一個唯一的UUID,便能保證刪除的記錄不會被唯一約束束縛土铺。但正如該文章的博主所說胶滋,UUID會占用很大的空間,所以不推薦使用舒憾。評論網(wǎng)友針對該問題提出優(yōu)化對策:方法2.5:將刪除記錄的delete_token設(shè)置為該記錄的id镀钓。

個人認為,索引太大只是其中一個弊端镀迂,該方法還會面臨一個很棘手的問題:當需要批量刪除時丁溅,需要對每一條記錄進行逐行刪除。例如該表還有一個字段叫age探遵,現(xiàn)在需要刪除age > 18的記錄窟赏,共有50條妓柜,在業(yè)務中,由于需要為每條的delete_token字段插入一個UUID所以需要將其拆分為50條更新操作來進行涯穷。這樣的代價顯然很難接受



我該怎么辦棍掐?

每種辦法都有一定的應用場景,既然強制要求使用邏輯刪除拷况,就會面臨很多問題作煌,在所難免。今天剛好突然想到一個不錯的點子能解決邏輯刪除帶來的問題赚瘦,若該方法已經(jīng)被提出粟誓,純屬巧合。

將刪除標記設(shè)置默認值(例如0)起意,將唯一字段與刪除標記添加唯一鍵約束鹰服。當某一記錄需要刪除時,將刪除標記置為NULL揽咕。

由于NULL不會和其他字段有組合唯一鍵的效果悲酷,所以當記錄被刪除時(刪除標記被置為NULL時),解除了唯一鍵的約束亲善。此外該方法能很好地解決批量刪除的問題(只要置為NULL就完事了)设易,消耗的空間也并不多(1位 + 聯(lián)合索引)。

目前還沒發(fā)現(xiàn)這個辦法有什么奇怪的bug逗爹。如果有請不要吝嗇在評論區(qū)留言討論亡嫌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掘而,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌于购,老刑警劉巖袍睡,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肋僧,居然都是意外死亡斑胜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門嫌吠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來止潘,“玉大人,你說我怎么就攤上這事辫诅∑敬鳎” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵炕矮,是天一觀的道長么夫。 經(jīng)常有香客問我者冤,道長,這世上最難降的妖魔是什么档痪? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任涉枫,我火速辦了婚禮,結(jié)果婚禮上腐螟,老公的妹妹穿的比我還像新娘愿汰。我一直安慰自己,他們只是感情好乐纸,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布尼桶。 她就那樣靜靜地躺著,像睡著了一般锯仪。 火紅的嫁衣襯著肌膚如雪泵督。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天庶喜,我揣著相機與錄音小腊,去河邊找鬼。 笑死久窟,一個胖子當著我的面吹牛秩冈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斥扛,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼入问,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稀颁?” 一聲冷哼從身側(cè)響起芬失,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匾灶,沒想到半個月后棱烂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阶女,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年颊糜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秃踩。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡衬鱼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出憔杨,到底是詐尸還是另有隱情鸟赫,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站惯疙,受9級特大地震影響翠勉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霉颠,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一对碌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒿偎,春花似錦朽们、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苍糠,卻和暖如春叁丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岳瞭。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工拥娄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞳筏。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓稚瘾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姚炕。 傳聞我的和親對象是個殘疾皇子摊欠,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容