2012-05-22 84 views
0

我正在使用Asp.net Mvc中的卡片管理應用程序。我們使用Fluent Nhibernate作爲ORM和Sql Server 2008.保留已刪除的歷史數據或重複使用

我們現在考慮在用戶選擇刪除數據時不真正刪除數據。

我的問題是,什麼是最好的方式來做到這一點,以及這(性能,Db大小)的後果是什麼?

我們數據庫的一些重要表格可能有數千條記錄。

在此先感謝。

回答

2

我從來沒有想過這是一個好主意,特別是涉及外鍵時。這可能使事情變得比他們需要的更復雜。我從來不喜歡被刪除但未被刪除的記錄。這只是混亂,國際海事組織。

如果你想保留已刪除的行,我建議將它們放在某種檔案或歷史表中。這樣,如果需要,您可以將它們放在那裏以供將來分析,並且如果有必要,可以稍後將它們帶回。

數據庫的大小真的不是問題。對於SQL Server來說,「成千上萬」的記錄是沒有用的。在我們的製造業數據庫中,我們的一些表中有數億行。性能非常好。

使用SQL Server 2008,您可以使用Change Data Capture,它可以很好地爲您處理已刪除的行。

+0

嗨,Randy Minder,您的第一個建議(將數據放入存檔或歷史記錄表中)與使用Sql Server的「更改數據捕獲」相同嗎? – Djaved

+0

@Djaved - 基本上是的。使用CDC是將刪除的行存入存檔(歷史記錄)表的一種方法。 –

+1

你也可以看看Envers,一個NHibernate的擴展,跟蹤你的實體的修訂信息(也刪除記錄)。只需將您的實體標記爲使用屬性進行審計,或者使用流暢界面在單獨的歷史記錄表中激活自動審計。它適用於每個數據庫,就像NHibernate一樣。你可以在這裏找到它(https://bitbucket.org/RogerKratz/nhibernate.envers)。 – rumpelstiefel

0

我會使刪除觸發器(它也有一些性能損失),並在歸檔表中插入刪除的行。然後可以對歸檔表進行分區/數據壓縮(如果使用SQL Server的Enterprice版本)。

存檔表看起來就像基本表,除了有一些額外的ID列,我還會把刪除日期和用戶名刪除數據。

+0

嗨,Janis,你的意思是'分區/數據壓縮'?你能給我一個這樣的例子嗎?謝謝 – Djaved

1

我現在在哪裏工作,在以前的職位上,這個想法一直圍繞在記錄上的DeletedDateDeletedBy。這樣,無論何時您檢索信息,您都可以過濾掉,並且只能獲取DeletedDate == null的記錄。

通過這種方式,您還可以跟蹤誰刪除了數據和何時,同時還可以通過將DeletedDate重置爲空來「還原」刪除功能。

就性能和數據庫大小而言,我不會擔心它太多,因爲SQL Server不僅能夠應對數百萬行數據。

如果性能是絕對關鍵的,並且您注意到應用程序變慢,那麼您可以很容易地將刪除的數據歸檔到單獨備份的數據庫中。

如果您不打算長時間保留數據,則可以定期刪除數據庫中一年前有DeletedDate的所有數據。