在一箇舊的web應用程序我有一個表具有以下結構:
tools(id, name, abbreviation, width, height, power, type)
重新設計我的數據庫
的事情是,我需要歷史支持添加到該工具。工作場景是每個工具的細節都可以修改,我需要跟蹤這些變化。例如,如果我需要查看過去某個日期的某個工具的詳細信息,那麼我該怎麼做?數據庫不得不看起來如何?
在一箇舊的web應用程序我有一個表具有以下結構:
tools(id, name, abbreviation, width, height, power, type)
重新設計我的數據庫
的事情是,我需要歷史支持添加到該工具。工作場景是每個工具的細節都可以修改,我需要跟蹤這些變化。例如,如果我需要查看過去某個日期的某個工具的詳細信息,那麼我該怎麼做?數據庫不得不看起來如何?
我會保留相同的表格,但添加一個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)
);
你有什麼想法,我怎麼能得到整個表,只有工具的最後一個狀態? –
@doledoug我已經發布了我的嘗試,但不知道它是否會起作用(我不是專家,對不起!)請讓我知道。 – James
可能有很多方法可以做到這一點。我過去成功的一種方法是在表格中添加一個version_id
列。因此,id
和version_id
的組合成爲任何特定版本工具的完整密鑰。請注意,通過這種方法,獲取特定工具的所有版本非常容易,只需在id
上選擇即可。獲取當前版本的工具也很容易,它只是id, max(version_id)
。
這種方法的缺點是您需要編寫代碼來管理版本控制。
也許一些漂亮的觸發器可以自動「歸檔」版本? –
@mike,是的,這當然是一種可能性,雖然我以前沒有那樣做過。 – hvgotcodes
是啊數據庫邏輯是有點反mySQL ..我更像是一個Postgres的人,我們不介意寫DB代碼:) –
創建一個包含所有相同列的ToolsVersions表,並且只添加一個時間戳。每次更換工具時,都會使用當前時間戳將舊值保存到ToolsVersions表中。然後,您可以很容易地查詢某個範圍之間的所有版本,或查找最接近所需日期的版本。
你有沒有想過到目前爲止什麼? –