2016-07-19 32 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)的索引。

相关问题