IBM DB2 10 中的新時態特性為基于時間的數據管理提供了豐富的功能。例如,一個日期范圍可分配給每行數據以指出您的應用程序或業務何時認為該行有效。支持跟蹤此類業務有效性的表稱作應用程序周期時態表,而且其業務時間周期可以是過去的、現在的或
對于有外鍵關系的父表和子表,可擴展引用完整性的概念來考慮傳統鍵值,以及任何給定行的業務時間周期。本文將介紹這種時態引用完整性 (temporal referential integrity),以及如何在 db2 中強制執行基于時間的一致性。本文內容適用于 db2 for z/os? 和 db2 for linux?, unix?, and windows?。所有 sql 樣例已在 db2 10.1 for luw? 中進行了測試。
DB2 10 for z/OS 和 DB2 10 for Linux, UNIX, and Windows 引入了基于時間的數據管理,允許您查詢和操作過去、現在以及未來的數據,同時保留所有數據更改的完整歷史記錄。DB2 中的時態特性集合也被稱之為 Time Travel Query。
DB2 支持 3 類時態表:
- 系統周期時態表:DB2 以透明的方式不斷地保留已更新或刪除行的歷史記錄。使用 SQL 語言標準的新結構,用戶可以 “回到過去” 并查詢過去任一選擇點的。這是以內部分配的系統時間戳為基礎,DB2 使用該時間戳來管理系統時間,也稱之為事務處理時間。
- 應用程序周期時態表:應用程序提供日期或時間戳以描述數據的業務有效性。SQL 的新結構支持應用程序插入、查詢、更新和刪除過去、現在以及未來的數據。DB2 自動應用約束條件和行分割 (row-split) 來正確地維護應用程序提供的業務時間,也稱之為有效時間。
- 雙時態表:管理系統時間和業務時間。雙時態表結合了系統周期和應用程序周期時態表的所有功能。這種結合使得應用程序能夠管理數據的業務有效性,同時 DB2 可保存所有更新和刪除的完整歷史記錄。
在本文其余部分,我們假設您熟悉 DB2 中應用程序周期時態表的基本知識。時態引用完整性 (RI) 的討論也適用于雙時態表中的業務時間。當您更新或刪除業務時間中一個指定部分的數據時,應該了解如何創建和使用這些表,并了解 DB2 如何執行行分割 (row-split)。
什么是時態引用完整性?
一個示例
在本小節中,我們首先重溫了關系數據庫中傳統的引用完整性 (RI),然后對時態 RI 展開討論。我們的場景涉及一個虛擬業務,該業務從供應商處接收產品,然后將這些產品賣給客戶,偶爾也會進行促銷活動,在一定時間段內以折扣價格銷售選定的產品。為了幫助您理解如何實現和執行時態 RI,我們使用該應用程序場景和樣例數據。
傳統 RI
清單 1 顯示兩個涉及管理該業務的表。父表,product_avail,提供的每個產品在其中都有一行,并識別提供該產品的供應商。子表,promotion,每個特價產品都有一行,由一個促銷 ID、各自的產品 ID 和折扣價定義。兩個表可能還有其他列,但是為了簡單起見,這些列目前已經足夠了。
清單 1. 父表和子表之間引用完整性的簡單示例
CREATE TABLE product_avail( prodID INTEGER NOT NULL, supplier VARCHAR(32), PRIMARY KEY(prodID) ); CREATE TABLE promotion( promoID INTEGER NOT NULL, prodID INTEGER NOT NULL, price DECIMAL(10,2), PRIMARY KEY(promoID), FOREIGN KEY (prodID) REFERENCES product_avail(prodID) );
因為只能對已有產品提供促銷,所以 promotion 表中的每一行必須包含一個存在于 product_avail 表中的 prodID。這個條件被稱為 引用完整性,由 promotion 表中的外鍵 (foreign key, FK) 約束聲明并執行。有了該約束,任何試圖使用 product_avail 表中不存在的 prodID 插入或更新促銷表的操作都將被 DB2 拒絕。