V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iloveyouso
V2EX  ›  程序员

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

  •  
  •   iloveyouso · 2018-10-18 17:19:33 +08:00 · 1118 次点击
    这是一个创建于 1988 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    • 使用CREATE TABLE TMP001 AS SELECT * FORM ATABLE,但是这样我感觉效率好像不高,而且每一次都生成数据,容易导致硬盘爆炸
    • 使用 ROWNUM 来进行标识每一原始行的序号,每一个时间点都保存一下当前条件所记录的 ROWNUM。但是如果当数据行数达到了几百万的时候,是否还能保持效率?

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

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

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

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

    另外,最后说的“类似 CREATE VIEW AS 的功能,但是在创建视图之后,不再收到原有 A 表增加数据的影响”,物化视图应该是你要找的东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3597 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:40 · PVG 12:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.