为什么我们需要一个时间数据库?
我正在阅读关于时间数据库的信息,看起来他们已经在时间方面build立起来 我想知道为什么我们需要这样一个模型?
与正常的RDBMS有什么不同? 我们不能有一个正常的数据库,即RDBMS,并说有一个触发器将时间戳与发生的每个事务关联起来吗? 可能会有一个性能打击。 但是我仍然怀疑市场上有强大案例的时间数据库。
目前的数据库是否支持这种function?
时间数据库有效地存储数据的时间序列,通常通过具有一些固定的时间尺度(例如秒或甚至毫秒),然后仅存储测量的数据中的改变。 RDBMS中的时间戳是每个测量的离散存储值,这是非常低效的。 时态数据库通常用于SCADA等实时监控应用程序。 一个完善的系统是来自OSISoft( http://www.osisoft.com/ )的PI数据库。
考虑你的约会/日记日记 – 从1月1日到12月31日。 现在我们可以在任何一天查询约会/日记条目的日记。 这种sorting被称为有效时间 。 但是,约会/条目通常不会按顺序插入。
假设我想知道4月4日我的日记里有什么约会/参赛作品。 那就是4月4日我日记里所有的logging。 这是交易时间 。
鉴于约会/条目可以创build和删除等。一个典型的logging有一个开始和结束的有效时间,涵盖了入境的时间和一个开始和结束的交易时间,表明该条目出现在日记期间。
日记可能经过历史修订时,这种安排是必要的。 假设在4月5日我意识到,我在2月14日的约会实际上是在2月12日发生的,即我发现我的日记中有一个错误 – 我可以纠正错误,以便纠正有效的时间图像,但是现在,在4月4日的日记中将是错误的,除非预约/logging的交易时间也被存储。 在这种情况下,如果我在4月4日查询我的日记,它将显示2月14日的预约,但如果我在4月6日查询,将会在2月12日预约。
时间数据库的这个时间旅行function使得可以logging关于如何在数据库中纠正错误的信息。 这对于真正审计数据的审计图是必要的,数据logging何时进行修改,并且允许关于数据如何随着时间被修改的查询。
大多数商业信息应该存储在这个双时态scheme中,以便提供真实的审计logging并最大化商业智能 – 因此需要在关系数据库中提供支持。 请注意,每个数据项在二维时间模型中占据(可能是无界的)正方形,这就是为什么人们经常使用GIST索引来实现双时索引。 这里的问题是,GIST索引是专门为地理数据devise的,对时态数据的要求有所不同。
PostgreSQL 9.0排除约束应该提供组织时态数据的新方法,例如事务和有效时间PERIOD不应该为同一个元组重叠。
根据我的理解(以及过度简化),时态数据库logging有关数据何时有效的事实以及数据本身,并允许您在时态方面进行查询。 你最终会处理'有效时间'和'交易时间'表,或'双时表'涉及'有效时间'和'交易时间'方面。 你应该考虑阅读这两本书之一:
- Darwen,Date和Lorentzos的“ 时间数据和关系模型 ”(绝版),
- (在一个根本不同的极端)“ 在SQL中开发面向时间的数据库应用程序 ”Richard T. Snodgrass,Morgan Kaufmann Publishers,Inc.,San Francisco,1999年7月,504 + xxiii pages,ISBN 1-55860-436- 7。 这是绝版,但在他的网站上cs.arizona.edu PDF(PDF格式)(所以谷歌search使它很容易find)。
时间数据库经常用于金融服务行业。 一个原因是你很less(如果曾经)允许删除任何数据,所以logging中的ValidFrom – ValidTotypes字段用于提供logging何时正确的指示。
除了阅读维基百科的文章 ? 维护“审计日志”或类似事务日志的数据库将具有“临时”的一些属性。 如果你需要回答关于谁对谁做了什么的问题,那么你有一个很好的候选人时间数据库。
你可以想象一个简单的时间数据库,每隔几秒就logging一下你的GPS位置。 压缩这些数据的机会很大,一个普通的数据库你需要为每一行存储一个时间戳。 如果您需要大量的吞吐量,那么了解数据是暂时的,更新和删除行将永远不会被要求允许程序降低许多在典型RDBMS中inheritance的复杂性。
尽pipe如此,时态数据通常只存储在一个正常的RDBMS中。 PostgreSQL,例如有一些时间扩展 ,这使得这一点更容易。
想到两个原因:
- 一些针对插入和只读进行了优化,可以提供戏剧性的性能改进
- 有些人比传统的SQL有更好的时间理解 – 允许按秒,分,小时等进行分组操作
只是一个更新,临时数据库即将到来的SQL Server 2016年。
要清除您为什么需要临时数据库,而不是使用自定义方法进行configuration,以及SQL Server如何高效无缝地为您configuration它,请查看Channel9.msdn上的深入video和演示: https:// channel9 .msdn.com /显示/数据曝光/时间,在-SQL服务器-2016
MSDN链接: https : //msdn.microsoft.com/en-us/library/dn935015(v=sql.130).aspx
目前在SQL Server 2016的CTP2(beta 2)发行版中,您可以使用它。
查看这个video ,了解如何在SQL Server 2016中使用Temporal Tables。
我对时态数据库的理解是为了存储某些types的时态信息。 你可以用一个标准的RDBMS来模拟,但是通过使用一个支持它的数据库,你有许多概念的内置成语,并且查询语言可以针对这些查询进行优化。
对我来说,这有点像使用GIS特定的数据库而不是RDBMS。 虽然可以在普通的RDBMS中推送坐标,但是具有适当的表示(例如,通过网格文件)可能会更快,并且具有诸如拓扑之类的SQL基元是有用的。
有学术数据库和一些商业数据库。 Timecenter有一些链接。
时间数据库有用的另一个例子是数据随时间变化的地方。 我花了几年时间为一家电力零售商工作,在那里我们存储了30分钟的时间。 那些读数可以随时修改,但是我们仍然需要回顾一下读数变化的历史。
因此,我们有了最新的阅读(我们对30分钟消费的“当前理解”),但可以回顾我们对消费的历史理解。 当你有可以用这种方式调整的数据时,数据库运行良好。
(话说回来,我们把它刻在SQL里面,但是前一阵子呢,现在不会做出这样的决定。)
除了“我能用什么新东西”之外,还可以考虑一下“什么东西统一了?”。 时态数据库表示“普通”SQL数据库的特定概括。 因此,它可能会给你一个统一的解决scheme,以前看似无关的问题。 例如:
- Web并发当你的数据库有一个允许多个用户执行标准的创build/更新/删除(CRUD)修改的Web UI时,你必须面对并发的web更改问题 。 基本上,您需要检查传入的数据修改是否不影响自用户上次看到这些logging以来已更改的任何logging。 但是,如果你有一个时间数据库,它很可能已经把每个logging的“修订版本ID”(由于难以使时间戳独特和单调上升)关联起来。 如果是这样的话,那么这就成为了在数据库更新期间防止其他用户的数据被破坏的自然的,“已经内置的”机制。
- 法律/税务logging与大多数程序员相比,法律体系(包括税收)更重视历史数据。 因此,您经常会发现有关发票模式的build议 ,并警告您要谨防删除logging或以自然方式进行规范化 – 这可能导致无法回答基本的法律问题,例如“忘记其当前地址,你把这个发票寄到2001?“ 在时间框架的基础上,所有对这些问题的诡计(他们通常只是在一个时间数据库的中间步骤)就会消失。 你只是使用最自然的模式,并在有意义时删除,知道你总是可以回头准确地回答历史问题。
另一方面,时间模型本身是完成修订控制的一半,这可以激发进一步的应用。 例如,假设你在SQL的基础上build立你自己的临时设施并允许分支,就像在修订控制系统中一样。 即使是有限的分支,也可以很容易地提供“沙盒” – 可以放弃使用和修改数据库,而不会对其他用户造成任何可见的变化。 这使得在复杂的数据库上提供高度逼真的用户培训变得非常容易。
使用简单的合并工具进行简单分支也可以简化一些常见的工作stream程问题。 例如,非营利组织可能有志愿者或低薪工作人员进行数据input。 给每个工人分配自己的分支可以使得主pipe很容易地检查他们的工作,或者在将其合并到主要分支之前加强它(例如去除重复),在那里它对于“普通”用户是可见的。 分支也可以简化权限。 如果用户只被授予使用/查看其唯一分支的权限,则不必担心防止每个可能的不需要的修改; 你只会合并那些有意义的改变。