我想在MS SQL Server上存储一些与时间相关的数据,例如员工薪资历史记录。属性包括员工编号,从日期开始生效,工资,变更原因。
我的问题是“我是否应该在表格中包含有效日期?”存储此类时间相关数据的最佳做法是什么(当前有效至=下一个有效数据 - 1),即我应该包括可以从另一条记录中推断出的价值吗?
如果要存储有效,我可以使用Trigger来保持其值吗?
迈克尔
答案 0 :(得分:0)
你似乎拥有的是一个缓慢变化的维度。最好的方法是基于如何使用数据。毕竟,如果您永远不会查询数据,我可以建议您不要使用数据库,从而为您节省大量时间和金钱。
那就是说,我鼓励你在每一行都有两个日期:
然后,您可以确定历史记录中任何给定点的任何值的值。这使得查询数据更容易。但是,在加载表时,您需要记住更新以前活动数据的EndDate
。这是加载的一个额外步骤。
如果您只有EffDate
,那么查询会更加困难,尽管负载稍微容易一些。如果您唯一能做的就是选择一名员工并按顺序查看记录,这可能就足够了。
至于日期的性质。如果日期是"连续" (意味着它们有时间组件),然后一条记录的EndDate
应该等于下一条记录的EffDate
。查询一段时间将使用:
where MYDATE >= EffDate and MYDATE < EndDate
如果日期是离散的,那么我的条件是EndDate
比下一个EffDate
少一个:
where MYDATE >= EffDate and MyDate <= EndDate
您也可以使用between
来处理这种情况(但在对看起来像日期的任何内容使用between
时要小心。)
答案 1 :(得分:0)
您需要有一个包含工资历史的子表,其主键是组合键(employeeId和序列ID)。此表将作为数据历史记录的参考。 例如: empX,1,fromDate 10/10/2012,toDate 11/10 / 2012,1,980,000 $, empX,2,..... empX,3,....
您的员工表将包含当前工资及其生效日期。这个表的查询速度会更快。 ..这名员工很幸运;)