1

这是设计数据库时最佳实践的一个整体问题,我无法正确说出我的问题以在网上找到答案。

我有一个数据库,其中包含有关员工安全培训的信息。出于审计目的,需要存储有关需求的信息,但每年的需求可能会发生变化。我仍然需要记录员工需要做什么以及他们完成了多少。

我的第一反应是为历史数据创建一个表,并在每次员工完成一项操作或完成该操作所需的时间到期时基本上存储一个“快照”,这样如果需求在几年后发生变化,历史表将不会不要指向错误的信息。

我在实现时对此进行了更改并设置了应用程序,以便它不会更改现有需求,它会在每次需求更改时创建一个新需求,以便旧需求仍在数据库中并由历史表指向。在主表的需求表上,旧需求被标记为非活动的,并且永远不能通过应用程序删除。

我确信这个问题之前已经遇到过,但我无法清楚地表达它以自行搜索可行的答案。我的问题是在这种情况下进行的最佳方法是什么?我目前的实施是一个好的实施吗?我的第一反应更好吗?有没有比两者都更好的方法?

在旁注中,如果有此类问题的单词或短语(存储冗余数据、存储历史数据、存储审计数据,我不知道该怎么称呼它)请告诉我。

4

1 回答 1

0

据我了解,您有一名员工和相关任务。我会为员工创建一张表,为任务创建一张表。另一个多对多表将这些链接到。在任务表中,您将有一个状态和日期从/到列生效。如果任务当前有效,您可以将有效日期保留为空或将值设置为 2999 年 1 月 1 日。查询任务时,您需要提供日期,以便您能够使任务在特定日期生效。如果您决定使用 null 值,则 where 子句将类似于

其中 t.DateEffectiveFrm<=@AsOfDate 和(@AsOfDate < t.DateEffetiveTo 或 t.DateEffetiveTo 为空)

如果对于当前有效的任务,您在遥远的将来(1/1/2999)使用日期值,那么 where 子句将更简单 where t.DateEffectiveFrm<=@AsOfDate 和 @AsOfDate < t.DateEffetiveTo

您也可以考虑添加一个状态表,它将保存状态更改的历史记录。

于 2013-09-12T18:07:48.150 回答