跳轉至

建立雙時態檢視

雙時態檢視同時保留兩者:某件事幾時發生,以及幾時被記錄。咁就可以按某個日期讀取,或者按某個日期記錄時嘅樣子讀取,之後嘅更正永遠唔會遮蓋更正之前已知嘅內容。

將檢視嘅三欄對應好,檢視就成為雙時態檢視:

  • 業務鍵:喺各版本之間標識同一條記錄嘅一欄或多欄,例如 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 嘅開關。記錄時間仍然可以更改。如果要按其他鍵組織歷史,請建立一個新檢視。