http://zhuweisky.cnblogs.com/category/62488.html
目前手头上正在负责一个DTS(这里的DTS是Data Transfer System的缩写)系统的开发,我打算写一系列的文章来记录这个开发的全过程,这个记录可以说是实时的--每当遇到一个重要问题或解决一个重要问题,我将记录之。侯捷老师说,“发表是最好的记忆”,这一系列的文章除了权作笔记外,也希望能对后来者有所参考。
在开发任何系统之前,我们都需要弄清楚,这个系统是用来干什么的?主要职责是什么?这些需要通过需求分析得到。DTS是一个工具软件,几乎不涉及业务,所以其功能目标还是比较单纯的。我们都知道,DTS用于在两个数据库之间导入导出数据,参与数据传递的两个表(源表与目标表)的结构可能是完全不同的,但是它们之间的列与列可能存在映射关系(有的列映射可能很复杂,比如会涉及类型转换、列合并、列分裂、转换表达式等),DTS可以基于建立好的映射关系,将数据从源表向目标表传递。我大致总结了一下,DTS系统的主要功能包括:
(1)独立于数据库类型,或者说完全支持异构数据库之间的传递。(如果有新的数据库类型,则只需要添加对应的适配器插件即可)
(2)提供可视化的工具,能建立(或修改)源表结构与目的表结构之间的匹配映射关系(映射关系可以保存、加载)
(3)验证表结构映射关系的完整性、正确性
(4)基于正确完整的结构映射关系,可以实现数据从源表到目的表的导出和增量导出(暂停/继续功能、日志记录功能)
(5)能实现将源表中的某列依据指定的规则分裂成目的表中的多列。
(6)能实现将源表中的多列依据指定的规则合并成目的表中的一列。
(7)能将源列经过一定的变换(如参与某个表达式的计算得到的结果)映射到目标列。
(8)如果将源表替换为临时视图,仍能实现上述功能。(使用临时视图是为了解决多个源表对应一个目的表的问题)
(9)记录导出失败的数据,并能依据这些记录,对失败的数据进行重新导出。
(10)定时运行数据导出任务。
就目前我所了解的,这个系统的难点在于以下几个方面:
(1)独立于数据库类型是一个挑战!不同类型的数据库虽然都支持标准的SQL语句,但是它们之间的差异还是巨大的,比如,每种类型的数据库都有自己的数据类型;每种类型的数据库都有不相同的扩展;对于同一个任务(比如分页),针对不同类型的数据库都有不同的实现方式,等等。
(2)增量导出是另一个难点。如果已经导出过的数据发生的变化(更新、删除),由于我们不能修改数据源添加触发器,所以我们的系统接收不到这些事件,如何同步这些已经导出过的数据需要一种策略。
(3)列合并的合并表达式的验证都不简单。而且还要看你对表达式的支持需要到达什么样的级别,比如加减乘除、指数、对数、笛卡儿运算等等。
(4)对不满足转换规则的源数据项的处理。也许不同的任务对这样的源数据项的处理要求是不一样的,系统必须支持用户对处理方式的选择。
还有很多难点可能还没有遇到,也可能还有很多需求没有整理进来,这些会在构建系统的过程中逐步挖掘或发现,到时我会将它们列举在这里。
下面一篇文章,我将介绍这个DTS系统的主要结构。