2012-07-02 76 views
5

DB設計中維護修訂歷史的一般策略是什麼?如果它只是我正在處理的一張桌子,我認爲它不會那麼難。只需將每個更新保存爲表格中的新記錄即可。最後的記錄將始終是最新的修訂版本。數據庫設計:如何跟蹤歷史?

但是,當數據存儲在多個表中時,設計該數據以便跟蹤修訂的好方法是什麼?

回答

2

我更喜歡爲每個版本化表格增加歷史表格。與主表time_fromtime_to附加字段相同的結構。 透明充滿觸發器。最近修訂的time_to設置在遙遠的未來。

指定時刻狀態可以查詢檢索這樣的:

SELECT * FROM user_history 
WHERE time_from >= '2012-02-01' AND time_to <= '2012-02-01' 

至於我,主表中存儲的歷史是不是一般的好主意,因爲它檢索或加入現有數據時需要複雜的條件。

+0

所以主表具有最新的數據。那麼「歷史」表格有每個版本的副本?這是否打破標準化? – StackOverflowNewbie

+0

是的,非規範化發生,它是簡單的價格(歷史狀態是從主表上簡單的'INSERT','DELETE','UPDATE'自動生成的)和最新版本的性能(例如主表具有基於數據的索引歷史有日期索引)。 如果最新修訂版本不是主要修訂版本,則此方法可能會因標準化失效而受損。 – vearutop

0

打開MySQL的binary logging並使用它。

+0

我認爲這個問題是關於查詢歷史。 – MaxSem

0

我正在使用的方法,其中我正在處理的每個對象至少有一個所謂的實例表,其中我保留隨時間而變化的數據。通常這樣的表格遵循以下概念:

  • 它們有_HISTORY後綴名;
  • 他們有2個額外的字段,start_dtend_dt,指示對象實例的生命週期;
  • start_dtNOT NULL,end_dt可以是NULL,它表示該實例是當前的並且不受其時間的限制;
  • ,可以插入未來變化日,說你想從1/Jan-2013激活一個新的公司名稱,然後你需要設置當前實例的end_dt31/Dec-2012 23:59:59並插入的1/Jan-2013 00:00:00start_dt的新紀錄;
  • 有時我也加revision字段,如果有必要跟蹤修訂版。

爲了有這樣的設計有一個適當的RI約束,我總是有2個版本化obejcts表。比方說,對於Customer obejct我有以下一組表:

customer (customer_id INTEGER, PRIMARY KEY (customer_id)); 
customer_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP, 
        name VARCHAR(50), sex CHAR(1), ..., 
        PRIMARY KEY (customer_id, start_dt)); 
customer_bank_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP, 
         bank_id INTEGER, iban VARCHAR(34)); 

在所有其他地方我用customer(customer_id)建立外鍵。查詢實際的客戶信息很簡單:

SELECT c.customer_id, ch.name, ch.sex 
    FROM customer c 
    JOIN customer_history ch ON c.customer_id = ch.customer_id 
     AND now() BETWEEN ch.start_dt AND coalesce(end_dt, now()); 

爲什麼我更喜歡這樣的設計:

  1. 我已經在設計數據庫級別版本的對象實例;
  2. 我必須維護較少的表;
  3. 如果有人丟棄/禁用任何觸發器,則無法獲取歷史記錄;
  4. 我可以很容易地計劃和維護未來的變化。

希望這會對你有幫助。

0

最難的部分不是「基本」表的版本控制 - 您只需單獨對它們進行版本化,就像單獨使用一張表一樣。

困難的部分是跟蹤他們之間的連接

你打算怎麼做取決於具體項目的要求。下面是sales orders could be "historized"的一個例子,但也有許多其他變體可能。

0

Datadiff。 API支持的DB版本跟蹤。

披露:

我建Datadiff。我需要一個解決方案,提供MongoDB中數據模型的可視歷史記錄,以幫助支持SASS產品。它也將與SQL數據庫一起工作。

您可以使用key:val表示法進行基本查詢。即id:123