时态数据库

2020-07-12 00:22:41

跳转到导航跳转到搜索时态数据库存储与时间实例相关的数据。它提供时态数据类型,存储与过去、现在和未来时间相关的信息,时态数据库可以是单时态、双时态或三时态的。

有效时间是事实在现实世界中为真的时间段。

单一时态数据库有一个时间轴,要么是有效范围,要么是系统时间范围。

时态数据库与当前数据库形成对比(不要与当前可用的数据库混淆),后者仅存储在当前时间被认为是真实的事实。

时态数据库通过提供以下一个或多个功能来支持管理和访问时态数据:[1][2]。

一种时间段数据类型,包括表示没有终点(无限或永远)的时间段的能力。

当前时间、过去或将来的时间点或持续时间内的时态查询。

随着SQL的发展及其在实际应用程序中的使用,数据库用户意识到当他们向关键字段添加日期列时,会出现一些问题。例如,如果表具有主键和某些属性,则向主键添加日期以跟踪历史更改可能会导致创建比预期更多的行。以这种方式跟踪行时,也必须以不同的方式处理删除。1992年,这个问题得到了承认,但标准数据库理论还不能解决这个问题,当时新形成的标准也不能解决这个问题。

理查德·斯诺德格拉斯在1992年提出由时态数据库社区开发SQL的时态扩展。为了响应这一提议,成立了一个委员会来设计对1992年版SQL标准(ANSI X3.135.-1992和ISO/IEC 9075:1992)的扩展;这些扩展称为TSQL2,是该委员会在1993年开发的。[3]1993年末,斯诺德格拉斯将这项工作提交给负责美国数据库语言SQL国家标准的小组,ANSI技术委员会X3H2(现在称为NCITS H2)。初步的语言规范出现在1994年3月的ACM SIGMOD记录中。根据对该规范的响应,对语言进行了更改,TSQL2语言规范的最终版本于1994年9月发布[4]。

有人试图将TSQL2的部分内容合并到新的SQL标准SQL:1999中,称为SQL3。TSQL2的部分内容包含在SQL3的新子标准ISO/IEC9075-7中,称为SQL/Temporal。[3]TSQL2方法受到了Chris Date和Hugh Darwen的严厉批评。[5]国际标准化组织负责临时支助的项目在2001年底被取消。

截至2011年12月,ISO/IEC 9075,数据库语言SQL:2011第2部分:SQL/Foundation在表定义中包含了子句,以定义应用程序时间段表(有效时间表)、系统版本化的应用程序时间段表(事务时间表)和系统版本化的应用程序时间段表(双临时表)。TSQL2建议与SQL:2011中采用的实质区别在于,SQL:2011处理中没有隐藏列,也没有新的间隔数据类型;相反,可以使用句点将两个DATE或TIMESTAMP列绑定在一起。另一个区别是用一组时间谓词替换了TSQL2中有争议的(前缀)语句修饰符。[1]。

SQL:2011标准与时态数据库相关的其他特性包括自动时间段拆分、时态主键、时态引用完整性、使用Allen区间代数的时态谓词以及时间切片和排序查询。

无名氏于1975年4月3日出生在梅德郡的儿童医院,父亲是住在斯摩维尔的无名氏杰克和无名氏简。杰克·多伊自豪地登记了他的第一个孩子的出生,时间是1975年4月4日,地点是斯摩维尔市政厅。约翰成长为一个快乐的男孩,后来成为一名优秀的学生,并于1993年以优异的成绩毕业。毕业后,他去大城独自生活。虽然他在1994年8月26日搬走了,但他忘了正式登记地址变更。只有在季节交替的时候,他的母亲才提醒他必须注册,几天后的1994年12月27日,他这样做了。虽然约翰前途无量,但他的故事以悲剧告终。无名氏在2001年4月1日被一辆卡车意外撞倒。验尸官在同一天报告了他的死亡日期。

为了将John Doe的生命存储在当前(非时态)数据库中,我们使用表Person(姓名、地址)。(为了简化起见,将name定义为Person的主键。)。

约翰的父亲于1975年4月4日正式报告了他的出生情况。在这一天,斯莫维尔的一位官员在数据库中插入了以下条目:Person(John Doe,Smallville)。请注意,日期本身并未存储在数据库中。

毕业后,约翰搬了出去,但忘了登记他的新地址。约翰在数据库中的条目直到1994年12月27日才被更改,他最终报告了这一点。一位大城官员在数据库中更新了他的地址。Person表现在包含Person(John Doe,Bigtown)。请注意,居住在Smallville的John的信息已被覆盖,因此无法再从数据库检索该信息。1994年12月28日访问数据库的官员将被告知John住在大镇。更严格地说:如果数据库管理员在1994年12月26日运行查询SELECT ADDRESS FROM Person WHERE WHERE John Doe&39;,结果将是Smallville。两天后运行相同的查询将导致Bigtown。

