Sql-Server

庫存數據庫的單獨存檔表或軟刪除

  • May 3, 2021

我正在建立一個跟踪電腦設備和其他硬體設備的庫存數據庫。在任何設備生命中的某個時刻,它都會退役並被存檔。歸檔後,需要對其進行跟踪,因為它已停止使用並妥善處理。我最初使用活動數據庫的精確副本設計存檔機制,該副本將使用從活動數據庫中刪除時使用觸發器接收其數據。存檔數據庫包括所有相關表的副本,因為由於某些外部相關記錄不再相關,使用者不應訪問它們以用於新設備,但對於參照完整性和使用存檔表進行查詢是必需的。請記住,這裡歸檔的概念不僅僅是保存歷史記錄或日誌。檔案是業務流程的一部分,

下面的 ERD 使用該Inventory.DeviceType表作為範例,其中所有條目和更新都複製到該Archive.DeviceType表中。當使用者不再能夠輸入某種設備類型的庫存記錄時,它會從Inventory.DeviceType表中刪除,但仍保留在存檔表中。此模式用於所有表,以確保存檔引用有效數據,因此是所有表的副本。

活動表範例(其他相關表省略) 主動ERD

存檔表範例(其他相關表省略) 存檔 ERD

問題

我試圖弄清楚如果我不知道設備是活動的還是存檔的,我將如何查詢數據庫?例如,如果使用者有序列號並想查找有關設備的資訊,但他們不知道它是否已存檔。

選項 1:基於 union all 創建一個視圖?

選項 2:如果第一個查詢沒有返回任何內容,則查詢活動數據庫然後查詢存檔?

傳奇還在繼續……

一位同事建議我刪除存檔數據庫並使用軟刪除方案。我使用這個想法建立了一個模型,然後開始遇到許多其他問題。

以下是使用軟刪除方案的相同表。

軟刪除範例

Soft Delete ERD

使用此設置,通過將IsArchivedfield 設置為 true 並輸入ArchivedDate. 我可以輕鬆查詢任何設備,無論它是活動的還是存檔的。(請忽略該IsActive欄位,因為它用於不相關的概念)。

注意電話子類型表,我必須在其中傳播 DeviceID 和 IsArchived 標誌的索引,因為電話號碼對於活動設備必須是唯一的。我也必須對其他子類型表執行此操作。我不知道這是一個好還是壞的設計。

這部分真的讓我很困惑……

在可以將外鍵值標記為已刪除的情況下,處理軟刪除的最佳做法是什麼。我唯一能想到的就是創建一個常式,搜尋與已刪除數據相關的所有記錄,並為使用者創建報告以解決差異。例如,如果位置表與設備表相關,並且某些位置被軟刪除,則設備指的是不再存在且必須移動的位置。

順便說一句,我使用的是 MS SQL Server 2008 R2,我計劃在我的應用程序中使用 Entity Framework 4。我重視數據庫的可維護性而不是性能。

感謝您的閱讀。

我想說,如果您的使用者需要查詢存檔數據,那麼使用bit標誌或soft delete更容易。如果使用者不再需要數據,那麼我會使用存檔表。

根據您上面的描述,我建議您使用該Soft Delete版本。我可以根據我們其中一個系統的經驗告訴您,我們使用存檔模式將舊數據移動到其中,但它只會導致問題,因為使用者需要訪問數據。所以它導致UNION ALL在我們必須執行的每個查詢上使用。

由於這些問題,我們停止了該路線並移至軟刪除,這更容易。

我們bit向所有需要的表添加了一個標誌,然後WHERE在查詢數據時將其包含在子句中。

一個建議是確保該欄位在您INSERT數據時具有預設值。如果您正在使用,IsArchived那麼該列的預設值將是 false,因為您不希望它立即存檔。

引用自:https://dba.stackexchange.com/questions/25548