我希望“查找表”这个术语选择得很好,我的意思是例如具有以下费率的费率表(查询):
便宜:15美元, -
中:30美元, -
昂贵:45美元, -
我们处于这样的情况:对于给定的实体(我们称之为'故障',它是设备,空调,电梯,krane,厕所等的故障),雇用构造函数来修复该设备。 该构造函数具有以下三种(组合)速率:廉价,中等且昂贵。
当构造函数修复错误时,他会输入工作时间和费率(当一个大四学生完成工作时,'昂贵',当一个大三学生完成这项工作时,'便宜')
从技术上讲,我们然后将Fault表中的FK添加到Rates表中。
因此,当必须打印发票时,我们会通过FK和故障记录中的工作时间获得费率。
问题是,当构造函数更改其费率并且您在几个月后重新计算旧发票时,会计算发票的其他金额,因为记录已更改。
所以我们必须构建某种历史,这就是问题:这是怎么做到的?
我想出的是两种不同的情况,问题是:其中一种是好的,有更好的方法吗?
1在费率表中添加valid-from和valid-until字段,因此在编辑值时,实际上会创建一个包含新有效日期的新记录。缺点是你必须始终考虑特定日期的费率,这对于当前情况(此时的实际利率)是不必要的。
2不要将故障中的FK置于速率,但是当您在故障时设置速率时,只需将VALUE从速率复制到故障。缺点是,当故障仍然可编辑时,编辑速率时,故障率不会更新。并且,当您编辑故障时,您会得到一个下拉框,其中有3个值可供选择,其中没有一个与当前值相同。
此时已经感谢阅读整篇文章了!
答案 0 :(得分:2)
答案 1 :(得分:2)
我不喜欢#2;如果我能帮助它,我从不喜欢用实际值替换关系(非规范化)。此外,它使审计更加困难;如果费率有一个奇怪的价值,它来自哪里?
#1的问题是,如果由于某种原因您更改了发票的日期,它应该仍然具有与最初创建时相同的费率。
由于这些原因,我建议做#1的部分,其中费率变化总是创建一个新行,但然后从每个故障链接到实际应用的速率(即,而不是依赖于加入的日期对于一个速率,实际上存储了一个带有故障的速率id。)
找到当前费率的一种方法就是寻找没有结束日期的方法。或者,根本不要使用结束日期(下一个费率的开始日期被视为上一个费率的结束日期),只按日期排序并取最后一个。
答案 2 :(得分:1)
我建议保留一份承包商费率表,按日期排序。当承包商的费率发生变化时,而不是更改现有费率会添加新条目。当您需要获取当前费率时,按时间戳降序排序并限制1.添加当前费率的日期条目输入每个作业记录,然后您可以执行简单的联接以立即获取所有信息。