在他去世之前,数据库会说他住在大镇。2001年4月1日,验尸官从数据库中删除了无名氏条目。在此之后,运行上述查询将根本不返回任何结果。

有效时间是事实在现实世界中为真的时间。有效时间段可以是过去、跨越当前时间或发生在将来。

对于上面的示例,为了记录有效时间,Person表添加了两个字段,Valid-From和Valid-To。这些规定了一个人的地址在现实世界中有效的期限。1975年4月4日,约翰的父亲登记了他儿子的出生。然后,一名官员在数据库中插入了一个新条目,说明约翰从4月3日起住在斯莫尔维尔。请注意,虽然数据是在4日插入的,但数据库表示,该信息从3日起有效。该官员还不知道约翰是否或何时会搬到另一个地方,因此将Valid-To字段设置为无穷大(∞)。数据库中的条目为:

1994年12月27日,约翰报告了他自1994年8月26日以来一直住在大镇的新地址。创建一个新的数据库条目来记录此事实:

未删除原始条目Person(John Doe,Smallville,1975年4月3日,∞),但更新了Valid-To属性,以反映现在已知John已于1994年8月26日停止在Smallville居住。数据库现在包含John Doe的两个条目。

当John去世时,他在数据库中的当前条目被更新,声明John不再住在Bigtown。数据库现在看起来如下所示。

事务时间记录数据库条目被接受为正确的时间段。这将启用显示给定时间数据库状态的查询。交易时段只能发生在过去或截止到当前时间。在事务时间表中,永远不会删除记录。只能插入新记录,并通过设置事务结束时间来更新现有记录,以显示它们不再是最新的。

要在上面的示例中启用事务时间,需要向Person表添加另外两个字段:Transaction-From和Transaction-To。Transaction-From是进行事务的时间,Transaction-To是事务被取代的时间(如果事务尚未被取代,则该时间可能是无穷大)。这使该表成为双临时表。

如果存储在数据库中的人的地址不正确,会发生什么情况?假设一位官员意外输入了错误的地址或日期呢?或者,假设这个人出于某种原因谎报了他们的地址。一旦发现错误,官员们就会更新数据库,以更正记录的信息。

例如,从1995年6月1日到2000年9月3日,无名氏搬到了比奇。但为了避免支付比奇过高的居住税,他从未向当局报告过。后来在一次税务调查中,2001年2月2日发现,他在那几天实际上在比奇。为了记录这一事实,关于约翰住在Bigtown的现有条目必须被分成两个单独的记录,并插入一个新记录来记录他在Beachy的住所。然后,数据库将显示如下所示:

个人(无名氏,小镇,1975年4月3日,1994年8月26日)个人(无名氏,大镇,1994年8月26日,1995年6月1日)个人(无名氏,比奇,1995年6月1日,2000年9月3日)个人(无名氏,大镇,2000年9月3日,2000年9月3日)。

然而,这没有留下数据库曾经声称他在1995年6月1日至2000年9月3日期间住在大镇的记录。这可能是重要的知道审计的原因,或作为证据在官方的税务调查。事务时间允许在数据库中捕获这种不断变化的知识,因为条目从未被直接修改或删除。相反,每个条目都会记录其何时输入以及何时被取代(或逻辑删除)。然后,数据库内容如下所示:

个人(无名氏,小镇,1975年4月3日,∞,1975年4月4日,1994年12月27日).个人(无名氏,小镇,1975年4月3日,1994年8月26日,1994年12月27日,∞).个人(无名氏,大镇,1994年8月26日,∞,1994年12月27日,2001年2月2日).个人(无名氏,大镇,26日至8月26日,2001年2月2日).个人(无名氏,小镇,1975年4月3日,1994年12月27日,1994年12月27日).个人(无名氏,小镇,1975年4月3日,1994年8月26日,∞).个人(无名氏,大镇,1994年8月26日,2001年2月2日).个人(无名氏,小镇,1975年4月3日,1994年12月27日,1994年12月27日)。个人(无名氏,大城,2000年9月3日,∞,2001年2月2日,2001年4月1日)个人(无名氏,大城,2000年9月3日,2001年4月1日,∞).个人(无名氏,大城,2000年9月3日,2001年4月1日,2001年4月1日,∞).个人(无名氏,大城,2000年9月3日,2001年4月1日,∞).个人(无名氏,大城,2000年9月3日,2001年2月2日,∞).个人(无名氏,大镇,2000年9月3日,2001年2月2日,∞)。

这个数据库不仅记录了现实世界中发生的事情,还记录了官方在不同时间记录的事情。

判定时间是用于记录数据库条目可被接受为正确的时间的事务时间段的替代。这使得查询能够在给定时间显示官方承认的事实,即使在将这些事实提交到数据库时存在延迟。对决策时间的支持可保留整个历史记录,并防止在更新期间丢失信息。[6]。

决策时间段只能发生在过去或事务处理时间之前。与在事务时间表中一样,永远不会删除记录。只能插入新记录,并通过设置决策结束时间来更新现有记录,以显示它们不再是最新的。

要启用决策时间,需要向数据库表中再添加两个字段:Decision From和Decision To。Decision From是做出决定的时间,Decision-To是决定被取代的时间(如果尚未被取代,则可能是无穷大)。当与事务时间结合使用时,这将使该表成为一个三项临时表。

以下是1964年至1976年美国总统选举期间发生的真实事件:

假设决策时间和提交给数据库的事务时间之间有7天的持续延迟。那么在1976年选举之后,数据库的内容将是:

总裁、副总裁、有效期自、有效期至、决定自、决定至、交易自、交易至。

行政当局(林登·约翰逊,休伯特·汉弗莱,1965年1月20日,1969年1月20日,1964年11月3日,∞,1964年11月10日,∞)行政当局(理查德·尼克松,斯皮罗·阿格纽,1969年1月20日,1973年1月20日,1968年11月5日,∞,1968年11月12日,∞)行政当局(理查德·尼克松,斯皮罗·阿格纽,1973年1月20日,1977年1月20日,11月7日)行政当局(理查德·尼克松,斯皮罗·阿格纽,1973年1月20日,1977年1月20日,11月7日)行政当局(理查德·尼克松,斯皮罗·阿格纽,1973年1月20日,1977年1月20日,1968年11月5日,∞)。1977年1月20日,1972年11月7日,1973年10月10日,1973年10月17日,∞)行政当局(理查德·尼克松,斯皮罗·阿格纽,1973年1月20日,1973年10月10日,1973年10月10日,∞,1973年10月17日,∞)行政当局(理查德·尼克松,(空缺),1973年10月10日,1973年1月20日,1973年10月10日,∞,1973年10月17日,1973年12月13日)。1973年10月19日、1973年12月13日)行政当局(理查德·尼克松,1973年10月19日、1973年12月13日、1973年1月20日、1973年10月10日、1973年12月6日、1973年12月13日,∞)行政当局(理查德·尼克松,1973年10月10日、1973年12月6日、1973年12月6日、1973年12月6日、1973年12月13日、∞,1973年12月13日、∞)行政当局(理查德·尼克松,杰拉尔德·福特,∞,1973年1月20日)行政当局(理查德·尼克松,1973年10月10日,1973年12月6日,1973年12月6日)行政当局(理查德·尼克松,1973年12月13日,∞)行政当局(理查德·尼克松,杰拉尔德·福特,∞,1973年1月20日。1973年12月13日,∞)行政当局(理查德·尼克松,杰拉尔德·福特,1973年12月6日,1977年1月20日,1973年12月6日,∞,1973年12月13日,1974年8月15日)行政当局(理查德·尼克松,杰拉尔德·福特,1973年12月6日,1977年1月20日,1973年12月6日,1974年8月8日,1974年8月15日,∞)行政当局(理查德·尼克松,杰拉尔德·福特,1973年12月6日,∞)行政当局(杰拉尔德·福特,(空缺),1974年8月9日,1977年1月20日,1974年8月8日,∞,1974年8月15日,1974年12月26日)行政当局(杰拉尔德·福特,纳尔逊·洛克菲勒,∞,1977年1月20日,1974年8月20日,∞,1974年8月27日,1974年12月26日)行政当局(杰拉尔德·福特,(空缺),1974年8月9日,1977年1月20日,8日。(空缺),1974年8月9日,1974年12月19日,1974年12月19日,∞,1974年12月26日,∞)行政当局(杰拉尔德·福特,纳尔逊·洛克菲勒,∞,1977年1月20日,1974年8月20日,1974年12月19日,1974年12月26日,∞)行政(杰拉尔德·福特,纳尔逊·洛克菲勒,1974年12月19日,1977年1月20日,1974年12月19日,∞,26。1976年11月2日,∞,1976年11月9日,∞)。

考虑在1977年1月1日的有效时间内谁将担任总统和副总统的问题:

双时态模型同时包含有效时间和事务时间。这既提供了历史信息,也提供了回滚信息。历史信息(例如:约翰1992年住在哪里?)由有效时间提供。回滚(例如:1992年,数据库认为John住在哪里?)由事务时间提供。这些示例问题的答案可能不同-数据库自1992年以来可能已更改,导致查询产生不同的结果。

对于单个事实,有效时间和事务时间不必相同。例如,考虑存储有关18世纪的数据的时态数据库。这些事实的有效时间在1701年到1800年之间。事务时间将显示将事实插入数据库的时间(例如,1998年1月21日)。

一个具有挑战性的问题是在不断演变的模式下对事务时间数据库中的时态查询的支持。为了达到完美的档案质量,将数据存储在最初出现的模式版本下是至关重要的。然而,即使是最简单的重写属性值历史的临时查询也需要在每个模式版本下手动重写,可能需要数百个,就像MediaWiki[2]的情况一样,这一过程对用户来说尤其繁重。建议的解决方案是提供自动查询重写,[7][8],尽管这不是SQL或类似标准的一部分。

使用半结构化数据库/NoSQL数据库,它降低了属性数据建模的复杂性,但没有提供处理多个时间轴的功能。[9]。

要使用既能存储属性的半结构化数据又能存储时间轴的结构化数据的数据库(例如,SnowflkeDB、PostgreSQL)。

Oracle数据库管理器-Oracle Workspace Manager是Oracle数据库的一项功能,使应用程序开发人员和DBA能够管理同一数据库中数据的当前、建议和历史版本。

PostgreSQL版本9.2添加了能够实现pgFoundry临时贡献扩展的所有功能的原生范围数据类型。[11][12]PostgreSQL范围类型受到许多本地操作符和函数的支持。

Teradata提供两种产品。Teradata版本13.10和Teradata版本14在数据库中内置了基于TSQL2[13]的时态特性。

IBMDB2Version10添加了一个名为时间旅行查询的特性,该特性基于SQL:2011标准的时态功能。[1]。

Microsoft SQL Server引入了时态表作为SQL Server 2016的一项功能。微软第九频道网站上的一段视频介绍了该功能。[14]

MarkLogic在8.0版中引入了双临时数据支持。有效时间和系统时间的时间戳存储在JSON或XML文档中。[15]。

SirixDB以二进制格式非常高效地存储(当前)XML和JSON文档的快照,这要归功于一种称为滑动快照的新版本控制算法,该算法可以平衡读/写性能,并且不会产生写入峰值。本机支持时间旅行查询,并支持不同功能。

CRUX提供对从半不可变的Kafka日志中摄取的事务和文档的时间点双临时数据日志查询。文档被自动索引以创建实体-属性-值模型索引,而不需要定义模式。交易操作指定有效的有效时间。事务时间由Kafka分配,通过一致读取实现横向可伸缩性。

RecallGraph是一个建立在ArangoDB之上的时间点、单项临时(事务时间)图形数据库。它运行在ArangoDB的Foxx微服务子系统上。它在其界面的许多部分都具有类似VCS的语义,并由事务性事件跟踪器提供支持。Bitemporality被列为其发展路线图中的项目之一。

C.J.Date,休·达文,Nikos Lorentzos(2002)。时态数据与关系模型,第一版(数据管理系统中的摩根·考夫曼系列);摩根·考夫曼;第一版;422页。ISBN电话:1-55860-855-9。

乔·塞尔科(2014)。Joe Celko的SQL for Smarties:高级SQL编程(数据管理中的Morgan Kaufmann系列);Morgan Kaufmann;第5版。ISBN978-0-12-800761-7.-第12章和第35章特别讨论时间问题。

理查德·T·斯诺德格拉斯(1999)。使用SQL(PDF)开发面向时间的数据库应用程序。“摩根·考夫曼数据管理系统丛书”(4.77亿MiB);摩根·考夫曼出版社;504页;ISBN:1-55860-436-7。

^a bc kulkarni,krishna,和Jan-Eike Michels。SQL:2011";中的时态特性。ACM SIGMOD记录41.3(2012):34-43。

理查德·T·斯诺德格拉斯。";TSQL2时态查询语言";。www.cs.arizona.edu。亚利桑那大学计算机科学系。

休·达文,C.J.Date,“基于TSQL2方法的提案概述与分析”,收录于Date on Database:Writings 2000-2006,C.J.Date,Apress,2006年,第481-514页。

Mario A.Nascimento,Margaret H.Eich,“时态数据库中的决策时间”,载于“第二届国际时态表示和推理研讨会论文集”,1995年,第157-162页。

^Hyun J.Moon;Carlo A.Curino;Alin Deutsch;C.-Y.Hou&Amp;Carlo Zaniolo(2008)。在模式演化下管理和查询事务时间数据库。超大型数据库VLDB。

^Hyun J.Moon;Carlo A.Curino&;Carlo Zaniolo(2010)。具有演化模式的事务时间数据库的可伸缩体系结构和查询优化。SIGMOD。

^Paquier,Michael(2012年11月1日)。";Postgres 9.2突出显示:范围类型";。Michael Paquier-位于日本的开源开发人员。存档日期为2016-04-23。

^Katz,Jonathan S.&34;范围类型:你的生活永远不会一样。(PDF)。

^Al-Kateb,Mohammed等人。";Teradata";中的时态查询处理。EDBT/ICDT‘13 3月18-22日,

.