1)建立一个新表作为保存捕获的数据表使用,其中字段有“原主键”、“修改后主键”、及其他需要的字段,称为“合同捕获表”。
2)在原合同表Delete和Update时分别建立触发器,当删除操作发生时,建在Delete上的触发器会插入一条记录到“合同捕获表”,其中“修改后主键”字段为空,表示该记录是删除的记录;当发生更新时,将“原主键”、“修改后主键”及其他需要记录的字段都保存入“合同捕获表”中,表示该记录被修改过,如果“原主键”和“修改后主键”不同,则表示主键被修改,如果相同,则表示主键没有被修改。
3)由于操作系统中的主键通常会成为数据仓库中事实表的退化维度,可能仍会起主键的作用。所以在数据加载时,需要分情况判断“合同捕获表”的数据来决定是否更新事实表中的退化维度。
可以说,这样的基于触发器的变化数据捕获方法并不是一个很好的选择。首先这需要对源系统有较大的权限;其次,触发器会给源系统的性能带来很大的影响。所以除非是没有别的选择,否则不建议采用这种方法。
而对于这样的情况,我们在建立操作型数据库系统时完全可以避免。下面是对操作型数据库系统建立者的几点建议:1)操作型系统的主键不要建立成智能型的,至少不要建立成会变化的。2)操作型系统的表中需要加入操作人和操作时间字段,或者直接加入时间戳。3)操作型系统中操作型数据最好不要直接在原值上修改,可以采用“冲红”的方式加入新的记录。这样后续建立数据仓库时就不需要考虑事实表数据的变化问题。
最后,期待各大数据库管理系统的厂商能尽快在DBMS层提供功能强大、简单好用的变化数据捕获功能,目前Oracle已经有了这个功能。毕竟技术方面复杂的事情留给厂商做是一个趋势,而我们做应用的则更关注于业务。
从目前的数据库及数据仓库建模方法来说,主要分为四类。
文章来源于领测软件测试网 https://www.ltesting.net/