娱乐历史

通常需要访问某些财产的历史价值。但有时,这一历史本身需要以追溯更新来修改。磅扑历史将时间视为两个维度:实际历史记录应该有哪些历史记录的信息完美传输,而记录历史记录捕获我们对历史的了解如何变化。

2021年4月07



当我们想到一些财产(例如您的地址或薪水)随着时间的推移而变化时,我们通常将其视为线性变化序列。但令人惊讶的是,它经常比这种方式变得更加纠结,这种方式通常会混淆计算机化的记录。

我可以用一个简单的例子来说明这一切:

那么我们当被问到2月25日的速度是什么时候,我们应该回答什么?在一个意义上,我们应该回答6500美元,因为我们现在知道这是速度。但我们常常在2月25日忽略我们认为薪水是6000美元,毕竟是我们担任薪资的时候。我们打印了一张支票,送到她,她兑现了。这些都是基于她的工资的金额。如果税务机关于25日向我们征求薪水,这变得重要。

这两个尺寸

我发现我可以通过把时间看作两个维度来理解这种混乱——因此才有了“双时间”这个术语。一个维度是萨利的实际工资历史,我将通过每个月25日的抽样来说明,因为这是发工资的时间。

日期 薪水
1月25日 6000.
2月25日 6500
3月25日 6500

第二个维度是我们问2月25日萨莉的工资历史是怎样的?2月25日我们没有收到HR的信,所以我们以为她的工资总是6000美元。实际的历史和我们对历史的记录是有区别的。我们可以通过向表中添加新的日期来显示这一点

记录日期 实际日期 薪水
1月25日 1月25日 6000.
2月25日 1月25日 6000.
3月25日 1月25日 6000.
2月25日 2月25日 6000.
3月25日 2月25日 6500
3月25日 3月25日 6500

我正在使用这些条款实际的记录两个维度的历史。您也可以听到人们使用这些条款有效的, 或者有效的(实际)和交易(备案)。[1]

我通过说“在3月25日”这样的话来读这张桌子的行,我们认为Sally于25日的薪水是6500美元“。使用这种思维方式,我可以看看莎莉的早期表的实际历史表,并说它更准确地说,这是3月25日在3月25日众所周知的实际历史(录制)的实际历史。

在编程术语中,如果我想知道莎莉的薪水,我没有历史,那么我可以用类似的东西sally.salary.添加支持(实际)历史我需要使用Sally.Salaryat('2021-02-25').在双时间世界里,我需要另一个参数Sally.Salaryat('2021-02-25','2021-03-25')

