2009-08-13 126 views
4

我有一個數據庫與書籍。版本跟蹤與mysql

一本書有一個作者,出版商。 一些價格,ID和說明。

我想跟蹤對某個產品所做的更改。一種方法是用時間和ID保存產品作爲主鍵。

還有其他方法嗎?

是否有數據庫系統(我只使用過mysql)誰可以自動跟蹤更改?

問候......

回答

1

您可以使用觸發器(如MySQL有他們,我認爲它)趕上「更新」事件,並輸入一堆相關的信息變成了「登錄」表。

數據庫確實有事務日誌,但可能對您沒有用處,因爲我不認爲它可以進行簡單的查詢。

1

一個簡單的解決方案是在產品表中包含修改日期作爲字段。

更新存儲過程以始終使用最新生效日期的產品ID提取產品。

這將允許您有一個單獨的存儲過程,列出產品的所有版本。

+0

它的一個變體是兩列:'active-from'和'active-to',這將允許你排隊未來的產品/ offer/etc。 – 2009-08-13 12:45:51

4

一種方法是有2個單獨的表格,例如booksbook_versions具有相同的一組字段(作者,出版者,描述等)。

只要您的應用程序插入或更新到books中,您就在book_versions中插入相應的記錄。這意味着books表包含記錄的最新版本,並且book_versions包含最新和所有歷史版本。如果您只對最新版本感興趣,大多數情況下您只能通過ID從書籍中選擇,並且只在需要時才檢索歷史記錄。這是用於Ruby on Rails的acts_as_versioned插件所使用的方法。

1

我建議將更新日誌表添加到您的系統中。這個表只能寫入,並且它有列日期,主題,謂詞,對象,其中主題是作者/主體進行更改,謂詞是更改的本質(創建,更新,刪除),對象是事情正在改變。可能的是,您仍然可以將對象仍然分爲ID,屬性和值,其中ID是書籍ID,屬性是要更改的屬性的字符串名稱,值爲舊值(因爲新值位於適當的表格中)。

1

上述任何建議的解決方案都可以使用;這實際上取決於您的工作負載和數據集大小。

如果您有很多記錄,並且您只想要歷史歸檔以供參考,那麼您也可以考慮將「舊/早」版本從數據庫中移出,並以某種鏈接列表格式(例如,插入一個包含以前版本地址的版本,從而形成一個鏈表),並在DB中保留一個指向最新版本的指針。

有這種方法的優缺點,但一個優點是你可以保持你的數據庫小,只是從磁盤讀取舊版本。您的舊版本應該是不可變的,因此您不需要依賴來自數據庫的事務/併發支持。如果您的「當前/最新」數據集(比如說100G)和過去的版本是900G,那麼您可以將數據庫放在100G的RAID上,並將以前的版本放在更便宜的存儲上,然後複製一些次(它們是原子的,所以在複製時沒有併發問題)。