我有一张桌子,里面有一个人(详情)。其中两个字段,我们要求存储和显示更改的历史记录。他们是'IsActive BIT'并且' IsIdle BIT'。
目前,他们在Person表中填写了字段。
要求是能够显示此人何时处于活动状态以及何时处于空闲状态。以及谁设定这些价值观。 (所有故事都有LastUpdatedBy和CreatedBy列。)
我的计划是使用PersonHistory表,PersonID FK指向Person ,IsActive和IsIdle列,以及CreatedBy和LastUpdatedBy列。并且' EffectiveFrom' DATETIME。
因此,当我们创建一个人时,我们使用IsActive和IsIdle值,user和PersonID为历史记录添加一行。
要显示某个人,我们必须选择(不整理?)人员记录,然后加入历史记录表中该人员的最后一条记录。 INNER JOIN ..选择TOP 1 * FROM History,使用ROW_NUMBER?可能会很慢。
编辑' IsActive'时,我们需要添加一个带有PersonID和新IsActive(和/或IsIdle)值的新行。实际上,我们需要存储两者。只有在这些值发生变化时才会写入一行。这意味着我们需要进行预先保存检查以查看值是否发生了变化。
这看起来像是处理此要求的标准方法 - 还是有更好的更常见方法?
答案 0 :(得分: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)
上的索引。