zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。

ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。Strive,游戏引擎。sky.zhuwei@163.com
posts - 196, comments - 1329, trackbacks - 101, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

DTS开发记录(序)

Posted on 2006-06-27 19:19 zhuweisky 阅读(2917) 评论(7)  编辑 收藏 网摘 所属分类: DTS

    (原文发表于2006-06-27 ,修正于2006-07-03)
    目前手头上正在负责一个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开发记录》目录

1.DTS开发记录(1)--系统总体结构 

2.DTS开发记录(2)-- 数据管道及插件 

3.DTS开发记录(3)-- 连接与连接对 

4.DTS开发记录(4)-- 映射列 

5.DTS开发记录(5)-- 挑战增量导出 

6.DTS开发记录(6)-- 数据映射 

7.DTS开发记录(7)-- 灵活的引擎 IAgileEngine
   
8.DTS开发记录(8)-- 主键的影响

9.DTS开发记录(9)-- 数据迁移任务 DataTask

10.DTS开发记录(10)-- 可视化的流程编辑

Feedback

#1楼    回复  引用    

2006-06-27 20:00 by .progame [未注册用户]
虽然我不做这个 但我对这个挺感兴趣的 说说我的想法:

我会采用
Src->DTS Layer->Dest的架构
也就会说DTS层会有表去存储这些数据的
而对数据的转换可以在这一层上去处理,各种公式由DTS层计算,而不是由SQL语句支持,因为程序语言比SQL的功能强大太大,当然速度可能要慢

1、独立于数据库,这个我已经有自己的sqlbroker去处理了,将ansi-sql转换成native sql
2、不允许增加触发器,不允许动表结构,真的很难捕捉源数据的增量修改,除了全表扫描外还需要对全列比较,这是很麻烦的事,如果可能的话,用触发器将更新或新增的主键记录在一个单独的表是比较好的方法,抑或是用timestamp去比较也行
3、像上面说的一样,通过DTS层提供的函数去处理,比如说
A = C * (D ^2) 当然其实简单点的可能通过对DTS层存储的表进行SQL操作完成
4、这点应该可以直接给用户一个处理的方式,其实和转换的一样做,只不过源和目的地不一样而已

随便说说,见笑

#2楼    回复  引用  查看    

2006-06-27 21:46 by 我是阿呆      
mdb, dbf, sql server 的增量导出基本上弄出来了~
用笨办法全表对比扫描,幸好数据量不是非常大

#3楼    回复  引用  查看    

2006-06-28 07:56 by       
增量导出:一般用Lookup来处理。个人认为最难的是码集问题,例As400 DB2和SQL 2005就存在这个严重的问题,令人头痛!
DTS现称为ETL,好像更像SQL2005的术语,DTS是SQL2000的年代,两者差别很大。

#4楼    回复  引用  查看    

2006-06-28 13:40 by 我是阿呆      
ETL 和SQL2000 没什么关系吧,我弄db2数据仓库的时候遇到etl的




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-15 11:37 编辑过
Google站内搜索

相关文章:

相关链接: