2012-02-28 37 views
2

這裏是例子,比如我有一個表叫Profile,並且有不同的欄目,如:如何在關係數據庫中存儲不同版本的數據?

id, firstName, secondName, address 

通常,我創建一個配置文件,全面的信息,並且數據庫將成爲這樣的事情:

1| Ted | WONG | Hong Kong | 

在那之後,我可以更新數據,這樣

1| Ted | WONG | US | 

數據Hong Kong將由UPDATE SQL命令更改,並且我失去了以前的數據跟蹤。那麼,有沒有辦法讓數據庫跟蹤以前的數據並保持當前的信息?謝謝。那麼當你更新數據你永遠ALTER它,你只需要添加一個新的修訂

id, firstname,secondname, address, group 

+0

我希望它是通過'UPDATE'而不是'ALTER'改變的 - 你使用的是哪個數據庫? – 2012-02-28 07:23:25

+0

你是對的,我只是輸入錯誤。 MySQL的。 – DNB5brims 2012-02-28 07:46:48

+0

我已經添加了該標記並刪除了我的答案,因爲我不認爲這會對MySQL起作用。 – 2012-02-28 07:48:04

回答

1

這可以通過存儲所有歷史數據,並具有group柱來實現。

所以,你的表將如下所示:

1, Ted, Wong, Hong Kong, 1 
2, Ted, Wong, US, 1 

所以檢索需要選擇適當的修訂當前(或上次)的修訂:

SELECT TOP 1 * FROM <table> WHERE Group = 1 ORDER BY id DESC 
+0

但我使用id作爲與其他表的關係的關鍵字,例如,我有一個帶有profile_id的用戶表,如果我這樣做,當我有新版本時,我的個人檔案表id被更改,用戶表的profile_id指向不更新數據。 – DNB5brims 2012-02-28 06:52:11

+0

是的,所以我需要更好地理順你的數據庫結構。選擇不會更改的列,並將其粘在第一個表中。然後,您可以將配置文件數據放在另一個表格中,並使用類似於我的或KAJ的配置文件,並使用最新版本或版本號 – Simon 2012-02-28 10:12:02

3

添加一個版本號每次更新時增加的列,但保留相同的ID。然後檢索最新的行爲給定ID,當你需要做一個

where versionNo = (select max(versionNo) from table where id = <outerTableAliasOrVariable>.id) 
+0

對數據執行連接。每次查詢時執行max(verionNo)可能會使性能下降獲取大量數據。我做了類似的事情,除了我更喜歡將版本0作爲最新版本並在任何更新之前將所有數據歸檔到版本X之外。它使查詢更簡單。 – 2012-12-19 19:38:06

1

添加一個「版本」列要跟蹤版本每個表的第一列,他們的子表。該列應作爲第一列添加到您的羣集主鍵中。當前版本應該始終具有Version = 0,以便更輕鬆地編寫查詢,並且不需要在每個查詢上搜索MAX(版本)。確保所有的子表都包含Version列,並在外鍵中引用它。在更新之前,將所有相關表中的Version = 0數據複製到版本= 1。下一次更新將複製到版本= 2等等。最終,您將擁有Version = 1中最早的數據,Version = 0中的最新數據以及Version = X中的最新數據。通過這種方式,您可以製作複雜的數據庫模式,控制數據版本,並通過將數據從版本= X複製到版本= 0,將數據完全回滾到歷史版本。

在你的情況,你的新表的結構將是...

版本,編號,名字,secondName,地址(PK-VERSIONID,ID)

如果你有一個子表,就像事務表,它看起來像這樣...

版本,ID,TRANSACTIONID,金額(PK-VERSIONID,ID,TRANSACTIONID)

我有ü sed這種維護數據版本的方法,而不必額外創建表來支持它。

相關問題