2011-10-10 30 views
2

在一箇舊的web應用程序我有一個表具有以下結構:
tools(id, name, abbreviation, width, height, power, type)重新設計我的數據庫

的事情是,我需要歷史支持添加到該工具。工作場景是每個工具的細節都可以修改,我需要跟蹤這些變化。例如,如果我需要查看過去某個日期的某個工具的詳細信息,那麼我該怎麼做?數據庫不得不看起來如何?

+0

你有沒有想過到目前爲止什麼? –

回答

1

我會保留相同的表格,但添加一個dateEffective字段,然後在每次更換工具時創建一個新行。然後查詢表的時候,你可以在給定日期使用get工具的版本:

SELECT * FROM tools WHERE [email protected] AND dateEffective<@thisDate ORDER BY dateEffective DESC LIMIT (0,1) 

編輯您可能希望創建另一場名爲toolVersionId作爲主鍵。

EDIT 2在回答您的意見,怎麼樣:

SELECT * 
FROM tools t1 
WHERE toolVersionId IN (SELECT toolVersionId 
         FROM tools t2 
         WHERE t2.id = t1.id 
         ORDER BY t2.dateEffective DESC 
         LIMIT (0,1) 
         ); 
+0

你有什麼想法,我怎麼能得到整個表,只有工具的最後一個狀態? –

+0

@doledoug我已經發布了我的嘗試,但不知道它是否會起作用(我不是專家,對不起!)請讓我知道。 – James

1

可能有很多方法可以做到這一點。我過去成功的一種方法是在表格中添加一個version_id列。因此,idversion_id的組合成爲任何特定版本工具的完整密鑰。請注意,通過這種方法,獲取特定工具的所有版本非常容易,只需在id上選擇即可。獲取當前版本的工具也很容易,它只是id, max(version_id)

這種方法的缺點是您需要編寫代碼來管理版本控制。

+0

也許一些漂亮的觸發器可以自動「歸檔」版本? –

+0

@mike,是的,這當然是一種可能性,雖然我以前沒有那樣做過。 – hvgotcodes

+0

是啊數據庫邏輯是有點反mySQL ..我更像是一個Postgres的人,我們不介意寫DB代碼:) –

1

創建一個包含所有相同列的ToolsVersions表,並且只添加一個時間戳。每次更換工具時,都會使用當前時間戳將舊值保存到ToolsVersions表中。然後,您可以很容易地查詢某個範圍之間的所有版本,或查找最接近所需日期的版本。