2009-12-09 343 views
1

我最近遇到了一個涉及數據庫設計的非常有趣的問題。 我已更改表名以簡化問題,因此請讓我將其描述爲: 我有兩張桌子,每個水果和蔬菜都存儲水果或蔬菜是否美味。跟蹤列上的更改

現在讓我們說,有人在不斷變化的IsTasty通過我的應用程序和管理要求見能力的UI設定,當有人最後改變了它和誰。這裏棘手的部分是,雖然我們忽略了表中的其他數據,還有其他數據,但我們不想跟蹤表上的任何數據何時更改,只是這一列。

什麼是解決這個問題的最好方法是什麼?

I have a description of the problem with ER diagrams here:

+0

最近我發佈了我的系統來追蹤變化開源的,你可能想看看它是否能幫助你,我實際使用甲骨文在這個項目上tomcdc.codeplex.com – Tomek 2012-02-03 13:37:28

回答

0

如果您使用的是SQL Server 2008中,你採取看看CDC(變更數據捕獲)?

+0

。但我會考慮CDC,因爲我很好奇將來如何解決這個問題。 – 2009-12-09 16:47:50

0

觸發,有一種方法,看看哪些列進行了修改..

+0

這是正確的,問題是我們需要能夠稍後查詢該數據以顯示在UI頁面上。 – 2009-12-09 16:49:02

1

我喜歡在軌acts_as_versioned插件做它的方式。它離您的解決方案2最近,並附加了版本號字段。你基本上有你的水果表和你的fruits_versions表。每當更新水果中的行時,您都會在fruits_versions表中插入相同的數據,並增加版本號。

我覺得它比你的解決方案3的方法更具擴展性,如果你想更多的字段添加到表或跟蹤附加值。解決方案4是一種非關係型解決方案,您可以保持這樣的審覈日誌。

另一種方法,而不是保持的版本,就是不停的變化軌跡,像顛覆或版本控制系統一樣。如果你經常需要知道是否從a變爲b,而不是變更爲什麼,這可以使它更容易。我想這意味着真正的答案是「取決於」數據將如何使用。

0

使用SQL Server 2005和了,你可以用這樣的if語句創建一個觸發器:

IF UPDATE(IsTasty) 
BEGIN 
     Insert INTO Log (ID, NewValue) VALUES (@ID, @NewValue) 
END 
0

一種方式做,這是爲了增加觸發這些表。在觸發器中檢查您感興趣的列是否已更改。如果它已更改,則將一行插入到另一個跟蹤更改的表中。更改跟蹤表可能需要存儲數據,如已更改的列的名稱,以前的值,新值和更改日期。

0

佛SQL Server中,我使用AutoAudit生成的觸發器。審計表包含可用於顯示更改的歷史和視圖(AutoAudit自動爲已刪除的行創建視圖)。