比较时期或如何改变过去
#database #体系结构 #bitemporality

我们绝对可以将人类的整个历史视为事件的链条
微小的事件,大事件,大事件,关键事件 - 其中一些是可以忽略不计的,相反,有些是链条中的下一个链接,并改变了我们的世界的外观。

但是,我们挖掘出历史的细节越多,我们擦除的斑点越多,我们看到的东西就越令人惊讶,甚至矛盾的事物 - 有时可以完全反驳我们的观点和假设。我们认为和认为是事实的事情可能会被无效 - 我们需要改变过去

每种记录系统都不完美,并且可能包含错误。但是,如果我们想构建一个对此类错误有弹性的系统怎么办?如果我们想改变过去,但要将历史记录为事实怎么办?

更新到位

在几乎所有计算机和计算机科学的存在中,资源都是最大的限制,也是最复杂的问题之一。

我们的进度使我们能够从字节转换为千字节,从千数到大型和千兆字节。现代PC,智能手机和云系统可以轻松处理几乎无限的数据。

存储在计算机时代开始时在身体上是巨大的,从设备接管大厅和房间,转移到CD,软盘和硬盘驱动器上,以便我们可以甚至在我们的口袋里携带电影,大量的照片和音乐。该存储似乎总是是问题,在构建软件方面,这是我们最小的头痛。

尽管如此,我们从计算机时代的曙光中继承了习惯(坏>)仍然存在,可以说是最大的开发人员的头痛之一 - 。在存储容量的进度之前,我们非常谨慎地对我们如何消耗RAM和磁盘空间,这迫使我们突变变量和数据,而不是以不可变的方式持续存在,即保存新记录,而不是更新现有的现有记录一个。

即使功能性编程语言和the immutability approach正在上升,我们仍然困扰着我们是建造的。

审核系统

如何使用常见的可突变DB设计记录跟踪系统?可以说我们使用PostgreSQL并定义一个简单的audits表:

公司 发现的问题 审核员 date
bullsheepinc 180 15.09.2021
夸张 420 最大 14.02.2022
bullsheepinc 0 最大 15.02.2022

然而,一个半月前,我们发现麦克斯忘了写下Bullsheepinc的记录,并且由于专栏的默认为0,我们在相当长的一段时间内没有意识到这一变化。现在,如果我们想修复它,我们必须覆盖现有记录:

公司 发现的问题 审核员 date
bullsheepinc 180 15.09.2021
夸张 420 最大 14.02.2022
bullsheepinc 101 最大 01.04.2022

这种方法的缺点清晰可见:我们对变化失去了追踪,忘记了错误。正如我们的报告已经发送的那样,不会对Bullsheepinc受到任何惩罚。

时间性

从Mutability到我们设计完美记录系统的目标的下一步将是持续变化作为事实,而不是更新到位的数据。
为了构建一个真正不变的系统,我们希望在审计系统中禁止覆盖记录。相反,我们将将任何类型的数据更改存储为a
数据库中的单独行:

公司 发现的问题 审核员 date
bullsheepinc 180 15.09.2021
夸张 420 最大 14.02.2022
bullsheepinc 0 最大 15.02.2022
bullsheepinc 101 最大 01.04.2022

看起来这个选项对我们来说更好。现在,我们看到库存记录更改已被跟踪,我们实际上发现了一些问题。
我们可以在那里停下来,假装我们建立了最先进的审计系统,但这离真相太远了,我们很快就得到了另一个请求。

追溯变化

一旦我们的员工开始看到审计记录,而且还可以查看数据修复,约翰回忆说,实际上是他进行了计数,而发现的问题的数量实际上是 99 而不是 101
我们现在有一个严重的问题,因为新记录不适合我们的数据模型:

公司 发现的问题 审核员 date
bullsheepinc 180 15.09.2021
夸张 420 最大 14.02.2022
bullsheepinc 0 最大 15.02.2022
bullsheepinc 101 max 01.04.2022
bullsheepinc 99 John 01.05.2022

现在哪个记录确实有效?我们应该信任麦克斯还是约翰?我们应该如何定义错误和如何纠正

的概念的概念。

咬时

在上面的示例中,我们只有一个时间列:记录或交易日期
BITEMSTOMAITY假设添加了另一个时间维度 - 所谓的有效时间或有效的时间 - 沿交易时间用于跟踪时,当更改确实发生了 /strong>。

