2016-07-19 30 views
0

我有一張持有人(詳細)的表格。其中兩個字段,我們有要求存儲和顯示更改的歷史記錄。他們是'IsActive BIT'和'IsIdle BIT'。一張桌子持有兩個字段的變化歷史

目前,它們是Person表中的字段。

要求是能夠顯示人員何時處於活動狀態以及何時處於閒置狀態。以及誰設置了這些值。 (所有故事都有LastUpdatedBy和CreatedBy列)。

我的計劃是使用PersonH​​istory表,PersonID FK到Person,以及IsActive和IsIdle列以及CreatedBy和LastUpdatedBy列。和'EffectiveFrom'DATETIME。

所以當我們創建一個人時,我們用IsActive和IsIdle值,用戶和PersonID向歷史記錄添加一行。

要顯示一個人,我們必須對人員記錄進行(不整潔?)選擇,然後加入歷史記錄表中該人員的最後一條記錄。 INNER JOIN .. SELECT TOP 1 * FROM History,using ROW_NUMBER?可能會很慢。

編輯'IsActive'時,我們需要添加一個新的行,其中包含PersonID和新的IsActive(和/或IsIdle)值。實際上,我們需要存儲兩者。只有當這些值改變時纔會寫入一行。這意味着我們需要進行預保存檢查以查看值是否更改。

這似乎是一個標準的方式來處理這個要求 - 還是有更好的更常見的方法?

+0

您可以將值保存在Person表中以及History表中,並且不需要連接。您還可能想查看[更改數據捕獲](https://msdn.microsoft.com/en-nz/library/cc645937.aspx)。 – Blorgbeard

回答

0

你可能會改變數據結構前,試試這個方法:

select p.*, ph.* 
from Person p outer apply 
    (select top 1 ph.* 
     from personhistory ph 
     where ph.personid = p.personid 
     order by ph.effectivefrom desc 
    ) ph; 

出於性能考慮,你想對personhistory(personid, effetivefrom)的索引。

相關問題