2011-06-21 39 views
6

我正在考慮爲從未真正刪除任何內容的數據庫設計關係數據庫架構(設置已刪除的標誌或其他內容)。A永不刪除關係數據庫架構設計

1)通常使用哪些元數據列來容納這樣的架構?顯然可以設置IsDeleted的布爾標誌。或者,也許只是在刪除列中的時間戳效果更好,或者可能兩者都更好。我不確定哪種方法在長期內會給我帶來更多問題。

2)在這樣的體系結構中通常如何處理更新?如果您將舊值標記爲已刪除並插入新值,您將遇到PK唯一約束問題(例如,如果您有PK列ID,則新行必須具有與您剛標記爲無效的ID相同的ID,或否則在其他表中的所有外鍵將被渲染爲無用的)。

+1

如果你有一個表,一個與外國約束表B和表B中被刪除的行,你想要什麼發生?我們是否假設A中的引用行已被刪除?應該在B的新行中指向一個點嗎?如果行A仍然存在,並繼續指向刪除的行B? –

回答

0

這裏有您還需要考慮

  1. 確實發生多久刪除一些額外的問題。你的性能預算是什麼樣的?這可能會影響您的選擇。回答你的設計將取決於如果刪除單行用戶(可以像說在Q &站點VS從進料刪除以小時爲單位記錄的答案)

  2. 你是如何將不同公開系統中已刪除的記錄。僅僅是通過管理目的還是任何用戶都可以看到刪除的記錄。這有所不同,因爲您可能需要根據用戶想出一個過濾機制。

  3. 外鍵約束如何工作。一張表可以引用另一張有刪除記錄的表嗎?

  4. 當您添加或改變現有的表格時,刪除的記錄會發生什麼?

通常,關心審計使用表的系統很多,如Steve Prentice提到的。它通常包含原始表格中的所有字段,並關閉所有約束。它通常會有一個操作字段來跟蹤更新與刪除操作,並將更改的日期/時間戳與用戶一起包含在內。

舉一個例子看PostHistory表在http://data.stackexchange.com/stackoverflow/query/new

0

我認爲你在這裏尋找的東西通常被稱爲「知識約會」。

在這種情況下,您的主鍵將是您的常規鍵和知識開始日期。

您的結束日期可能爲當前記錄或「結束時間」哨兵爲空。

在更新時,通常將當前記錄的結束日期設置爲「now」,並將新記錄的起始位置與新值相同「now」插入。

在「刪除」上,您只需將結束日期設置爲「now」即可。

+0

這不是一個糟糕的解決方案,但它對性能有什麼影響?特別是在您希望獲得當前記錄的地方,這會爲您的選擇增加很多開銷。 –

0
  1. 我已經做到了。

2.a)版本號在某種程度上解決了獨特的約束問題,雖然這真的只是放鬆了獨特性不是它。

2.b)您還可以將舊版本存檔到另一個表格中。

3

如果您的目標是審計,我會爲您擁有的每個表創建一個影子表。添加一些在update和delete上觸發的觸發器,並將該行的副本插入到影子表中。

+1

如果你不關心表現,那真是太好了。 – btilly

+2

@btilly:不完全正確;如果您關心性能,並且您恰好希望性能變慢,那麼這也是一個很好的解決方案。 :) –

+3

// @表現糟糕麼?選擇,插入,更新,刪除? –