许多业务场景除了需要维护当前数据外,还需要维护某种形式的历史数据,甚至还需要维护了解将来的数据。对于研发人员来说随着数据的变化需要同时维护历史数据和现有数据的版本,那么在该场景下又如何保证其效率、可用性和并发性是一个不小的挑战。同样在许多业务需求中,DBA 也有这种诉求需要一个管理具有时间特性的数据能帮助 DBA 了解当前数据的状态,也能使他们清楚的知道相应数据的历史数据状况及未来数据的情况的工具。在当今竞争激烈的商业市场,时间就是金钱,如果能找到一种方法既省时间又节约成本,无疑为你在行业中取得竞争优势增加了有力的法码。为此db2在10.1版本中带来了一个新功能:时态表意即存储和维护基于时间的数据表。时态表 (temporal table) 可以帮助企业节省时间和成本,它采用数据库本身内置的数据版本管理和跟踪有效的业务日期机制,节省了数据库管理人员和开发人员大量的时间和精力。
下面我们一步步介绍一下时态表的种类以及如何创建和使用10.1带来的这个新特性:
一 、时态表的类型:
1、 系统周期时态表 (system-period temporal table),它用于记录过去和现在的数据;
2、 业务周期时态表 (application-period temporal table),它用于记录过去,现在和将来的数据;
3、双时态表 (bitemporal table),它既具有系统周期时态表的功能又具有业务周期时态表的功能。
二、在介绍这三种时态表之前,首先介绍几个和时态表相关的概念:系统时间、业务时间和历史表。
1、系统时间(system time)用于跟踪表中行的状态变化,记录表中当前行的系统有效时间。它包含一个开始时间和一个结束时间,并且这两个时间列由数据库管理器自动管理。
2、业务时间 (application time) 用于记录业务数据的有效期,比如贷款利率的期限。它也是包含一个开始时间和一个结束时间,但是这两个时间列不是自动生成的列。当一个表里定义了业务时间列时,一个隐式的检查约束会自动生成,用它来保证一个业务的有效结束时间大于其开始时间。
3、历史表,时态表提供了自动存储表中行的历史版本功能,此功能是由历史表 (history table) 来实现的。历史表与系统周期时态表相关联,用于记录系统周期时态表中对数据修改的历史记录,如更新或删除一行数据,更新之前的数据或删除的数据会自动保存到历史表里。由于要存储系统周期时态表的历史数据,所以历史表必须和其有相同的结构。
三、什么是系统周期时态表
系统周期时态表 (system-period temporal table) 用于保存和维护表中各行版本数据,使用其本身来记录当前数据版本信息,使用和它相关联的历史表来存储更新之前的数据信息及删除的数据信息。 表中用系统时间记录行数据的有效时间,每一个系统周期时态表都有一个和它相对应的历史表。系统周期时态表里有三个特殊的列,它们是:
SYSTEM_START_TIME1 TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN
SYSTEM_END_TIME1 TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END
TRANS_ID1 TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID
这三个列的名字也可以起成别的名字,但是数据类型和定义方式必须要符合上面的要求,其中数据类型必须是 TIMESTAMP(12),SYSTEM_START_TIME1 和 SYSTEM_END_TIME1 必须定义为 NOT NULL,此外这三个列的值是由数据库管理器自动产生的。SYSTEM_START_TIME1 代表着一行数据在表中有效的系统开始时间,SYSTEM_END_TIME1 代表着一行数据在表中有效的系统结束时间,
TRANS_ID1 用于记录事务时间。
与系统周期时态表相关联的历史表必须和它有相同的结构,当对系统周期时态表的一行进行更新或删除时,数据库管理器会自动的在与它关联的历史表里保存此行数据的副本,这样的存储机制使得客户可以通过系统周期时态表查询过去时刻的数据。
四、什么是业务周期时态表
业务周期时态表(application-period temporal table)用于记录业务数据的有效时间。它包含两个业务时间列,这两列用于表示业务数据在过去,现在或将来的有效时间,它们不像系统时间那样由数据库管理器自动管理,它们的值是由实际的业务需求来提供的,用来反映实际应用中的业务数据生效的时间段。这两个时间列可以是 DATE 数据类型,也可以是 TIMESTAMP(p) 数据类型,其中 p 的值可以从 0 到 12,并且这两个列必须是 NOT NULL。通常给这两个时间列分别起名为 APPLICATION_START_TIME1 和 APPLICATION_END_TIME1,也可以命名为别的名字,但是列的结构定义必须符合上面所说的要求。
业务周期时态表没有相应的历史表,业务数据及它们过去,现在及将来的有效期信息都存储在业务周期时态表里。
五、什么是双时态表
双时态表既具有系统周期时态表记录历史数据的功能又具有业务周期时态表存储特定时间段业务数据的能力。所有应用在系统周期时态表和业务周期时态表里的功能和约束在双时态表里同样生效,因此双时态表里包含 SYSTEM_START_TIME1,SYSTEM_END_TIME1,TRANS_ID1,APPLICATION_START_TIME1 和 APPLICATION_END_TIME1,如同前面所提到的这五个列的名字可以起成别的名字,但是列的定义必须要符合前面介绍的需求。同样双时态表也具有相应的历史表,它的历史表的功能同系统周期时态对应的历史表一样,用于记录表中更新或删除数据的副本。
六、如何创建创建系统周期时态表
我们假设这样一个场景,某服装公司需要一个产品价格表来存储所有产品的价格,而且会查询以前某时刻某个产品的价格情况,如当时的价格是多少,是否做过促销活动等,以帮助确定当前的产品是否应该有折扣,折扣为多少。表名为 Price,表中包含的字段有 PID,PTYPE,PRICE,DISCOUNT,PERCENT。其中 PID 表示产品号,PTYPE 表示产品类型,PRICE 表示产品价格,DISCOUNT 表示是否有折扣,PERCENT 表示折扣的百分比是多少。由于涉及到历史数据,使用系统周期时态表来存储产品的价格情况是最佳的选择。
系统周期时态表创建的过程我们可以使用Data Studio 向导进行创建也可以使用DDL创建。为了简便起见我们使用DDL创建一个范例:
1)创建系统周期时态表
create table price
(pid char(6) not null,
ptype char(6) not null,
price int,
DISCOUNT decimal,
PERCENT int,
st_tm TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
ed_tm TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
TS_ID TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID);
2)创建其关联历史表
create table price_his
(pid char(6) not null,
ptype char(6) not null,
price int,
DISCOUNT decimal,
PERCENT int,
st_tm TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
ed_tm TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
TS_ID TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID);
alter table price add versioning use history table price_his;
对于业务周期时态表和双时态表的创建过程和系统周期时态表的方法一致这里不再赘述了。
七、如何维护和使用时态表
时态表的维护和使用与普通的操作相同,对于时态表的自动生成列不需要我们关注,这些列有数据库自动管理维护。
在查询过程中只要我们对相应时态表发出查询即可,如果需要his表的数据,则db2引擎会自动请求不需要我们干涉。
列如:select * from price where st_tm as of ‘2014-06-18-20.00.00.000000’ where pid=’001’
各位同学讲到这里是不是感觉db2这个功能超赞啊~
阅读(4996) | 评论(2) | 转发(0) |