database-design – 只读取数据库中类似日志的表中的新行

前端之家收集整理的这篇文章主要介绍了database-design – 只读取数据库中类似日志的表中的新行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有几个服务器将行块插入关系数据库中的表中,并且一个服务器偶尔从表中读取新数据. (该表在概念上是某种日志文件 – 数据仅插入但从未修改过,读取服务器显示日志的尾部.)有没有办法让读取服务器只读取新数据?我们可以随意构建表格.

我脑海中浮现但不起作用的一些想法是:

>将行标记为已读取不适合我们的应用程序:读取服务器不应更改数据库. (写入数据库显示内容并不是一件好事,并且可能会有多个会话显示这些内容.)
>我们可以在每行填充数据库系统时间的时间戳.问题是这不是提交时间的时间戳,而是插入时间的时间戳.如果您要求数据库“在现在5分钟到现在之间给我所有值”,您就不能依赖所有存在的值,因为可能正在进行交易.您将不得不再次询问此间隔中的值,这是我想要避免的.
>我们可以插入从序列中填充的运行行数.运行事务时出现的问题与使用时间戳时相同.

有没有解决问题的方法,或者我是否必须应用一些启发式方法,例如假设最大事务时间并始终要求在“现在 – 最大事务时间”之后写入的值并读取一些数据两次?

如果重要:我们使用Oracle进行此操作.但我认为只能与其他数据库一起使用的答案也是普遍感兴趣的.

解决方法

未指定正在使用的数据库,因此不清楚是否必须将解决方案敲入现有部署.有一些队列引擎可以插入MysqL,可能会起作用.其中一个是 Q4M.一些像Oracle这样的商业数据库具有时间数据库功能,可以确定交易时间与有效时间与实时之间的关系.

使用Oracle时,伪列ora_rowscn或有用的组合scn_to_timestamp(ora_rowscn)可以有效地提供行提交时间的时间戳(发生行的SCN).或者,Oracle Workspace Manager提供版本启用表,基本上它是这样的:您在具有DBMS_WM.EnableVersioning(…)的表上启用版本控制,插入的行带有指定的aditional WMSYS.WM_PERIOD(…)字段有效时间范围,在读取器DBMS_WM.SetValidTime(…)上设置工作空间的有效范围.

您还可以通过将时间戳概念与提交时启发式进行网格划分来在一定程度上伪造此功能.这个想法只是将“有效时间”作为一个列与数据一起存储,而不是使用now()中的任意delta.换句话说,辅助时间戳列将基于提交时间的启发式指定某个未来日期(“有效时间”)一些可接受的延迟窗口(可能是标准偏差的两倍的平均提交时间).或者,使用平均提交时间的一些ceil(),(至少提交时间,但是,例如,30秒间隔).后者将有效地量化(合并?)读取日志记录的时间.它似乎没有太大的不同,但这种方式可以帮助您避免阅读冗余行.它还解决了以下问题:读取应用程序无法在不编写更多代码的情况下准确了解编写应用程序的提交时间.

猜你在找的MsSQL相关文章