用于保存两个字段的更改历史记录的表

时间:2016-07-19 22:34:21

标签: sql sql-server linq sql-server-2014

我有一张桌子,里面有一个人(详情)。其中两个字段,我们要求存储和显示更改的历史记录。他们是'IsActive BIT'并且' IsIdle BIT'。

目前,他们在Person表中填写了字段。

要求是能够显示此人何时处于活动状态以及何时处于空闲状态。以及谁设定这些价值观。 (所有故事都有LastUpdatedBy和CreatedBy列。)

我的计划是使用PersonH​​istory表,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)值的新行。实际上,我们需要存储两者。只有在这些值发生变化时才会写入一行。这意味着我们需要进行预先保存检查以查看值是否发生了变化。

这看起来像是处理此要求的标准方法 - 还是有更好的更常见方法?

1 个答案:

答案 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)上的索引。