2013-10-16 24 views
0

該程序的現有設計是將所有更改都寫入具有時間戳記的更改日誌表中。爲了獲取物品屬性的當前狀態,我們將JOIN加入到更新日誌表中,並取出具有最近時間戳的行。我應該如何可靠地標記SQL Server表中的最新行?

這是一種難以跟蹤當前值的混亂方式,但我們目前無法立即更改此更改日誌設置。

我打算稍微修改行爲,在變更日誌表中添加一個「IsMostRecent」位。這將允許我簡單地拉取具有該位設置的行,而不是聚合或遞歸查找。

你會採用什麼策略來確保這個位總是適當的設置?或者是否有一些替代方法可以建議哪些不影響當前日誌記錄表的使用?

目前我正在考慮的觸發方式,從而關斷位的所有其他行,然後打開它的最新行上INSERT

+0

你有更多的讀取或插入?哪個更加時間敏感? – bendataclear

+0

@bendataclear我讀取的內容大概是插入的10倍,但真正的難點在於何時需要進行聚合。 – Matthew

回答

1

編輯:開始這個答案之前,理查德·哈里森回答,答應:)

我建議類似下面另一個表結構爲:

VersionID TableName UniqueVal LatestPrimaryKey 
1   Orders  209  12548 
2   Orders  210  12549 
3   Orders  211  12605 
4   Orders  212  10694 

VersionID -- being the tables key 
TableName -- just in case you want to roll out to multiple tables 
UniqueVal -- is whatever groups multiple rows into a single item with history (eg Order Number or some other value) 
LatestPrimaryKey -- is the identity key of the latest row you want to use. 

那麼你可以簡單JOIN此表只返回最新的行。

如果你已經有了一個觸發器將行插入到表中的changelog這可以適應:

INSERT INTO [MyChangelogTable] 
(Primary, RowUpdateTime) 
VALUES (@PrimaryKey, GETDATE()) 

-- Add onto it: 

UPDATE [LatestRowTable] 
SET [LatestPrimaryKey] = @PrimaryKey 
WHERE [TableName] = 'Orders' 
AND [UniqueVal] = @OrderNo 

或者它可以做一個合併捕捉刀片爲好。

2

我已經有一個「MostRecentRecorded」做過表中只包含最近插入的記錄(Id和實體ID)觸發了一個觸發器。

有一個額外的列這是不正確的 - 並可以讓你陷入交易問題和閱讀現有的條目。

在這第一個版本是的

BEGIN TRANSACTION 
    INSERT INTO simlog (entityid, logmessage) 
      VALUES  (11, 'test'); 

    UPDATE simlogmostrecent 
    SET lastid = @@IDENTITY 
    WHERE simlogentityid = 11 
COMMIT 

一個簡單的情況下確保MostRecent表必須在SimLog每個記錄的條目可以在查詢中進行,但ISTR我們在創作中做到了SimLog提到的實體(以上是我對第一個版本的回憶 - 我沒有代碼)。

但是,簡單的版本導致多個作家可能導致死鎖或事務失敗的問題;所以它被轉化爲觸發器。

+0

因此,這是一張表格,其中有一列(或多個)表示FK的更新日誌。我只需從我的更改日誌中加入「JOIN」以確定當前狀態?這是可行的,它在聚合實踐中對你有什麼作用?你在你的日誌上觸發'INSERT's爲你的「MostRecentRecorded」表執行一個原子的'DELETE' /'INSERT'或'UPDATE'? – Matthew

+0

最初內聯在SQL中 - 但最終成爲觸發器。 –

0

想到的一件事就是創建一個視圖,在後臺執行所有凌亂的MAX()查詢等。那麼你應該能夠查看視圖。這種方式不需要改變你當前的設置,只需將所有的混亂移動到一個地方即可。

+0

它混淆了當前的混亂,但SQL並不令人生畏。我想要緩解的問題是當我需要聚合信息時的遞歸搜索行爲。一個View並不能解決這個問題,它可以說更糟。 – Matthew

相關問題