C# 查找表中记录的历史记录

C# 查找表中记录的历史记录,c#,.net,design-patterns,database-design,C#,.net,Design Patterns,Database Design,我希望术语“查找表”选择得当,我的意思是,例如,具有以下速率的速率表(查找): 便宜:15美元 中等:30美元- 昂贵:45美元- 我们所处的情况是,对于一个给定的实体(我们称之为“故障”,它是一个设备的故障,如airco、电梯、krane、厕所等),雇佣一个建造师来修复该设备。 这家建筑商有三种价格:便宜、中等和昂贵 当构造器修复故障时,他输入工作时间和费率(当一个高年级学生完成工作时,“昂贵”,当一个低年级学生完成工作时,“便宜”) 从技术上讲,我们然后将故障表中的FK添加到费率表中 因此,

我希望术语“查找表”选择得当,我的意思是,例如,具有以下速率的速率表(查找):

便宜:15美元

中等:30美元-

昂贵:45美元-

我们所处的情况是,对于一个给定的实体(我们称之为“故障”,它是一个设备的故障,如airco、电梯、krane、厕所等),雇佣一个建造师来修复该设备。 这家建筑商有三种价格:便宜、中等和昂贵

当构造器修复故障时,他输入工作时间和费率(当一个高年级学生完成工作时,“昂贵”,当一个低年级学生完成工作时,“便宜”)

从技术上讲,我们然后将故障表中的FK添加到费率表中

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

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

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

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

1在rate表中添加一个valid from和valid Till字段,这样当您编辑一个值时,实际上您创建了一个新记录,其中包含新的有效日期。不利的一面是,你必须时刻记住一个特定的日期,这对于目前的情况(此时的实际利率)是不必要的

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


在这一点上,已经感谢你阅读了这篇文章

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

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

程序员在上对此进行了很好的讨论


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

在Programmers.SE上对此进行了很好的讨论

这是一个众所周知的问题,使用有效日期是最好的方法;如果我能帮忙的话,我从不喜欢用实际值(非规范化)替换关系。而且,它使审计变得更加困难;如果这个比率有一个奇怪的值,它是从哪里来的

但是#1的问题是,如果出于某种原因更改发票日期,它可能仍然与最初创建发票时的费率相同

出于这些原因,我建议执行#1中的部分,在该部分中,费率更改始终会创建一个新行,但随后会将每个错误链接到实际应用的费率(即,与其依赖加入费率的日期,不如实际存储带有错误的费率id)

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

我不喜欢#2;如果我能帮忙的话,我从不喜欢用实际值(非规范化)替换关系。而且,它使审计变得更加困难;如果这个比率有一个奇怪的值,它是从哪里来的

但是#1的问题是,如果出于某种原因更改发票日期,它可能仍然与最初创建发票时的费率相同

出于这些原因,我建议执行#1中的部分,在该部分中,费率更改始终会创建一个新行,但随后会将每个错误链接到实际应用的费率(即,与其依赖加入费率的日期,不如实际存储带有错误的费率id)


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

我喜欢你写的审计方面,没有考虑到这一点。所以我同意,按日期链接不是一个好主意,只需在rates表的recordId中添加一个FK。因此,在这种情况下,只有Rates表的用法会改变(记录编辑实际上是一个带有新“validFrom”日期的insert),而Fault表的用法将是相同的:这将仍然有一个FK到Rate记录。还有一个加号是“无结束日期”的想法(当你在时间框架上有漏洞时,它不会起作用,但我们没有这些漏洞)。我喜欢你写的审计方面,没有想到这一点。所以我同意,按日期链接不是一个好主意,只需在rates表的recordId中添加一个FK。因此,在这种情况下,只有Rates表的用法会改变(记录编辑实际上是一个带有新“validFrom”日期的insert),而Fault表的用法将是相同的:这将仍然有一个FK到Rate记录。对于无终止日期的想法(行不通)也是一个加号