数据库是否有保存某表当前所有数据作为新表,且保存之后新表不受后面数据变动的影响的功能?

2018-10-18 17:19:33 +08:00
 iloveyouso

假设有一个数据库表:A 表,该表每时每刻都会产生数据,且该表没有主键来标识唯一性,也没有时间等可以标识范围的列,数据只有增加没有删除。
那么问题来了:

  1. 如果用户需要查看一天某一个小时点A 表的状态(即一天 24 小时每一个小时整点时的状态),应该如何最大效率地进行回溯查询?
  2. 如果用户还需要对 A 表数据进行条件过滤,并查看某一个小时点该过滤条件下 A 表的状态,那这个又应该如何去查询呢?

不考虑 A 表为什么这么设计,也不考虑分库分表以及 A 表查询效率等问题,只考虑如何最大效率地保存 A 表每个小时点的快照,任意一个数据库(postgre,mysql,oracle 都可以)

我目前想到的解决方案如下:

除了以上解决方案,我想问一下数据库有没有一种类似 CREATE VIEW AS 的功能,但是在创建视图之后,不再收到原有 A 表增加数据的影响。这个功能点不知道大家有没有遇到过,求解,谢谢!

1129 次点击
所在节点    程序员
5 条回复
saulshao
2018-10-18 17:33:37 +08:00
我见过一个应用系统有类似的功能,但是是由应用程序实现的。
简单地说就是对于某个表进行写操作之前,把需要写的行 insert 到一个和源表对应的历史表中。
opengps
2018-10-19 08:43:11 +08:00
select * into tableYYYYMMDDHH from table
nekoneko
2018-10-19 08:58:51 +08:00
google or baidu:数据库分表
loveCoding
2018-10-19 09:26:32 +08:00
就是二楼说的按时间分表吧
Aksura
2018-10-22 17:22:49 +08:00
@iloveyouso 既然需求要查询历史整点数据,那么从这个 A 表里周期性地保存出数据就不可避免。担心硬盘爆炸,就划定一个历史数据的保留时间窗口,超出窗口外的数据,要么归档另存他处,要么删除。

方案一每次查询都新建表,个人感觉没必要,表的数量很容易就膨胀了,用一个分区表保存历史就可以了。保存历史数据的表除了具有 A 表的字段外,再加标识查询时间的字段。还可按年、月之类的做表分区。考虑到 A 表是“只有增加,没有删除”这个特点,整点查询 A 表数据到历史表时,如果是 Oracle 可以考虑用 Merge 语句代替单纯的 Insert 语句。

主要问题还是A表没有主键,也没有其他唯一性的标志或时间字段,如何高效地判断哪些数据行是新增数据感觉不好做。

另外,最后说的“类似 CREATE VIEW AS 的功能,但是在创建视图之后,不再收到原有 A 表增加数据的影响”,物化视图应该是你要找的东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/498858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX