时间数据库

时态数据

传统数据库例如关系数据库描述数据进入数据库时所反映现实世界当前状态。当这种状态发生改变时需要通过合适的更新（插入、删除和修改）再反映到数据库当中，这种更新通常发生后，原先的状态就“自然”消失。对于许多应用系统来说，只保存当前状态是不够的。例如银行系统、人事系统和医疗系统等等，它们都需要着力维护相关的历史数据信息。需要显式表示和管理与时间相关的数据就是时态信息。时态数据的形式特征是其由不显含时间的数据和相应的时间标签组成，而本质是需要将数据本身与特定的时间例如数据的生命周期等紧密结合，时间的处理和数据的管理相融相合，是数据与其相关时间的整合体，因此，常规数据库就不能有效进行时态数据的管理。当然也可以在常规数据库框架内通过应用程序来管理时态数据，但相应应用程序会相当复杂，也容易出错，同时也加重时态数据用户的负担。

时态数据库

数据是数据内涵的重要部分。关系数据库中数据的语义考虑是其中数据间关联的基础，例如关系数据库中关系模式设计（规范化）就是关系数据语义探讨的基本体现。同样需要考虑时态数据中涉及到时间的语义。这在时态数据系统中，也称为数据的时间维度。

数据的时间维度

在时态系统中，通常考虑得是时间元素的一个集合，而且根据实际应用情形，需要讨论时间元素集合的特定语义，根据应用中实际要求，通常需要研究用户定义时间维度、有效时间维度和事务时间维度等三种基本语义情况。

用户自定义时间

用户自定义时间（User-defined Time）是用户根据自身需要或理解而定义的时间，这种时间的属性值一般是时间点，其语义由用户本身予以解释。系统通常将基于用户定义时间的时间域与其他一般属性域等同看待，相应操作与对普通字符串操作没有本质差别。例如，“生日”可能不是一种标准数据类型，但用户可以根据需要定义一个具有“生日”数据类型的属性，相应元组中对应的该属性的值为“1985-10-21”，那么这就是一种用户自定义时间。系统通常不会对其进行特别处理，用户自定义时间的提供和更新都由用户自身完成。 在传统数据库系统中，系统通常都支持用户自定义数据类型，允许用户在原有系统数据类型的基础上建立自身所需要的数据类型，其中也包括用户子定义时间数据类型。在创建或更新数据时，用户自定义数据类型和其他标准数据类型一样被用户使用。与传统数据库系统情形类似，时态数据库系统不对用户自定义时间进行任何特殊处理，不提供专门的语言支持。用户自定义时间值完全依赖于实际应用，由用户和系统以常规方式存取。

时态数据库

时态数据库的分类基础是数据的时间维度

双时态数据库

回滚数据库和历史数据库各具优点，因此，可以设计一种数据库，使它既支持事务时间又支持有效时间，这就是双时态数据库（Bitemporal Database）。双时态数据库集成了前三种类型数据库的基本功能特性，储存了数据库和现实世界两者发展的历史。 双时态数据库由时态关系组成，其时态关系是一个四维结构。其中两维是属性和元组，另外两维是事务时间和有效时间，一个时态关系可以看成是一个历史关系的序列。对时态关系的一个回滚操作则是选取了一个特定的历史关系，可对该历史关系进行查询。而每一个事务则引起一个新的历史关系的建立。双时态数据库如图2所示。
图2 双时态数据库
双时态关系的一种实现方法就是组合回滚数据库和历史数据库成为新的数据库。 图3是一个元组的四个历史数据库中的有效时间片断组合。我们只是在原来的三维结构的基础之上加了第四维有效时间维，使得数据库变为四个维结构，元组维和属性维与原来无异，故不在此给出。
图3 双时态数据库的两个时间维
只要在事务维中任意截取事务时间点就可以找到相应的元组的有效时间段，不同的事务时间点对应不同的有效时间段（一般是这样的，当然也有有效时间段是一样的不同事务时间点，如事务时间点T1 和T2 的有效时间段是一样的）。 可以看出，在事务时间轴上，取不同的时间点，就产生不同的历史数据库，我们可以对上图中的对应于四个事务时间点T1，T2，T3，T4的历史数据库进行查询操作。当然图中所示的只是一个元组的四个历史数据库中的有效时间片断组合，对于其他元组的情况可以类似的进行推理，而后，这些元组组合到一起即形成了四个不同的历史数据库。 所以，这四个历史数据库也可以成为是快照历史数据库，说是快照，是因为这四个数据库是分别是四个事务时间的快照；说是历史数据库，是因为每个数据库里面的纪录是历史数据库属性的，记载的是现实元组的真实变化的时间，而非数据库状态变化的时间，我们可以在这四个数据库里面进行增加、改正、删除及查询的工作。 在双时态数据库中，我们可以在当前时间对以前的事务时间T1时的该元组属性或有效时间进行改动。例如，可以在T4时间对T1时的历史快照数据库进行修改，通过改变有效时间区间t1，t2和t3为t1和 t3。可使得在T1时的快照历史数据库中的元组属性（时间属性）得到了改变。但原先事务时间不能改动，只是增加了一个新的纪录，该记录的事务时间是T4，记录内容是把原来的有效时间进行了改变。 由此可见，双时态数据库具有回滚数据库和历史数据库的特性，在保存数据库变迁历史的同时，也保存了现实世界的真实的数据属性，真正体现了对数据时态属性的全面支持。当然，时态数据库是以牺牲大容量的储存空间为代价的，对双时态数据库的储存进行优化是时态数据库研究的一个重要工作。

时态数据查询语言

目前，时态数据查询语言主要由下述三种类型。

TempSQL

TempSQL是在1985年由S.Gadia和S.Nair提出，作为一种类SQL的时态数据库查询语言，TempSQL引入了双时态机制，数据库可以对数据本身历史（有效时间）、对数据进行插入、删除和更新等的历史（事务时间）、数据库和用户出错的历史等进行管理。TempSQL保持时态数据与静态数据的无缝连接，而将快照数据看做是时间标签为[now,now]的一个特例。 在TempSQL中，元组中主键属性（例如学生信息元组中的学号属性）不能随时间变化，而非主键属性（例如学生元组中“住址”、“年龄”和“联系方式”等属性）在不同时间内可以有不同取值。

TQuel

TQuel是在1985年由R.Snodgrass提出，是一种基于双时态的数据库查询语言。作为Quel（早期的一种非时态数据库查询语言）的时态扩展扩展（同时支持有效时间和事务时间管理，并且认为两者是相互独立和彼此正交），TQuel保持了Quel的基本风格，同时引进了各种基本时态关键词，例如as-of，overlap、first，last和endof等

TimeDB

作为时态数据库“产品化”代表，TimeDB由A. Steiner于1998年开发的一个时态数据库管理系统http://www.timeconsult.com/software ，最新版本是2.2版。TimeDB是传统数据库管理系统的前端软件，用户使用ATSQL2语句描述应用中时态操作，然后由TimeDB转换后形成标准SQL语句，这些标准SQL语句传输到后台关系数据库中进行实际数据的操作。TimeDB初步实现了时态查询、时态更新、时态视图和部分时态完整性约束等基本时态功能，同时也兼容非时态数据操作。 TimeDB 1.0版本由Andreas使用SICStus Prolog语言开发，运行在SWI Prolog环境中。 TimeDB 2.0版本使用Java语言开发，具有平台无关特征；基于JDBC访问数据库，可以在IBM Cloudscape、Oracle、Sybase等多种数据库管理系统之上使用；具有较友好的用户界面；优化了辅助表创建过程；具有本地调用接口TDBCI，可供Java应用程序调用以执行ATSQL2语句。 TimeDB 2.1版本开始使用Java SDK 1.4版本，支持Cloudscape 10； TimeDB 2.2版本加入了对Oracle 10g的支持。

TempDB

TempDB https://web.archive.org/web/20120130015159/http://tempdb.scholat.com/index.asp 是由汤庸教授带领的“中山大学数据库与协同实验室”（现“华南师范大学信息服务与软件技术中心”）于2002年开发研制。作为国际上第二个和国内首个支持时态数据管理的TDBMS，TempDB在逻辑上使用双时态数据模型，使用ATSQL2语言，支持电子政务、电子商务、决策支持等信息处理系统中的时态应用；同时，TempDB在技术上基于关系数据库管理系统MySQL平台、采用JAVA语言进行底层开发，具有较强的可移植性以及部署方便。