如何使用ORM鏈?zhǔn)讲僮?如何優(yōu)雅的實(shí)現(xiàn)軟刪除?
本期重點(diǎn)
會帶大家完成【電商實(shí)戰(zhàn)項(xiàng)目】的輪播圖刪除功能,用到的知識點(diǎn)包括:
- ORM鏈?zhǔn)讲僮?/li>
- 如何優(yōu)雅的進(jìn)行時間維護(hù)
- 軟刪除和物理刪除的區(qū)別
- 如何優(yōu)雅的實(shí)現(xiàn)軟刪除
- 結(jié)合商業(yè)項(xiàng)目需求,有哪些容易踩的坑?
ORM鏈?zhǔn)讲僮?時間維護(hù)
需要注意,該特性僅對鏈?zhǔn)讲僮饔行А?/p>
gdb模塊支持對數(shù)據(jù)記錄的寫入、更新、刪除時間自動填充,提高開發(fā)維護(hù)效率。為了便于時間字段名稱、類型的統(tǒng)一維護(hù),如果使用該特性,我們約定:
- 字段應(yīng)當(dāng)設(shè)置允許值為null。
- 字段的類型必須為時間類型,如:date?, datetime?, timestamp?。不支持?jǐn)?shù)字類型字段,如int。
- 字段的名稱不支持自定義設(shè)置,并且固定名稱約定為:
created_at用于保存記錄的創(chuàng)建時間,僅會寫入一次。
updated_at用于保存記錄的修改時間,每次記錄變更時更新。
deleted_at用于保存記錄的軟刪除特性,只有當(dāng)記錄刪除時會寫入一次。
字段名稱其實(shí)不區(qū)分大小寫,也會忽略特殊字符,例如CreatedAt?, UpdatedAt?, DeletedAt?也是支持的。此外,時間字段名稱可以通過配置文件進(jìn)行自定義修改,并可使用TimeMaintainDisabled配置完整關(guān)閉該特性,具體請參考 ORM使用配置 章節(jié)。
對時間類型的固定其實(shí)是為了形成一種規(guī)范。
特性的啟用
當(dāng)數(shù)據(jù)表包含created_at、updated_at、deleted_at任意一個或多個字段時,該特性自動啟用。
以下的示例中,我們默認(rèn)示例中的數(shù)據(jù)表均包含了這3個字段。
?created_at??寫入時間
在執(zhí)行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore方法時自動寫入該時間,隨后保持不變。
需要注意的是Replace方法也會更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
?updated_at??更新時間
在執(zhí)行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時自動寫入該時間,在執(zhí)行Save/Update?時更新該時間(注意當(dāng)寫入數(shù)據(jù)存在時會更新updated_at?時間,不會更新created_at時間)。
需要注意的是Replace方法也會更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
?deleted_at??數(shù)據(jù)軟刪除
軟刪除會稍微比較復(fù)雜一些,當(dāng)軟刪除存在時,所有的查詢語句都將會自動加上deleted_at的條件。
查詢的時候會發(fā)生一些變化,例如:
可以看到當(dāng)數(shù)據(jù)表中存在deleted_at?字段時,所有涉及到該表的查詢操作都將自動加上deleted_at IS NULL的條件
聯(lián)表查詢的場景
如果關(guān)聯(lián)查詢的幾個表都啟用了軟刪除特性時,會發(fā)生以下這種情況,即條件語句中會增加所有相關(guān)表的軟刪除時間判斷。
Unscoped忽略時間特性
Unscoped?用于在鏈?zhǔn)讲僮髦泻雎宰詣訒r間更新特性,例如上面的示例,加上Unscoped方法后:
以上內(nèi)容來源自官方文檔:https://goframe.org/pages/viewpage.action?pageId=1114139
軟刪除和物理刪除的區(qū)別
- 軟刪除也叫標(biāo)記刪除,通過字段標(biāo)記DB中的紀(jì)錄是否被刪除:
比如通過is_delete字段標(biāo)記,默認(rèn)為0,刪除時設(shè)置為1
或者和視頻內(nèi)容一樣,使用deleted_at字段標(biāo)記刪除的時間,默認(rèn)為null
- 物理刪除,就是直接將DB中的記錄刪掉
如何優(yōu)雅的實(shí)現(xiàn)軟刪除
如果你詳細(xì)看完了ORM鏈?zhǔn)讲僮?時間維護(hù)這部分內(nèi)容,想必心中一定有了答案。
結(jié)合商業(yè)項(xiàng)目需求,有哪些容易踩的坑?
一定要結(jié)合實(shí)際情況決定使用物理刪除還是軟刪除,下面的例子拋轉(zhuǎn)引玉:
1. 比如管理后臺刪除輪播圖這種操作建議使用軟刪除。因?yàn)榭赡艹霈F(xiàn)誤操作的情況,軟刪除可以及時找回;而且輪播圖的數(shù)據(jù)往往不多,冗余保存也是沒有問題的。
2. 再比如用戶移除收藏文章的記錄,建議物理刪除。原因是收藏文章,取消收藏這類操作比較隨意,沒有任何風(fēng)險(xiǎn)。再者這類數(shù)據(jù)量比較龐大,軟刪除沒有意義,反而會增加收藏操作的邏輯壓力和DB壓力。
本文轉(zhuǎn)載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關(guān)注。
轉(zhuǎn)載本文請聯(lián)系「 程序員升級打怪之旅」公眾號。