事务时间表示记录插入数据存储的时间。这对于审核目的,跟踪更改和事件采购可能非常有用。
有效的时间代表更改有效并发生在现实世界中。

如果我们遵循这些定义,我们可以说 transaction 时间是我们 thows 的时间,数据在那个时间点是正确的,它是实际上有效时间上正确正确:

2月15日,我们认为Max没有发现任何问题。
在4月1日,Max更正了101的问题。
5月1日,我们发现约翰实际上发现了99个问题。
实际上,我们希望截至2月15日,实际记录的问题为99。

在次期系统中,交易时间是不变的,只能增加有效时间,而有效时间可以是过去或将来的时间戳。
让我们看看如何使用这两个时间维度重新设计审核系统:

完美的审计系统

现在,我们知道如何利用交易和有效日期,我们可以通过将记录时间写为交易日期
来更改记录 它成为有效的时间有效时间

公司 发现的问题 审核员 交易日期 有效日期
bullsheepinc 180 15.09.2021 15.09.2021
夸张 420 最大 14.02.2022 14.02.2022
bullsheepinc 0 最大 15.02.2022 15.02.2022
bullsheepinc 101 最大 01.04.2022 15.02.2022
bullsheepinc 99 约翰 01.05.2022 15.02.2022

让我们对数据库执行一些查询:

    module Audit
      # @returns [Hash] a hash with auditor, issues found and transaction date fields
      def get_record(company, valid_date = nil, transaction_date = nil)
        # calling the DB ...
      end
    end

    > Audit.get_record("BullSheepInc")
    # {auditor: "John", issues_found: 99, transaction_date: "01.05.2022"}
    > Audit.get_record("BullSheepInc", "15.09.2021")
    # {auditor: "Joe", issues_found: 180, transaction_date: "15.09.2021"}
    > Audit.get_record("BullSheepInc", "01.01.2021")
    # nil - we didn't inspect the company as of 01.01.2021
    > Audit.get_record("BullSheepInc", "15.02.2022", "01.04.2022")
    # {auditor: "Max", issues_found: 101, transaction_date: "01.04.2022"}

您可以看到,现在我们有默认情况下返回的最新正确值,
但是我们还可以在过去的有效日期上获取记录。

用例

BITMESTOMATY可以证明对您具有数据跟踪以及S 可能有错误并恢复它们的任何系统有用:

  • 薪资,付款系统
  • auditing
  • 风险系统
  • 区块链
  • insurance
  • 合规性和隐私
  • 时间数据管理
  • 基于事件的系统
  • 分布式交易

跨时间数据库

在现有数据库中支持BITEMELATY可能不是一项琐碎的任务,尤其是当涉及到传统的关系数据库时,我们之间的所有关系都应考虑到Bitemporal列。

目前,最突出的开源解决方案是JUXT开发的XTDB (or cross-time) database,与竞争对手相比,它具有很大的好处:

  • 在其核心上咬时
  • 支持追溯校正
  • 基于文档和图形(最终是版本的文档商店)
  • Datalog queries和SQL支持
  • 数据驱逐(支持驱逐积极和历史数据以协助信息隐私法规的技术合规性)
  • 分布式和可扩展
  • 捆绑数据库(可以在许多现有技术和数据库之上部署,例如Kafka,JDBC,AWS S3)
  • 可以轻松地集成到任何现有的JVM应用程序中,也可以使用其REST API
  • 连接

由于我们将在下一篇文章中进行更多探讨,因此XTDB可以用作建立不变和零花态软件的现成解决方案。

接下来是什么?

正如人们所能看到的,对于我们构建系统的情况的情况,BITMEMETALE可以是一个完美的匹配:

  1. 跟踪变化的历史或数据随时间变化的变化
  2. 可能会有错误,更正或数据调整

如果我们将该概念作为此类系统的基石,那么它们将获得更多的机会,并且
我们将摆脱可变性问题。

我们还可以推荐更多有关该主题的阅读:

在即将发表的文章中,我们将分享我们与XTDB合作的经验,从Elixir应用程序和我们从中学到的东西连接。

快乐的黑客并保持关注!

感谢Carsten的评论!