鲁棒的数据库持久层设计
An AmbySoft Inc. White Paper
Scott W. Ambler
Senior Object-Oriented Consultant
AmbySoft Inc.
Material for this White Paper has been excerpted from Scott W. Ambler’s
Building Object Applications That Work
SIGS Books/Cambridge University Press, 1998,
Process Patterns
SIGS Books/Cambridge University Press, August 1998,
and the
Design of a Persistence Layer Series
Software Development, January through April 1998
http://www.ambysoft.com/persistenceLayer.pdf
This Version: August 16, 1998
Copyright 1998 Scott W. Ambler
修改履历:
1998 年 8 月 16 日:
1. 修改了一些语法和拼写的小错误。
2. 扩充了关于持久层需求的部分,在多方面都更加详细。
3. 在文中明显的标注出开发一个持久曾是异常困难的,读者最好是买一个现成的,而不是
自己开发。
4. 根据 UML1.1(Rational 版)修改了一些图
致谢
Ben Bovee, Boeing Information Services
Ian Culling, SQL Financials
Jim Comparin, SQL Financials
Klaus Shultz
译注
这篇文章我本来只是想仔细读一读,但是文章太长而自己英文水平又比较差,很担心没有耐
心读完。因此我决定动手翻译,希望在翻译的过程中可以更好的理解作者的意图。就这样,
每天回家后翻译一段,断断续续大概一个月左右才完成。囿于自己的水平,翻译的过程中发
现很多地方难以表达原作真意,只是为了不半途而废,才勉强为之。对于看我这篇译文的人
来说,这 么做大概属于很不负责任的。但 如果读者能因我的初衷而体谅我,并告诉我哪里可
以适当修改,那我简直要雀跃了。
原文中的图经过拷贝,都不再是矢量图了,所以我重新用 visio 2002 画了一遍。但因为使用
的工具不同,必定与原图有些差异。另外原文图 7 中有个小的错误,误将 DeleteCriteria 写
成了 InsertCriteria,这在译文中做了修改。
张笑猛(sum_z@263.net)
2003-1-20
目录
1 对阅读本文有帮助的一些信息......................................................................................................1
2 持久层的类型..................................................................................................................................1
3 CLASS-TYPE 体系结构................................................................................................................2
4 持久层的需求..................................................................................................................................4
5 持久层设计......................................................................................................................................7
5.1 设计概要 .................................................................................................................................7
5.1.1 PersistentObject
类
..............................................................................................................8
5.1.2 PersistentCriteria
类层次
...................................................................................................9
5.1.3
游标类
...........................................................................................................................11
5.1.4 PersistentTransaction
类
...................................................................................................11
5.1.5 PersistenceBroker
类
.........................................................................................................12
5.1.6 PersistenceMechanism
类层次
..........................................................................................13
5.1.7
映射类
...........................................................................................................................14
5.1.8 SqlStatement
类层次
.........................................................................................................16
6 持久层的实现................................................................................................................................17
6.1 购买 VS 构建..........................................................................................................................17
6.2 并发, 对象和行级锁 .............................................................................................................17
6.3 开发语言的问题....................................................................................................................18
6.4 开发计划 ...............................................................................................................................18
7 数据加载........................................................................................................................................19
7.1 传统数据加载方法................................................................................................................19
7.2 设计良好的数据加载............................................................................................................20
8 支持持久层....................................................................................................................................21
9 小结................................................................................................................................................22
10 参考书目和推荐读物................................................................................................................23
11 词汇表 .......................................................................................................................................24
12 关于作者 ...................................................................................................................................26
图目录
图 1 在业务类中硬编码 SQL.................................................................................................................1
图 2 创建对应业务类的数据类..............................................................................................................2
图 3 鲁棒的持久层..................................................................................................................................2
图 4 CLASS-TYPE 体系结构.....................................................................................................................3
图 5 持久层概要设计..............................................................................................................................8
图 6 PERSISTENTOBJECT 和 OID 类的设计.............................................................................................9
图 7 PERSISTENTCRITERIA 类层次.........................................................................................................10
图 8 游标类 ...........................................................................................................................................11
图 9 PERSISTENTTRANSACTION 类 .........................................................................................................12
图 10 PERSISTENCEBROKER 类 ..............................................................................................................13
图 11 PERSISTENCEMECHANISM 类层次................................................................................................14
图 12 CLASSMAP 组件...........................................................................................................................15
图 13 SQLSTATEMENT 类层次................................................................................................................17
图 14 传统的数据装载方法 .................................................................................................................20
图 15 具有良好设计的数据装载方法 .................................................................................................20
图 16 持久机制是如何工作的 .............................................................................................................21
表目录
表格 1 不同硬件/网络结构中 CLASS TYPE 的部署策略 ........................................................................4
表格 2 持久层的类和类层次..................................................................................................................7
表格 3 开发计划 ...................................................................................................................................19
Visit WWW.AmbySoft.com for more White Papers on Object-Oriented Development
1
在这篇被期望了很久的白皮书中,我 给 出了一个在面向对象应用中鲁棒的持久层的概要
性设计。我 已 经用不同的语言实现了这个设计的全部或者部分,换而言之,这个设计已经经
过了实践的考验。
1 对阅读本文有帮助的一些信息
Ÿ 我假设你已经阅读过我的题为 Mapping Objects to Rational Database(Ambler, 1998c)
的文章。这篇文章可以从 http://www.ambysoft.com/mappingObjects.html 免费下载。
Ÿ 通篇文章我都是使用的统一建模语言(UML)1.1 版(Rational, 1997)来表达我的
模型。
Ÿ 假设所有的属性都有访问子,也就是 getter 和 setter 方法。
Ÿ 所有的属性都是私有的。
Ÿ 在我说“类 X 的实例”的时候,实际上隐含的意思是“类 X 或者其任意一个子类
的实例”。
Ÿ 我并没有给出持久层的代码(我也不打算发布这样的代码),同时我也并未在设计
中涉及特定的语言规范的问题。但是在本文的最后,我 会讨论一些关于实现方面的
问题。
2 持久层的类型
我希望从时下持久化方面比较流行的方法开始我们的讨论。图 1 表达
了最常用的,但是也最不爽的持久化方法。在这个方法中,SQL 代码到处
出现在你的类代码中。这 样 的好处是写代码效率很高,对于小型应用程序
或者原型,这 样 是 可 行 的。缺点是直接耦合了你的业务类与关系数据库结
构(
译注:结构是我对
schema
的翻译,因为大多数情况下我们说“数据
库结构”。下文中凡是出现“数据结构”的情况,都指是
data schema
,而
不是
data structure),这意味着任何小的改变(例如对某一列重命名或者
移植到另外一种数据库)都导致原代码级的修改。
图 1在业务类中硬编码 SQL
在业务类中硬
编码 SQL,导
致代码难于维
护和扩展