本书首次专门讨论数据库重构,向数据专业人员展示了如何运用重构、测试驱动及其他敏捷技术进行演进式数据库开发。书中通过许多实际例子,详细说明了数据库重构的过程、策略以及部署。
本书前第5章介绍了演进式数据库开发的基本思想和技术,后6章详细描述了每一类重构,包括结构、数据质量、参照完整性、架构、方法的重构;另外还描述了不属于重构范畴的转换技术。
书中的示例代码是用Java、Hibernate和Oracle代码编写的,代码都很简单,读者可毫无困难地将它们转换成C#、C++或Visual Basic代码。
演进式开发以及敏捷软件开发方法学,如极限编程(XP)、Scrum、Rational统一过程(RUP)、敏捷统一过程(AUP)和特征驱动开发(FDD),已经在过去几年中为信息技术(IT)产业带来了一场风暴。为了明确定义,演进式方法在本质上是迭代式和增量式的,敏捷方法在本质上是演进式和高度协作的。而且,像重构、结对编程、测试驱动开发(TDD)和敏捷模型驱动开发(AMDD)等敏捷技术也正在进入IT组织机构中。这些方法和技术已经形成,并在这些年里以草根的方式演进着,在实战中得到检验,而不是在象牙塔中形式化。简而言之,这些演进式开发和敏捷方法学似乎在实践中非常有效。
在Martin Fowler的开创性著作《Refactoring》中,他将重构描述为对源代码的一些小改动,这些改动会改进代码的设计,但不会改变其语义。换言之,你改进了工作的品质,但不会破坏或增加任何东西。在那本书中Martin提到,正如可以重构应用源代码一样,你也可能重构数据库schema(模式)。但是,他指出数据库重构相当困难,因为数据库中有相当程度的耦合,因此他选择不在他的书中讨论这部分内容。
自1999年《Refactoring》出版以来,我们俩发现了一些重构数据库schema的方法。开始,我们是独自工作的,在Software Development(wwwsdexpocom)等一些会议上见面,并通过邮件列表(wwwagiledataorg/feedbackhtml)交流。我们讨论一些思想,参加对方的会议报告,很快发现彼此的思想和技术有着共同之处,并且相互吻合。所以我们合作编写了本书,分享我们在通过重构演进数据库schema方面的经验和技术。
本书中的示例代码是用Java、Hibernate和Oracle编写的。对于每一类数据库重构,描述时基本上都包含了修改数据库schema的代码;对于一些更有趣的重构,我们展示了它们对Java 应用代码所产生的影响。因为各种数据库并不一样,所以我们也讨论了当数据库产品之间存在重要差别时一些替代的实现策略。有时候,我们讨论一类重构的替代实现,这类重构使用了Oracle专有的特征,如SET UNUSED或RENAME TO等命令;我们的许多代码示例也用到了Oracle 的COMMENT ON特征。有些数据库包含另外一些使数据库重构变得容易的特征,好的DBA会知道如何利用这些特征。更好的是,将来数据库重构工具会为我们完成这些事情。而且,我们尽可能使Java代码保持简单,这样读者应该能够毫无困难地将这些代码转换成C#、C++或Visual Basic代码。
为何需要演进式数据库开发
演进式数据库开发是一个适时出现的概念。不是在项目的前期试图设计数据库schema,而是在整个项目生命周期中逐步地形成它,以反映项目涉众确定的不断变化的需求。不论你是否喜欢,需求会随着项目的推进而变化。传统的方式是忽略这个基本事实并试图以各种方式来“管理变更”,这实际上是对阻止变更的一种委婉的说法。现代开发技术的实践者们选择拥抱变化,并使用一些技术,从而能够随着需求的变化演进他们的工作。程序员们采用了TDD、重构和AMDD等技术,创建了新的开发工具使这些技术变得更容易。我们实现了这些之后,意识到还需要一些技术和工具来支持演进式数据库开发。
以演进的方式进行数据库开发有以下好处:
1 将浪费减至最少。演进的、即时(JIT)的生产方式能够避免一些浪费,在串行式开发方式中,如果需求发生变化,这些浪费是不可避免的。如果后来发现某项需求不再需要,所有对详细需求、架构和设计工件方面的早期投资都会损失掉。如果有能力事先完成这部分工作,那肯定也有能力以JIT的方式来完成同样的工作。
2 避免了很多返工。在第1章将会看到,仍需要进行一些初始的建模工作,将主要问题前期想清楚,如果在项目后期才确定这些问题,可能会导致大量返工。你只是不需要很早涉及其中的细节。
3 总是知道系统可以工作。通过演进的方式,定期产生能够工作的软件,即使只是部署到一个演示环境中,它也能工作。如果每一两周就得到一个系统的可工作版本,就会大大地降低项目的风险。
4 总是知道数据库设计具有最高的品质。这就是数据库重构所关注的:每次改进一点schema设计。
5 与开发人员的工作方式一致。开发人员以演进的方式工作,如果数据专业人员希望成为现代开发团队中的有效成员,他们也需要以演进的方式工作。
6 减少了总工作量。以演进的方式工作,只需要完成今天真正需要完成的工作,没有其他工作。
演进式数据库开发也有一些不足之处:
1 存在文化上的阻碍。许多数据专业人员喜欢按串行式的方式进行软件开发,他们常持这样的观点:在编程开始之前,必须创建某种形式的详细逻辑和物理数据模型。现代方法学已经放弃了这种方式,因为它效率不高,风险较大,因此许多数据专业人员受到了冷遇。更糟糕的是,数据社区中的许多“思想领袖”是在20世纪70年代和80年代获得他们的初步经验的,但却错过了90年代的对象革命,因此没有取得演进式开发方面的经验。世界已经改变,而他们似乎没有跟着改变。读者会在本书中看到,数据专业人员不仅可能以演进的方式工作,实际上这也是比较可取的工作方式。
2 学习曲线。需要花时间来学习这些新技术,甚至需要花更多的时间将串行式的思维方式转变成演进式的思维方式。
3 工具支持还在发展之中。当《Refactoring》在1999年出版时,没有支持这一技术的工具。短短几年之后,每种集成开发环境(IDE)都内建支持代码重构的特征。在本书写作时,还没有数据库重构的工具,尽管我们在书中包含了手工实现重构所需的全部代码。幸运的是,Eclipse Data Tools Project(DTP)已经在他们的项目计划书中说明需要在Eclipse中开发数据库重构功能,所以工具厂商赶上来只是时间问题。
敏捷简介
虽然这不是一本专门讲述敏捷软件开发的图书,但实际上数据库重构是为敏捷开发者准备的主要技术。 如果一个过程满足敏捷联盟(wwwagileallianceorg)的4种价值观,它就被认为是敏捷的。这些价值观定义了一些偏好,而不是以某种方式取代另一种方式;鼓励关注特定领域,但并不排除其他领域。例如,过程和工具是重要的,但个人和他们之间的互动更重要。这4种敏捷价值观如下:
1 个人和他们之间的互动胜过过程和工具。需要考虑的最重要的因素是人以及他们如何一起工作;如果没有找对人,最好的工具和过程都会毫无用处。
2 工作的软件胜过面面俱到的文档。软件开发的主要目标是创建能工作的软件,满足项目涉众的要求。当然文档也有它的位置,编写得当的话,它能描述系统如何构建,为什么构建,以及如何利用系统工作。
3 顾客协作胜过合同谈判。只有顾客能告诉你他们想要什么。不幸的是,他们不擅长此道:他们可能缺少准确描述系统所需的技能,也可能一开始就没弄对,更糟的是,他们可能随着时间的推移而改变想法。与顾客签订合同是重要的,但合同不能代替有效的沟通。成功的IT专业人员会与他们的顾客密切协作,他们会投入一定的精力来发现顾客想要的东西,并一直教育他们的顾客。
4 响应变化胜过遵循计划。随着系统工作的推进,项目涉众对他们想要的东西的理解发生了变化,业务环境发生了变化,底层技术也发生了变化。变化是软件开发的现实,因此,你的项目计划和整体方式必须反映变化的环境,才能是有效的。
如何阅读本书
本书的大部分内容(从第6章到第11章)包含了详细描述每一类重构的参考材料。前面5章描述了演进式数据库开发的基本思想和技术,特别介绍了数据库重构。读者应该依次阅读下面的章节:
第1章“演进式数据库开发”,概述了演进式开发的基本思想和支持它的技术。综述了重构、数据库重构、数据库回归测试、通过AMDD方法进行演进式数据建模、数据库资产的配置管理,以及对独立的开发者沙盒的需求。
第2章“数据库重构”,详细地探讨了数据库重构背后的概念,以及为什么它在实践中如此困难。展示了在“简单的”单应用环境下和复杂的多应用环境下数据库重构的例子。
第3章“数据库重构过程”,描述了在简单和复杂的环境下,重构数据库schema所需的详细步骤。对于单应用数据库来说,你对环境拥有更大的控制力,因此重构schema所需的工作也要少得多。在多应用环境中,你需要支持一个转换期,在这段时间内数据库同时支持原来的schema和新的schema,让应用团队能更新他们的代码并将代码部署到生产环境中去。
第4章“部署到生产环境”,描述了将数据库重构部署到生产环境中去的过程。这在多应用环境下特别富有挑战性,因为多个团队所做的改动必须合并和测试。
第5章“数据库重构策略”,汇集了我们在这些年来发现的一些关于重构数据库schema的“最佳实践”。我们也提出了一些打算尝试但还没有机会尝试的想法。
计算机\软件工程
重构的价值是毋庸置疑的,这已在许多项目中证明了。重构能帮助软件专业人士改进系统设计及其可维护性、可扩展性和性能。本书首次介绍了专门针对数据库系统设计的强大的重构技术。
作者向读者充分展示了:对表结构、数据、存储过程和触发器的小小改动就能在很大程度上改进数据库的设计,同时又不改变语义。读者还将学到分步演进数据库模式以及源代码的方法,使依赖迭代、敏捷方法开发的项目变得更高效。
本书为数据库重构提供了全面的指导和参考,介绍了数据库重构的基本概念,帮助读者克服重构真实数据库系统时的实践障碍。通过完整的例子,作者展示了重构简单的单个数据库应用和复杂的多个应用的情况。通过本书,读者可以掌握重构数据库模式所涉及的各项任务,学习在最复杂的产品环境中部署重构的最佳实践。
本书系统介绍了5类主要的数据库重构技术。读者将看到如何利用重构来增强数据库结构、数据质量和参照完整性,以及如何对架构和方法进行重构。本书提供了大量的基于Oracle和Java的例子,读者可以很方便地调整到其他语言,如C#、C++或VB .NET,或其他数据库,如DB2、SQLServer、MySQL和Sybase。
利用本书提供的技术和例子,读者在进行数据库重构时可以减少浪费和风险,避免返工并节约成本,可以平滑地演进数据库系统,延长数据库的使用寿命。
(加)Scott W. Ambler; (美)Pramodkumar J. Sadalage 著:Scott W. Ambler国际知名的软件过程改进顾问,技术领头人,敏捷建模、敏捷数据、企业统一过程、敏捷统一过程方法学的创始人。Scott经常在SoftwareDeveloPment、JavaOne、OOPSLA和DAMA等会议上进行主题演讲,他写作(或与他人合著)出版的书还包括《Agile Modeling》、《Agile DatabaseTeehnique》、《The Obieet Primer,Third Edition》、《The Elements of UML UML2.0 Style》和《The Enter Prise Unified Process》等。 Pramod J. Sadalage Thoughtworks公司的顾问。在1999年用XP方法开发一个大型J2EE应用时,他就率先实践了演进式数据库设计和数据库重构的过程。他目前正在进行有关演进式项目中的数据库管理以及在数据库设计和管理中使用演进式过程等主题的写作和演讲。
王海鹏 等译:暂无简介
对本书的赞誉
序
前言
致谢
第1章演进式数据库开发
11数据库重构
12演进式数据库建模
13数据库回归测试
14数据库工件的配置管理
15开发者沙盒
16演进式数据库开发技术的障碍
17本章小结
第2章数据库重构
21代码重构
22数据库重构
221单应用数据库环境
222多应用数据库环境
223保持语义
23数据库重构的分类
24数据库味道
25数据库重构在开发中的位置
26使数据库schema的重构更容易
27本章小结
第3章数据库重构过程
31验证数据库重构是否合适
32选择最合适的数据库重构
33让原来的数据库schema过时
34前测试、中测试和后测试
341测试数据库schema
342检验数据迁移的有效性
343测试外部访问程序
35修改数据库schema
36迁移源数据
37重构外部访问程序
38运行回归测试
39对工作进行版本控制
310宣布此次重构
311本章小结
第4章部署到生产环境
41在沙盒之间有效地部署
42采用数据库重构包
43制定部署时间窗口进度计划
44部署系统
45移除已过时的schema
46本章小结
第5章数据库重构策略
51小的变更更容易进行
52唯一地标识每一次重构
53通过许多小变更实现一次大变更
54建立数据库配置表
55触发器优于视图或批量同步
56选择一个足够长的转换期
57简化数据库变更控制委员会策略
58简化与其他团队的协商
59封装对数据库的访问
510能够容易地建立数据库环境
511不要复制SQL
512将数据库资产置于变更控制之下
513注意机构中的政治斗争
514本章小结
515在线资源
第6章结构重构
61实现结构重构时的常见问题
62删除列
63删除表
64删除视图
65引入计算列
66引入替代键
67合并列
68合并表
69移动列
610列改名
611表改名
612视图改名
613用表取代LOB
614取代列
615用关联表取代一对多关系
616用自然键取代替代键
617拆分列
618拆分表
第7章数据质量重构
71实现数据质量重构时的常见问题
72增加查找表
73采用标准代码
74采用标准类型
75统一主键策略
76删除列约束
77删除缺省值
78删除不可空约束
79引入列约束
710引入通用格式
711引入缺省值
712使列不可空
713移动数据
714用属性标识取代类型代码
第8章参照完整性重构
81增加外键约束
82为计算列增加触发器
83删除外键约束
84引入层叠删除
85引入硬删除
86引入软删除
87为历史数据引入触发器
第9章架构重构
91增加CRUD方法
92增加镜像表
93增加读取方法
94用视图封装表
95引入计算方法
96引入索引
97引入只读表
98从数据库中移出方法
99将方法移至数据库
910用视图取代方法
911用方法取代视图
912使用正式数据源
第10章方法重构
101接口变更重构
1011增加参数
1012方法参数化
1013删除参数
1014方法改名
1015参数重排序
1016用明确的方法取代参数
102内部重构
1021合并条件表达式
1022分解条件
1023提取方法
1024引入变量
1025删除控制标记
1026消除中间人
1027参数改名
1028用表查找取代文字常量
1029用条件短语取代嵌套条件
10210拆分临时变量
10211替换算法
第11章转换
111插入数据
112引入新列
113引入新表
114引入视图
115更新数据
附录UML数据建模表示法
词汇表
参考文献和推荐读物
重构和转换列表