表格设计用于时间相关数据

时间:2014-05-15 01:28:22

标签: sql

我想在MS SQL Server上存储一些与时间相关的数据,例如员工薪资历史记录。属性包括员工编号,从日期开始生效,工资,变更原因。

我的问题是“我是否应该在表格中包含有效日期?”存储此类时间相关数据的最佳做法是什么(当前有效至=下一个有效数据 - 1),即我应该包括可以从另一条记录中推断出的价值吗?

如果要存储有效,我可以使用Trigger来保持其值吗?

迈克尔

2 个答案:

答案 0 :(得分:0)

你似乎拥有的是一个缓慢变化的维度。最好的方法是基于如何使用数据。毕竟,如果您永远不会查询数据,我可以建议您不要使用数据库,从而为您节省大量时间和金钱。

那就是说,我鼓励你在每一行都有两个日期:

  • EffDate
  • 结束日期

然后,您可以确定历史记录中任何给定点的任何值的值。这使得查询数据更容易。但是,在加载表时,您需要记住更新以前活动数据的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,....

您的员工表将包含当前工资及其生效日期。这个表的查询速度会更快。 ..这名员工很幸运;)