您將如何維護SQL表中的歷史記錄?

我正在設計一個數據庫來存儲產品信息,而且我想存儲幾個月的歷史(價格)數據以供未來參考。 可是,我想在設定的時間以後,以最小的努力開始覆蓋初始條目,以查找初始條目。 有誰對如何解決這個問題有個好主意? 我最初的設計是要有一個名爲歷史數據的表,天天,它都會提取活動數據並將其存儲到帶有時間戳的歷史數據庫中。 有誰有更好的主意嗎? 仍是能夠看到個人問題在哪裏? html


#1樓

這個話題比最初看起來要普遍得多。 馬丁·福勒(Martin Fowler)對「隨時間變化的事物」有一個很好的敘述數據庫


#2樓

首先,我想評論一下您提出的解決方案。 固然,最弱的部分是,您的間隔之間實際上可能存在多個變化。 這意味着該記錄在一天中被更改了三次,可是您只存檔了最後的更改。 服務器

可能有更好的解決方案,但它必須是事件驅動的。 若是您擁有支持事件或觸發器的數據庫服務器(例如MS SQL),則應編寫觸發器代碼以在歷史表中建立條目。 若是您的服務器不支持觸發器,則能夠將歸檔代碼添加到您的應用程序中(在「保存」操做期間)。 spa


#3樓

您能夠在價格表上放置觸發器。 這樣,您能夠在每次更新或刪除事件時將舊價格歸檔到另外一個表中。 設計


#4樓

IMO若是您所需的歷史數據是一天結束數據的快照,那麼您的方法彷佛是正確的-過去,我對隔夜做業(SP)使用了相似的方法,該任務能夠獲取當天的新數據,對其進行時間戳記,而後使用「刪除全部時間戳<今天-x的數據」,其中x是我要保留的數據時間段。 htm

若是您須要跟蹤全部歷史記錄更改,則須要查看觸發器。 事件


#5樓

我想在設定的時間後,以最小的努力開始覆蓋初始條目,以查找初始條目 ci

正如其餘人所建議的,咱們使用觸發器將數據存儲在存檔表中。 咱們的存檔表具備AuditDate的附加列,並存儲「已刪除」數據-即數據的先前版本。 當前數據僅存儲在實際表中。 get

咱們根據「刪除三個月以上的全部存檔數據,其中存在至少一個小於三個月的存檔記錄;刪除六個月以上的全部存檔數據」的行,對存檔表進行修剪。 產品

所以,若是最近3個月內沒有價格變化,您仍會擁有3到6個月前的價格變化記錄。

(詢問您是否須要使用self-referencing-join的示例來執行刪除操做,或使用觸發器將更改存儲在Archive表中)