收集了一些资料后,我想谈谈自己这三个概念的理解,请大家指教:
首先,我认为
历史表与数据清理和备份恢复并没有直接的关系,它们的目标并不相同。下文分别进行说明。
历史表============================================
关于历史表,我们要先分析一下业务数据的类型。一般来说,业务数据可能有三种作用:
1.
业务操作执行前的准备数据,或者执行后的结果数据。比如转账前 先要
查看客户 是否有足额人民币,转账后再从 客户账户中
减去 一定数额。
2.
记录业务操作本身的数据。如操作流水。
3.主要
用于查询或统计分析、在日常操作中很少删改、且时效性要求不太高的数据。如 客户两年前的交易记录。
业务操作的准备数据和结果数据,常常会随时间越积越多,这就会使数据的存取越来越慢,影响到日常操作的即时响应。如果越早的数据使用越少,则可以把比较早的数据放到历史表中。当需要存取时,先在当前表中操作,如果当前表操作得不到结果,再到历史表中去操作。通过这种手段,可以提高日常操作的性能
操作流水之类的数据,如果有重要的审计作用而且数据量比较大,也可以采用与上相同的处理方案
这两种数据放到历史表后,即构成上文所说的第三种数据,即仅用于查询或统计分析的数据。由于历史表数据查询很多、变动很少,因此可以多用于一些索引,或采取其他的一些查询优化方案
综上所述,
历史表出于性能需求而建立,并
直接影响到程序逻辑(如存储过程,JAVA代码),对系统设计有显式的影响,因此,历史表的设计应由
开发人员负责。
数据清理=============================================
如果较早的数据允许直接丢弃,则可以将这些数据
清理掉。而且
1.多久以前的数据才可以清理,这应由软件用户决定,要在需求分析时确定
2.数据太多不清理,既会影响查询速度,也会对硬盘空间形成压力
3.历史表和当前表都应该进行数据清理。不过,如果合适的话,也可以把“转移当前部分数据到历史表”和“清理当前表”当成一步
4.数据的清理,可以通过程序逻辑直接实现,如调度线程清理持久化对象,或者在执行新业务操作时清除历史操作的数据(如在新增订单前清除最早的若干订单);也可以在日常运维时采用数据库工具定期清理
总之,数据清理跟
业务需求、
系统性能、
磁盘空间都有关系。
可以让开发人员在程序里实现这些目标,
也可以让运维人员在日常维护操作时手工进行操作
备份与恢复===========================================
备份大概有两种作用:一是保存历史数据,二是在灾难后恢复。不管是哪种,备份后的复本都
与生产系统脱钩,这就是它与历史表的区别。
我还觉得,“保存历史数据”这个功能可能用的不是很广泛,因为有以下限制:
1.数据备份后,如果可以恢复,则恢复时不能覆盖当前的数据,否则就会影响到生产。如NOTES邮件备份再导入后,当前的邮件不会丢失
2.数据备份后,如果恢复时会破坏当前数据,则数据复本必须直接可读或者可以通过其他工具阅读,否则备份后的数据就没有意义。关系数据库的备份或者数据文件虽然可以用DBMS打开,但是数据库中复杂的数据结构,必须借助客户端程序才能顺利地展现。所以利用关系数据库保存历史数据,未必是个好主意。
如果坚持要通过备份来“保存历史数据”,则可以考虑将这个功能与数据清理结合起来,也就是说,从生产系统中清除的数据,就是要保存的历史数据
一般情况下,我觉得备份
主要是用于灾难后恢复,而跟系统性能、业务需求、磁盘空间什么的都没有关系。因此它不会影响系统设计本身。因此,备份应属于
运维人员的任务。