可视化这一点的另一种方法是制作一个曲线,其中x轴是实际时间,y轴是记录时间。我根据薪水水平遮蔽地区。(绘图的形状是三角形,因为我们没有尝试记录未来的价值。[2]

使用此图,我可以为25日的每次薪资进行实际历史如何发生变化的表格。我们看到2月25日的工资罗拉在莎莉没有提高的时候跑,但是当35月25日的工资筹码时,提升着名。

变更追溯变更

现在考虑另一种来自人力资源部门的沟通

  • 4月5日:很抱歉我们之前的邮件中出现了一个错误。2月15日,莎莉的工资涨到了6400美元。很抱歉给您带来不便。

这是使天使哭泣的改变。但是当我们想到衡量纪念历史的条款时,它并不难以理解。这是具有此新信息的绘图。

用于Payrols的水平线代表了记录时间的某个点的实际历史。4月25日,我们知道Sally的薪水从2月15日从6000美元增加到6400美元。在这方面,我们从未看到莎莉的6500美元的工资,因为它从未如此。

看一下图表,垂直线意味着什么?

这代表了我们对特定日期的价值的了解。表格表示2月25日的薪资,因为我们的知识随着时间的推移而变化。

使用贝特般性

当我们必须处理追溯变化时,符号历史是框架历史的有用方式。但是,我们没有看到它经常使用,部分原因是许多人不了解这项技术,而且因为我们经常离开它。

一种避免它的方法是不支持追溯变化。如果您的保险公司在收到信中,任何变更都生效 - 那么这是一种迫使实际时间匹配记录时间的方式。

如果采取的行动是基于过去已经进行了追溯性更改的状态,比如根据现在更新的薪资水平发送工资支票,那么追溯性更改就会产生问题。如果我们只是在记录历史,那么我们就不必担心它会追溯变化——我们基本上忽略了记录历史,只记录实际的历史。即使我们有固定的动作,我们也可以这样做,如果这个动作被记录下来,它记录了任何必要的输入数据。这样Sally的工资单就可以在支票发出时记录她的工资,这就足够用于审计目的了。在这种情况下,我们可以只知道她的实际工资历史。记录记录被埋藏在她的工资报表里。

如果在发生行动之前进行任何追溯更改,我们也可能逃避实际历史。如果我们在2月24日学到了Sally的薪酬变化,我们可以在薪酬犯规行动依赖于不正确的图形之前调整她的记录而不达到。

如果我们可以避免使用双时间历史,那么这通常是可取的,因为它确实会使系统相当复杂。然而,当必须处理实际和记录历史之间的差异时,通常是由于追溯更新,然后我们需要咬紧牙关。其中最困难的部分是教育用户双时间历史是如何工作的。大多数人不认为历史记录是会改变的东西,更不用说记录和实际历史这两个维度了。

仅追加历史

在一个简单的世界里,历史记录是仅附加的。如果交流是完美的和即时的,那么所有的新信息就会被每个感兴趣的人立即学到。我们可以把历史看作是世界上发生的新事件。

磅扑历史是一种方式来沟通沟通既不完美也不瞬间。实际历史不再是附加的,我们返回并进行追溯变化。但记录历史本身只添加。我们不会改变我们对Sally 2月25日的工资的了解。我们只是把我们后来获得的知识加上去。通过将仅追加的历史记录叠加在实际历史记录之上,我们允许在修改实际历史的同时创建其修改的可靠历史记录。

追溯变化的后果

双时间历史是一种机制,它允许我们追踪一个值是如何变化的,能够提出问题是非常有帮助的sally.salaryat(实际,唱片,录制).但是追溯性的改变不仅仅是调整历史记录。正如专家所说:“人们认为时间是因果关系的严格进展,但是实际上从非线性、非主观的角度来看,它更像是一个摇摇晃晃的大球。”[3]如果我们支付了6000美元,我们应该支付6400美元,那么我们需要做正确的。至少意味着在后来的薪水中获得更多,但它也可能导致其他后果。也许较高的付款方式她应该在一个月前越过一些重要的门槛,也许有税收影响。

单独的磅扑历史不足以弄清楚这些依赖的效果,这需要一组额外的机制,这超出了这种模式的范围。一项措施是创建一个并行模型,它捕获了世界的状态,因为它应该具有正确的薪水,并用它来弄清楚补偿变化。[4]足扑腾的历史可以为这些措施是有用的元素,但只有不允许这一大球的一部分。

记录时间的透视

我上面关于记录时间的例子使用日期来捕获我们对实际历史的不断变化的理解。但我们记录历史的方式可能比这更复杂。

为了使上面的一切更容易跟踪,我对工资日期的历史进行了采样。但是历史更好的表示是使用日期范围,这里是覆盖2021年的表

记录日期 实际日期 薪水
1月1日- 2月14日 1月1日- 12月31日 6000.
3月15日 - 4月4日 1月1日- 2月14日 6000.
3月15日 - 4月4日 2月15日 - 12月31日 6500
4月5日 - 12月31日 1月1日- 2月14日 6000.
4月5日 - 12月31日 2月15日 - 12月31日 6400.

我们可以设想Sally的工资是通过两个键的组合来记录的,实际键(日期范围)和记录键(也是日期范围)。但是记录键的概念可能比这更复杂。

一个明显的情况是,不同的药剂可以具有不同的记录历史。这显然是对莎莉的情况,从人力资源部门到工资部门的消息需要时间,因此这些修改对实际历史的记录时间将在两者之间有所不同。

部门 记录日期 实际日期 薪水
人力资源 1月1日- 2月14日 1月1日- 12月31日 6000.
人力资源 2月15日 - 12月31日 1月1日- 2月14日 6000.
人力资源 2月15日 - 12月31日 2月15日 - 12月31日 6400.
工资单 1月1日- 3月14日 1月1日- 12月31日 6000.
工资单 3月15日 - 4月4日 1月1日- 2月14日 6000.
工资单 3月15日 - 4月4日 2月15日 - 12月31日 6500
工资单 4月5日 - 12月31日 1月1日- 2月14日 6000.
工资单 4月5日 - 12月31日 2月15日 - 12月31日 6400.

任何可以记录历史的东西在学习信息时都会有自己的记录时间戳。根据这些数据,我们可以说企业将选择某个代理作为记录某些类型数据的定义代理。但代理商会越过职权界限——无论公司规模有多大,都不会改变与税务机关打交道的记录日期。我们花了很多精力来整理由不同的主体在不同的时间学习相同的事实而引起的问题。

我们可以通过将部门的概念和记录日期范围组合成一个视角的单一概念来概括在这里发生的事情。因此,我们会说“根据人力资源的角度在2月25日,莎莉的薪水是6400美元”的些什么。在表格中,我们可能会像这样想象它。

看法 实际日期 薪水
HR,1月1日 - 2月14日 1月1日- 12月31日 6000.
HR,1月15日 - 12月31日 1月1日- 2月14日 6000.
HR, 2月15日- 12月31日 2月15日 - 12月31日 6400.
工资单,1月1日 - 3月14日 1月1日- 12月31日 6000.
Payroll,3月15日 - 4月4日 1月1日- 2月14日 6000.
Payroll,3月15日 - 4月4日 2月15日 - 12月31日 6500
工资表,4月5日- 12月31日 1月1日- 2月14日 6000.
工资表,4月5日- 12月31日 2月15日 - 12月31日 6400.

这折叠成一个透视概念,给我们吗?它允许我们思考其他观点可能是什么。一个例子是考虑替代观点。我们可以创建一个透视,我们删除个人提升(例如2月15日的莎莉),并在3月1日给出每一位员工的薪资10%。这将导致莎莉的薪水的新记录时间维度。

看法 实际日期 薪水
真实世界 1月1日- 2月14日 6000.
真实世界 2月15日 - 12月31日 6400.
全球提升 1月1日- 2月28日 6000.
全球提升 3月1日 - 12月31日 6600

记录时间概念的概念表示,我们可以在实际历史上层分层,使用基本上相同的机制来推理追溯变化和替代历史。

在历史上施加许多透视尺寸并不是一些广泛有用的东西,甚至与衡量纪念历史相比。但我发现它有助于考虑这些情况:在历史上或将来的替代方案的推理。

存储和处理双时间历史

将历史添加到数据增加了复杂性。在一个磅扑座世界中,我需要两个日期参数来访问Sally的薪水 -Sally.Salaryat('2021-02-25','2021-03-25').我们可以在默认情况下简化访问,如果我们将记录时间的默认值视为今天,那么只需要当前记录时间的处理就可以忽略双时间并发症。

然而,简化访问并不一定会简化存储。如果任何客户需要双时态数据,我们必须以某种方式存储它。虽然有一些数据库内置了对某种程度的暂时性的支持,但它们是相对小众的。明智的是,当涉及到长期存在的数据时,人们往往会格外小心利基技术。

考虑到这一点,通常最好的办法是想出我们自己的方案。主要有两种方法。

第一种是使用双时间数据结构:将必要的日期信息编码到用于存储数据的数据结构中。这可以通过使用嵌套的日期范围对象或关系表中的一对开始/结束日期来实现。

记录开始 记录结束 实际开始 实际结束 薪水
1月1日 12月31日 1月1日 2月14日 6000.
1月1日 2月14日 2月15日 12月31日 6000.
2月15日 12月31日 2月15日 12月31日 6400.
1月1日 12月31日 1月1日 3月14日 6000.
1月1日 2月14日 3月15日 4月4日 6000.
2月15日 12月31日 3月15日 4月4日 6500
1月1日 2月14日 4月5日 12月31日 6000.
2月15日 12月31日 4月5日 12月31日 6400.

这允许访问所有的双时间历史,但是更新和查询很尴尬——尽管这可以通过让库处理对双时间信息的访问变得更容易。

替代方案是使用事件的采购.在这里,我们不会将Sally的薪资状态作为我们的主要商店存储,而是将所有更改存储为事件。这些事件可能看起来像这样

记录日期 实际日期 行动 价值
1月1日 1月1日 sally.salary 6000.
3月15日 2月15日 sally.salary 6500
4月5日 2月15日 sally.salary 6400.

请注意,如果事件需要支持符号历史,因此他们需要匹配。这意味着每个事件都需要在世界发生的事件发生时的实际日期(或时间),以及我们了解到的记录日期(或时间)。

存储事件在概念上更加直接,但需要更多处理来回答查询。然而,很多处理都可以通过构建应用程序的快照来缓存。因此,如果此数据的大多数用户只需要当前的实际历史记录,那么我们可以构建一个只支持实际历史记录的数据结构,填充它从事件中填充它,并将其保持最新,因为新事件涓涓细流。那些想要磅声数据的用户可以创建一个更复杂的结构并从同一事件中填充它,但他们的复杂性不会让人对那些想要更简单的模型的人来说更难。(如果有些人想在不同的记录日期看实际历史,他们可以使用几乎所有相同的代码来处理当前的实际历史。)


进一步的阅读

我遇到了在20世纪80年代和90年代使用各种软件系统的衡量标识历史问题。我开始了写下这些模式但在其他写作项目接手之前,我从未通过过初稿。这里有关于双时间历史的讨论,我写这篇文章是为了强调这个概念,并希望能更清楚地解释它。

大约在那个时候,Richard Snodgrass写了一本书:用SQL开发面向时间的数据库应用程序.它详细介绍了如何在SQL系统中使用这种问题,其方法影响了SQL: 2011标准。

我从时间旅行:改变价值观的模式语言

脚注

1:实际/记录与有效/交易

有效时间和交易时间的术语来自雪双草,也用于SQL: 2011标准。当我第一次开始向讲习班提供关于时间建模的研讨会,回到早期的鼻子时,我使用了这些术语,但人们发现他们混淆了。因此,我们开始使用实际/记录。由于有效/交易尚未成为广泛使用,因此我将遵循该课程并在此处使用实际/记录。

2:双时态将来

在历史中,实际时间总是在记录时间之前。但是双时间性的概念可以应用于未来。如果5月5日我被告知Sally将在5月12日获得另一次加薪,那么我就可以记录5月5日的创纪录时间和5月12日的实际时间。

3:如果你不认识这个引语,你应该写眨眼在你的监视列表上。有史以来最好的时间旅游故事之一。

4:我开始在我之前的写作中探索这个主题并行模型在2000年代中期。然后我没有继续下去那条道路,我不确定什么时候或如果我将来会重新审视这条痕迹。

致谢

Alexandre Klaser、Dave Elliman、Joshua Taylor、Martha Rohte、Mauro Vilasi、Pavlo Kerestey、Pramod Sadalge、Rebecca Parsons、Saager Mhatre和Wolf Schlegel在我们的内部邮件列表中对本文进行了有益的讨论。

重大修订

07 4月2021年4月:发表

2021年3月17日:发送内部评论

2002年3月02日:开始起草了