2010-05-30 142 views
2

有時,您希望將數據庫表記錄標記爲已刪除,而不是永久刪除它,對嗎?在數據庫表中標記已刪除的記錄

你是怎麼做的?

到目前爲止,我一直在使用布爾「已刪除」字段,但我不確定它是否是一個很好的評價。

回答

6

就是這樣 - 一個布爾型字段來表示記錄被刪除。我用過的那幾次,我叫那個字段IsDeleted

這通常被稱爲邏輯刪除

您需要尊重報告中的該字段 - 這意味着排除所有IsDeleted = true的記錄。如果你有很多表和關係,這些查詢可能會變得有點複雜。

另外,如果您在表上有獨特的約束條件,則可能會遇到一些問題。例如,如果在用戶表中用戶有IsDeleted = true,並且電子郵件列是唯一的,我將無法使用相同的電子郵件地址添加新用戶。

有些ORM會考慮這些字段 - 例如,如果存在名爲'Deleted'或'IsDeleted'的列,SubSonic 2.2將不會刪除記錄,而是將該字段設置爲true。

一些相關的資源:

作爲替代這個你可以添加審計表。

1

我認爲這是一個好的解決方案。另一種方法是將數據移動到另一個表,某種歷史表,因此在包含活動數據的表中搜索數據會更快。但這取決於你的情況。

2

我通常使用IsDeleted。

如果存在多個狀態(例如normal,archive,deleted),我可能會使用Enum(或Int,如果不可用)來表示狀態。通常我會在這種情況下命名字段狀態或狀態。

1

在銀行業,存儲所有的修改(不僅僅是刪除)被認爲是一種很好的做法。通常它是在「日誌表」中完成的,DDL與原始日誌表幾乎相同,外加幾個標誌來指示操作類型,日期&時間,用戶等。但是(非常重要的)日誌表是沒有唯一鍵的定義!

1

我會使用datetime,null爲活,timstamp爲「刪除」。

這是完美的

if(timestamp) {} 

,因爲它默認爲空。