<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          什么是數(shù)據(jù)庫的物理和邏輯刪除,該用哪種?90%的人只能答一半

          共 2218字,需瀏覽 5分鐘

           ·

          2024-08-09 13:34

          此答案節(jié)選自我們最近弄的面試鴨小程序,更多大廠常問面試題,可以點(diǎn)擊下面的小程序進(jìn)行閱讀哈!

          回答重點(diǎn)

          邏輯刪除是一種將數(shù)據(jù)標(biāo)記為已刪除但實(shí)際不會從數(shù)據(jù)庫中移除的刪除方式。一般是在表中添加一個表示刪除狀態(tài)的字段,如 is_deleted ,默認(rèn)是 0 表示未刪除,1 表示已刪除。

          物理刪除則是直接從數(shù)據(jù)庫中刪除記錄。

          一般業(yè)務(wù)上都是使用邏輯刪除,便于后續(xù)的數(shù)據(jù)分析、追溯等。

          擴(kuò)展知識

          物理刪除的優(yōu)缺點(diǎn)

          優(yōu)點(diǎn):

          • 節(jié)省存儲空間:物理刪除釋放了數(shù)據(jù)占用的存儲空間。
          • 查詢性能提高:由于數(shù)據(jù)被徹底刪除,查詢時不需要過濾已刪除的數(shù)據(jù)。

          缺點(diǎn):

          • 不可恢復(fù):一旦數(shù)據(jù)被刪除,無法恢復(fù),除非有備份。
          • 缺乏審計(jì)和追溯:無法追溯數(shù)據(jù)的歷史狀態(tài)和變更記錄。

          邏輯刪除的優(yōu)缺點(diǎn)

          優(yōu)點(diǎn):

          • 數(shù)據(jù)可恢復(fù):可以通過更改標(biāo)記字段的值來恢復(fù)數(shù)據(jù)。
          • 支持審計(jì)和追溯:保留了數(shù)據(jù)的歷史狀態(tài),有助于數(shù)據(jù)審計(jì)和分析。

          缺點(diǎn):

          • 占用存儲空間:已刪除的數(shù)據(jù)仍然存在,占用存儲空間。
          • 查詢性能影響:查詢時需要額外的條件來過濾已刪除的數(shù)據(jù),可能影響性能。
          • 復(fù)雜性增加:需要在查詢、更新等操作中考慮邏輯刪除字段的處理。

          邏輯刪除與唯一性問題

          很多時候表需要設(shè)置唯一索引來保證數(shù)據(jù)的唯一性。

          例如用戶參加店鋪活動,我們有個活動記錄表以 userId+shopId 作為唯一索引,防止用戶重復(fù)參加一個店鋪活動也用于后續(xù)活動記錄。

          后續(xù)如果用戶反悔了,他說不想?yún)⒓恿耍藭r一個方式就是直接物理刪除這條記錄,但是為了審計(jì)和后續(xù)的追溯,我們用的都是邏輯刪除,因此使用 is_deleted 字段,標(biāo)記為 1 表明已刪除。

          但是用戶又反悔了,他又報(bào)名參加了,這時候由于我們將 userId+shopId 作為唯一索引,且這條字段僅僅是邏輯刪除,表中還存在這條記錄,所以此時就產(chǎn)生了唯一索引沖突,業(yè)務(wù)無法正常執(zhí)行下去。

          這就是 邏輯刪除與唯一性問題

          怎么處理?把 userId+shopId+is_deleted 一起作為唯一索引?

          也不行,is_deleted 只有 0 和 1,如果用戶多次反復(fù)橫跳,這個設(shè)計(jì)無法滿足。

          常見有三種簡單的解決方式:

          1)is_deleted 改為 deleted_at ,deleted_at 存儲的是時間戳,默認(rèn)為空。

          userId+shopId+deleted_at 作為唯一索引,通過 deleted_at 是否為空來判斷是否被邏輯刪除,然后每次刪除把當(dāng)前時間設(shè)置到 deleted_at 字段上,這樣唯一索引就能繼續(xù)生效了。

          由于時間戳的隨機(jī)性,不會產(chǎn)生唯一索引沖突

          2)is_deleted 改為 bigint,存儲的是主鍵,默認(rèn)為 0 。

          每次刪除,把當(dāng)前記錄的 id 設(shè)置到 is_deleted 字段,例如 id 是 2222 ,那么 is_deleted 就變?yōu)?2222。

          這時候?qū)?userId+shopId+is_deleted 作為唯一索引,就可以解決用戶反復(fù)退出再加入的問題。

          判斷已經(jīng)被刪除的邏輯從 is_deleted = 1 變成 is_deleted > 0

          3)復(fù)用一條記錄+日志表(流水表)

          所謂的日志或者流水指的是機(jī)械地記錄用戶的操作記錄,不會做修改和刪除,只有新增。

          用戶某時某刻參加了活動,則記錄。

          用戶退出了活動,則記錄。

          審計(jì)和追溯可以使用流水表。這時候活動表僅需設(shè)置 userId+shopId 為唯一索引即可,用戶參加活動 is_deleted 為 0 ,退出活動改為 1,再次參加繼續(xù)改為 0 ,僅需在一條記錄上修改記錄。

          最后

          最后再推薦下鴨鴨目前努力在做 面試刷題神器,已經(jīng) 有近 5000 多道面試題啦,歡迎大家來閱讀!如果大家有不會的面試題,也可以在小程序內(nèi)反饋!鴨鴨會第一時間為大家解答!

          除了小程序版本,我們 web 端也上線啦:www.mianshiya.com


          歡迎關(guān)注面試鴨
          ,每日獲取經(jīng)典面試題和優(yōu)質(zhì)題解,我們下期見~

          瀏覽 463
          1點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          1點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷色六月| 亚洲AV无码国产精品 | 色婷婷丁香激情五月电影 | 美女18岁毛片 | 欧美成人综合 |