这是设计数据库时的最佳实践的总体问题,但我无法正确地提出问题,以便在网上找到答案。
我有一个数据库,其中包含有关员工安全培训的信息。需要存储有关需求的信息以用于审计目的,但每年的需求可能会发生变化。我仍然需要记录员工需要做什么以及他们完成了多少工作。
我的第一反应是为历史数据创建一个表,并且每当员工完成一个动作或者完成动作所需的时间到期时,基本上都存储一个“快照”,这样如果需求在几年之内改变了历史表不会指向错误的信息。
我在实现时对此进行了更改并设置了应用程序,以便它不会更改现有要求,每次需求更改时它都会创建一个新要求,以便旧要求仍在数据库中并由历史表指向。在主表上,需求表将旧需求标记为非活动状态,永远不能通过应用程序删除。
我确信之前遇到过这个问题但是我无法清楚地表达出来以便自己寻找可行的答案。我的问题是在这种情况下进行的最佳方法是什么?我目前的实施是好的吗?我的第一反应更好吗?还有另外一种方法比两种方式都好吗?
另一方面,如果有这类问题的单词或短语(存储冗余数据,存储历史数据,存储审计数据,我不知道该怎么称呼它),请告诉我。< / p>
答案 0 :(得分:0)
据我了解,您有员工和相关任务。我会为员工创建一个表,为任务创建一个表。另外多个表会将这些链接到。在任务表中,您将拥有从列到列的状态和日期。如果任务当前有效,您可以将有效日期保留为null或将值设置为1/1/2999。查询任务时,您需要提供日期,以便您能够在特定日期之前使任务生效。如果您决定使用null值,则where子句将类似于
其中t.DateEffectiveFrm&lt; = @ AsOfDate和(@AsOfDate&lt; t.DateEffetiveTo或t.DateEffetiveTo为null)
如果对于当前有效的任务,你在远期(1999年1月1日)使用日期值,那么where子句将更简单 其中t.DateEffectiveFrm&lt; = @AsOfDate和@AsOfDate&lt; t.DateEffetiveTo
您可以考虑添加状态表,该状态表将保留状态更改的历史记录