我有一個數據庫與書籍。版本跟蹤與mysql
一本書有一個作者,出版商。 一些價格,ID和說明。
我想跟蹤對某個產品所做的更改。一種方法是用時間和ID保存產品作爲主鍵。
還有其他方法嗎?
是否有數據庫系統(我只使用過mysql)誰可以自動跟蹤更改?
問候......
我有一個數據庫與書籍。版本跟蹤與mysql
一本書有一個作者,出版商。 一些價格,ID和說明。
我想跟蹤對某個產品所做的更改。一種方法是用時間和ID保存產品作爲主鍵。
還有其他方法嗎?
是否有數據庫系統(我只使用過mysql)誰可以自動跟蹤更改?
問候......
您可以使用觸發器(如MySQL有他們,我認爲它)趕上「更新」事件,並輸入一堆相關的信息變成了「登錄」表。
數據庫確實有事務日誌,但可能對您沒有用處,因爲我不認爲它可以進行簡單的查詢。
一個簡單的解決方案是在產品表中包含修改日期作爲字段。
更新存儲過程以始終使用最新生效日期的產品ID提取產品。
這將允許您有一個單獨的存儲過程,列出產品的所有版本。
一種方法是有2個單獨的表格,例如books
和book_versions
具有相同的一組字段(作者,出版者,描述等)。
只要您的應用程序插入或更新到books
中,您就在book_versions
中插入相應的記錄。這意味着books
表包含記錄的最新版本,並且book_versions
包含最新和所有歷史版本。如果您只對最新版本感興趣,大多數情況下您只能通過ID從書籍中選擇,並且只在需要時才檢索歷史記錄。這是用於Ruby on Rails的acts_as_versioned
插件所使用的方法。
我建議將更新日誌表添加到您的系統中。這個表只能寫入,並且它有列日期,主題,謂詞,對象,其中主題是作者/主體進行更改,謂詞是更改的本質(創建,更新,刪除),對象是事情正在改變。可能的是,您仍然可以將對象仍然分爲ID,屬性和值,其中ID是書籍ID,屬性是要更改的屬性的字符串名稱,值爲舊值(因爲新值位於適當的表格中)。
你所要求的大部分都覆蓋了"Change Data Capture" (CDC)的設計模式和"Slowly changing dimension" (SDC)的概念。
閱讀關於這些主題的維基百科文章,因爲它們提供了有關此主題的良好鳥瞰圖。
上述任何建議的解決方案都可以使用;這實際上取決於您的工作負載和數據集大小。
如果您有很多記錄,並且您只想要歷史歸檔以供參考,那麼您也可以考慮將「舊/早」版本從數據庫中移出,並以某種鏈接列表格式(例如,插入一個包含以前版本地址的版本,從而形成一個鏈表),並在DB中保留一個指向最新版本的指針。
有這種方法的優缺點,但一個優點是你可以保持你的數據庫小,只是從磁盤讀取舊版本。您的舊版本應該是不可變的,因此您不需要依賴來自數據庫的事務/併發支持。如果您的「當前/最新」數據集(比如說100G)和過去的版本是900G,那麼您可以將數據庫放在100G的RAID上,並將以前的版本放在更便宜的存儲上,然後複製一些次(它們是原子的,所以在複製時沒有併發問題)。
您可能會對temporal databases的概念感興趣,用於描述隨時間變化的事物。在時間數據庫上有a freely available book,這些數據庫描述了這個概念的每一個細節,但是對於更爲腳踏實地的東西,您可以閱讀我最喜愛的編程作者Martin Fowler的Patterns for things that change with time。
它的一個變體是兩列:'active-from'和'active-to',這將允許你排隊未來的產品/ offer/etc。 – 2009-08-13 12:45:51