查找表中记录的历史记录

时间:2011-04-15 14:54:40

标签: c# .net design-patterns database-design

我希望“查找表”这个术语选择得很好,我的意思是例如具有以下费率的费率表(查询):

便宜:15美元, -

中:30美元, -

昂贵:45美元, -

我们处于这样的情况:对于给定的实体(我们称之为'故障',它是设备,空调,电梯,krane,厕所等的故障),雇用构造函数来修复该设备。 该构造函数具有以下三种(组合)速率:廉价,中等且昂贵。

当构造函数修复错误时,他会输入工作时间和费率(当一个大四学生完成工作时,'昂贵',当一个大三学生完成这项工作时,'便宜')

从技术上讲,我们然后将Fault表中的FK添加到Rates表中。

因此,当必须打印发票时,我们会通过FK和故障记录中的工作时间获得费率。

问题是,当构造函数更改其费率并且您在几个月后重新计算旧发票时,会计算发票的其他金额,因为记录已更改。

所以我们必须构建某种历史,这就是问题:这是怎么做到的?

我想出的是两种不同的情况,问题是:其中一种是好的,有更好的方法吗?

1在费率表中添加valid-from和valid-until字段,因此在编辑值时,实际上会创建一个包含新有效日期的新记录。缺点是你必须始终考虑特定日期的费率,这对于当前情况(此时的实际利率)是不必要的。

2不要将故障中的FK置于速率,但是当您在故障时设置速率时,只需将VALUE从速率复制到故障。缺点是,当故障仍然可编辑时,编辑速率时,故障率不会更新。并且,当您编辑故障时,您会得到一个下拉框,其中有3个值可供选择,其中没有一个与当前值相同。

此时已经感谢阅读整篇文章了!

3 个答案:

答案 0 :(得分:2)

对Programmers.SE进行了很好的讨论。

How to Store Prices That Have Effective Dates

这是一个众所周知的问题,使用有效日期是最好的方法。

答案 1 :(得分:2)

我不喜欢#2;如果我能帮助它,我从不喜欢用实际值替换关系(非规范化)。此外,它使审计更加困难;如果费率有一个奇怪的价值,它来自哪里?

#1的问题是,如果由于某种原因您更改了发票的日期,它应该仍然具有与最初创建时相同的费率。

由于这些原因,我建议做#1的部分,其中费率变化总是创建一个新行,但然后从每个故障链接到实际应用的速率(即,而不是依赖于加入的日期对于一个速率,实际上存储了一个带有故障的速率id。)

找到当前费率的一种方法就是寻找没有结束日期的方法。或者,根本不要使用结束日期(下一个费率的开始日期被视为上一个费率的结束日期),只按日期排序并取最后一个。

答案 2 :(得分:1)

我建议保留一份承包商费率表,按日期排序。当承包商的费率发生变化时,而不是更改现有费率会添加新条目。当您需要获取当前费率时,按时间戳降序排序并限制1.添加当前费率的日期条目输入每个作业记录,然后您可以执行简单的联接以立即获取所有信息。