成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據軟刪除時保持字段值唯一性的問題

數據庫
在數據庫做數據軟刪除操作時,怎么保證該行數據中要求具有唯一性的字段數據的唯一性。也就是說,軟刪除狀態下要求具有唯一性的字段數據可以出現多次,未刪除狀態下要求具有唯一性的字段數據只能出現一次。

俗話說:脫離了業務場景的技術面試就是耍流氓。筆者今天(2021-05-19)面試一家做安全公司的 “科學家” 崗位時,被問到關于數據庫的一道題,感覺很有代表性,特此記錄下來分享給大家。

1. 問題

在數據庫做數據軟刪除操作時,怎么保證該行數據中要求具有唯一性的字段數據的唯一性。也就是說,軟刪除狀態下要求具有唯一性的字段數據可以出現多次,未刪除狀態下要求具有唯一性的字段數據只能出現一次。

不要告訴我你不知道什么是軟刪除?

軟刪除就是該行數據不會真正的從數據表中被delete掉,會有狀態字段記錄該行數據已經刪掉

  1. CREATETABLE `userinfo1` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(50) DEFAULT ""
  4.   `status` bigint(20) DEFAULT 0 COMMENT "刪除狀態(默認0)表示未刪除"
  5.   PRIMARY KEY (`id`) 
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

 假設現在存在userinfo1表,要求:在status為非刪除狀態下name字段值唯一,在刪除狀態下相同的name字段可以出現多次。對于上面的表結構可以進行索引改造等操作,但是不允許添加新的字段。

我給出的解決方案

針對這個問題,當時我的腦海中閃現出兩套方案。

方案1:

對userinfo1表的name字段設置為唯一索引。同時,創建另外一張相同的表結構userinfo2,表中name字段不設置為唯一索引。在數據刪除時,把userinfo1表中的數據真實的刪除掉,同時把刪除的數據存儲到userinfo2中一份。

優點:

  1. 未刪除數據、刪除數據分開存儲
  2. 可以解決name字段在未被刪除時唯一存在,刪除之后可以重復的問題

缺陷:

  1. 不符合題目軟刪除要求
  2. 多創建了一張表,增加了維護成本
  3. userinfo1表中刪除,userinfo2表插入被刪除數據,兩個操作動作對應2條不同SQL,需要在同一個事物中操作
  4. 操作比較復雜

當然,方案被面試官否決了。面試官說:“你面試的可是科學家崗位呀,再想想。”

方案2:

對userinfo1表的name、status兩個字段設置聯合的唯一索引,在刪除數據時對status、name字段同時進行更新,status字段更新為非0(比如1)、name字段加上一個當前毫秒時間戳作為后綴(方案參考雪花算法實現的 分布式系統唯一ID,只要保證要求的字段唯一存在即可)。

優點:

  1. 沒有使用新的數據表、新的字段
  2. 軟刪除只需要更新兩個字段即可滿足題目要求

缺點:

  1. 更新數據時對原name字段添加后綴,數據造成了污染(改變了原數據)

面試官聽了聽,說道:“跟理想的答案很接近了,雖然可以解決問題,但是添加后綴后原數據被污染了。作為想成為'科學家'的男人,還有新的方案嗎?”

我想了想說:“暫時沒想到新的方案,可以提示一下嗎?”

面試官說:“name、status創建聯合的唯一索引沒問題,關鍵在于status怎么處理?再想想。”

3分鐘后,我說:“我盡力了,還是你來當科學家吧。”

2. 理想方案

面試官怕打消我的積極性,說道:“年輕人,不要這么浮躁,我給你指點一下。”

方案3

對userinfo1表的name、status兩個字段設置聯合的唯一索引,在更新數據時把被軟刪除的數據行對應的id值,賦值給status字段(status等于0表示未刪除,非0表示已刪除)。

最終的表結構為:

  1. CREATETABLE `userinfo1` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(50) DEFAULT ""
  4.   `status` bigint(20) DEFAULT 0 COMMENT "刪除狀態(默認0)表示未刪除 非0表示刪除"
  5.   PRIMARY KEY (`id`), 
  6.   UNIQUE KEY `name_status` (`name`, `status`)   
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

 聽完之后,我是猛地一拍腦門,說道:“哎呀,距離成為科學家僅有一步之遙,可惜了。”

總結

脫離了實際場景的問題大部分都是耍流氓,只有結合具體場景才能有針對性的對問題進行分析,從而得到一個可行的最優案。

解決本文開頭的問題可能有很多方案,但是最優的也就兩點:

① 對需要保持唯一的數據創建聯合唯一索引

② 軟刪除時status字段更新為該行數據的唯一值(也就是主鍵id)

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-05-24 09:29:28

2011-10-20 10:07:03

LightSwitch

2022-01-27 11:02:04

索引數據存儲

2021-07-02 06:54:43

分布式環境ID

2017-06-27 09:40:28

MYSQL數據備份

2024-03-11 05:00:00

Python集合開發

2009-03-30 11:27:59

中文域名

2024-11-28 09:47:53

C#互斥鎖Mutex

2011-02-24 13:55:12

SQL Server可空字段非空值

2010-10-19 16:34:10

SqlServer唯一

2021-06-15 06:50:08

索引字段數據

2010-11-12 14:45:19

Sql Server唯

2022-02-17 21:04:27

數據庫MysqlRedis

2024-08-29 09:27:44

LuceneES字段

2023-09-21 09:25:53

Python方法

2024-09-05 16:55:41

2018-07-19 06:17:09

數據完整性數據安全網絡安全

2016-11-28 19:48:07

2023-01-03 07:44:53

MySQL查詢重復
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www,黄色,com| 日韩一区二区在线视频 | 欧美激情亚洲 | 成人在线精品 | 日韩在线欧美 | 国产成人高清在线观看 | 伊人网在线综合 | 青青草一区二区三区 | 情侣黄网站免费看 | 中文字幕观看 | 伊人激情综合网 | 久久久久亚洲国产| 欧美日韩在线精品 | 欧美成视频 | 国产真实乱对白精彩久久小说 | 亚洲国产精品自拍 | 国产一区二区精品在线观看 | 日韩美女爱爱 | 亚洲免费视频网站 | 97avcc| 国产伦精品一区二区三毛 | 在线视频h| 欧美一级电影免费观看 | 欧美二区三区 | 精品综合在线 | 久久精品小视频 | 成人av一区| 国产精品123区 | 99视频在线 | 人人叉 | 成人在线免费视频 | 中文字幕在线一 | 日韩激情一区 | 日韩视频三区 | 日韩一区二区在线视频 | 国产精品亚洲成在人线 | 亚洲视频免费在线观看 | 亚洲午夜av久久乱码 | 国产欧美日韩二区 | 久久这里只有精品首页 | 超碰天天 |