(原文发表于2006-06-28 ,修正于2006-07-03)
在DTS开发记录(序)一文中,我们已经明白了当前这个Data Transfer System的主要目标和存在的难点与挑战。在接下来的一系列的文章中,我将记录我们开发中是如何解决这些难点、如何应付这些挑战的,有的技巧或方案可能还并不成熟,所以如果你有任何想法,请留言告诉我。
本文就先从系统结构讲起。
通过我们的分析归纳,确定了该DTS系统中存在三个核心的概念,这三个核心概念建立在如下基本概念之上:
(1)源列:参与数据传递的源数据表中的列。
(2)目标列:参与数据传递的目标数据表中的列。
(3)映射列:参与了数据映射的源列或目标列。注意,并不是所有的列都会参与映射,这是常见的情况。
(4)数据管道:用于屏蔽数据源和数据目标的类型(比如不同类型的数据库、数据文件等),在数据介质与DataTable之间进行数据传递的组件。
(5)数据大纲:通俗点,实际就是某个数据库表的表结构,称之为Data Schema。但是数据大纲是独立于数据库类型的。
(6)映射项:MappingItem,一个映射项与一个目标列是1:1对应的。如果一个目标列参与了映射,那么它就能并只能携带一个MappingItem。MappingItem包含了一个或多个源列如何映射到目标列。如果MappingItem中只包含一个源列,则称之为“简单映射”;如果MappingItem中包含了多个源列,则称之为“合并映射”。
(7)连接:IConnection,一个连接表示对一个数据源或数据目标的寻址。到目前为止,有两种类型的连接,数据库连接和文件连接。
在上述基本概念的基础上,我们引出三个核心概念:
(1)数据映射:DataMapping,数据映射由一组映射项(MappingItem)组成,它包含了源数据大纲到目标数据大纲的完整映射关系。注意,数据映射与数据大纲绑定,但是并不与任何特定的数据库表绑定。这样,DataMapping可以运用在不同的数据库表上,只要数据库表结构兼容DataMapping要求的数据大纲即可。
(2)连接对:ConnectionPair,一个连接对包含了一个数据源和一个数据目标的连接信息。将连接对独立出来的好处是,当配置好一个连接对后,可以在不同的地方复用它,比如在编辑映射的时候、在数据验证的时候、在数据传送的时候等。
(3)数据传送引擎:DataTransferEngine,这是整个DTS系统的引擎部分,它基于一个连接对和一个数据映射,将数据从源表经过变换后传递到目标表。
经过以上分析,我们可以将系统分为如下几个小工具:
(1)连接管理工具:用于配置、管理所有的连接对。所有的连接对可以序列化保存于系统的配置文件中。
(2)映射编辑工具:用于在源数据大纲和目标数据大纲之间建立、修改映射关系。映射编辑工具的产物是一个数据映射DataMapping,我们可以将之序列化后存储在.mapping文件中,日后可以重新加载、打开。
(3)执行工具:用于启动执行引擎,监控数据传递过程,并记录日志。
(4)数据验证工具:基于DataMapping,验证数据源表中的数据是否满足要求的转换规则,将不满足转换规则的源数据记录下来。
(5)日志查看工具:用于查看某次数据传递任务的执行情况,比如哪些数据传递失败了、失败的原因等等。
这几个工具中,最重要的工具当属映射编辑工具和执行工具,就像DataMapping和DataTransferEngine是整个系统的核心一样。映射编辑工具的示意图如下:
图中的数据适配器用于屏蔽数据库类型和文件类型的差异;大纲提取器从指定的数据库表或文件中提取数据大纲;编辑工具在源大纲与目标大纲之间建立简单或复杂的映射关系,将结果(即DataMapping)保存在.Mapping文件中。
执行工具的示意图如下:
执行工具首先通过数据适配器将数据从数据源中提取出来,得到与数据库类型无关的数据集,.NET中的DataSet和DataTable就可以作为这种数据库类型无关的介质。图中的Data在实现中即存放于DataTable。DataTransferEngine依据数据映射指定的转换规则将数据从源DataTable经过运算、变换然后存放到目标表。然后,在通过数据适配器将目标表提交到目的数据库。
关于这个Data Transfer System结构中最主要的部分在这里粗略的说了一下,很多细微的地方都忽略了,细节会在后面的文章中补充进来。
转到:DTS开发记录(序)