跳转至

创建双时态视图

双时态视图同时保留两者:某件事何时发生,以及何时被记录。这样就可以按某个日期读取它,或按某个日期记录时的样子读取它,之后的更正永远不会掩盖更正之前已知的内容。

将视图的三列映射好,视图就成为双时态视图:

  • 业务键:在各版本之间标识同一条记录的一列或多列,例如 transaction_id。更正后的付款仍是同一笔付款,所以两个版本带有相同的键。
  • 有效时间:保存业务赋予该记录的日期的列,例如何时约定、入账或生效。
  • 记录时间:保存此版本何时录入或修改的列,例如 updated_at。

记录时间在时态数据库文献中称为事务时间,在 SQL:2011 中称为系统时间;有效时间在 SQL:2011 中称为应用时间,也称生效日期。

这三个值映射的是数据源中已有的列。版本如何保存由 Provisa 决定;无需选择存储模式。

三个示例

示例 有效时间 记录时间
10 月 3 日的一笔 100 元付款,在 10 月 5 日更正为 120。 10 月 3 日,更正保留此值。 第一个版本为 10 月 3 日;更正为 10 月 5 日。
10 月 3 日 14:10 采集的现场测量值在 10 月 6 日录入。其中的笔误在 10 月 7 日修正。 10 月 3 日 14:10,修正保留此值。 10 月 6 日;修正得到 10 月 7 日。
一笔交易在执行时入账,交易日 10 月 3 日,时间 10:02。10 月 4 日发现数量有误并予以修订。 交易日 10 月 3 日,修订保留此值。 10 月 3 日 10:02;修订得到 10 月 4 日。

按 10 月 3 日报告的样子读取,这笔交易显示错误的数量。按现在所知读取,它显示更正后的数量。

创建视图

保留历史的视图是物化的,以便保存其各个版本。

  1. 打开 Views,点击 + View。
  2. 在任一选项卡上定义视图:
    • Metrics:为视图命名,选择其 domain、指标和维度,然后点击 Continue。
    • SQL:打开 SQL 编辑器,编写并运行 SELECT,在编辑器中点击 + View,为视图命名并点击 Continue。
  3. 视图的设置在与其编辑器相同的部分中打开。在 Load and timeliness 中勾选 Materialized View。Time Travel 部分随即出现。
  4. 将 Keep history 设为 Bitemporal。
  5. 选择 Business key、Valid time 和 Recorded time 的列。
  6. 在其他部分设置其余内容,然后点击 Save。在此之前不会注册任何内容。

这三项要么一起声明,要么都不声明。只声明其中部分的视图会被 Provisa 拒绝,并说明缺少哪些。

注册表时也有同样的部分:在 + Table 下选择它,点击 Continue,其 Time Travel 部分位于 Load and timeliness。创建模型时(+ Model)也有该部分。对于模型,其键就是业务键,所以该部分只询问两个时间。

原地更新的表

有些表把每个版本保存为独立的一行,因此一次更正会新增一行,业务键相同。另一些表每个键只保留一行并覆盖它,因此它们的业务键就是主键。对于第二类表,Provisa 自己在版本日志中保存各个版本:

  • 每次捕获读取日志中最新记录时间之后记录的行,并添加其中发生变化的行。
  • 日志的允许延迟会扩大这个窗口,因此一行即使提交得晚、记录时间较早,也仍会被读取。
  • 捕获看不到源已删除的行。Full capture 重新读取整张表,并把每个已删除的行记录为已消失。
  • 日志从第一次捕获开始:在此之前,每行只有它当时的版本。

日志列在 Cache 的 Materialized Store 选项卡下,名为该表的 Version log of。它的 Settings 设置捕获频率和允许延迟;Full capture 就在旁边。普通读取该表时读取的是表本身;按某个时间读取,或按某个时间的记录读取时,读取的是它的日志。

读取

视图出现在 Views 列表中,并带有 HISTORY 标记。其详情面板会说明它保留历史,并链接到已选中该视图的 SQL 浏览器。将浏览器的 As of 和 As recorded at 选择器设为所需时间,然后运行查询。

同样的时间也会到达其他所有接口。pgwire 会话为其运行的每条语句设置一次:

SET provisa.as_of = '2026-10-03T12:00:00';
SET provisa.as_recorded = '2026-10-03T23:59:59';

HTTP 头、resolve 参数和 REST 参数列于带历史的视图。

之后修改

编辑器在视图的 Load and timeliness 选项卡上显示 Time Travel 部分。视图一经构建,其版本就按其业务键和有效时间记录,因此编辑器不再提供这两项,也不再提供关闭 Time Travel 的开关。记录时间仍可更改。若要按其他键组织历史,请创建一个新视图。