我的DB2数据库之旅
大家都知道IBM的DB2是关系数据库的鼻祖,可惜呀,非科班出身的我一直没有机会接触。在数据库应用领域摸爬滚打数年后,缺乏理论指导让我吃尽了苦头。终于在机缘巧合下学到了DB2的关系模型理论,关系模型改变了我的程序人生,并在我从事的项目中留下了深深的烙印。
1. DB2的神秘王国
印象中,DB2一直和IBM的大型主机联系在一起,而大型主机对于我来说,就像小学生眼里的科学家,是权威和智慧的化身,代表着崇高而远大的理想。我在大学学的是通信专业,不过毕业后没有为中国通信事业作出过什么贡献,倒是沉迷于计算机和编程语言,凭着一本C语言教程和DOS 6.22系统调用手册,整天混迹于程序员之列,当了个滥竽充数的南郭处士。好在,我的运气比南郭处士好一些,“宣王死,闵王立,好一一听之”,南郭先生落了个“处士逃”的下场,而我在经历了几番煎炒烹炸之后,居然可以靠写程序维持生计了。
作为一个半路出家的二流程序员,除了DOS,我没有用过别的操作系统。就像微软董事会主席比尔盖茨先生说过“640K内存对任何人来说都足够用了”的话那样,我也认为DOS 6.22可以胜任任何应用领域的需求,能计算,能显示,能打印,能存盘,如果必要,还可以常驻内存,甚至通过串口通信,还有什么应用需求得不到满足呢?我非常自信,只要给我时间,我可以用C和DOS描绘整个世界!
当然,这样的自信没有维持多久,就被“DOS之外还有Unix”以及“PC之外还有大型主机”的事实击得粉碎。IBM的AS400是我最先知道的小型机,那时我正思量着跳槽,招聘广告上屡屡出现的“熟悉IBM AS400”的要求,让我隐隐觉得自己好像少了点什么,请教了几位高人后,终于知道,原来PC和AS400相比,是“小巫见大巫”最贴切的注解。从那时开始,我的嚣张气焰收敛了不少,明白了自己和真正程序员的距离,而当后来又知道AS400之上还有S/370、S/390这样的大型主机时,我终于开始夹着尾巴做人了。
我非常想学点大型主机的知识,可惜,没有这样的机会,即使有,估计人家也不敢让我动大型主机的键盘。IBM的大型主机就这样,一直保持着它的神秘性,直到今天,我依然只能从图片上,一睹它的芳颜。
和IBM大型主机一样神秘的,还有IBM的DB2数据库。这不奇怪,DB2一直伴随着大型主机而存在,虽然出过Windows版本的,但它在我眼里,还是过于高贵,除了景仰之外,不敢有其他非分之想。DB2的应用领域常在金融行业,而金融行业历来有世袭的习惯,外来者即使是一流大学计算机专业的,也轻易不能进入,何况我这样没权没势兼且非科班出身的二流大学的毕业生。所以,我的数据库经验中,只有dBase、FoxBase、FoxPro,Oracle,Sybase,没有DB2的任何痕迹。
2. 我最初的数据库经历
dBase是我接触的第一个数据库管理系统,具体版本好像是dBase III吧。忘了是大几了,只记得大家手持散发着油墨香味的操作手册,在从计算机系借来的机房里面,一字排开,老师在上面声嘶力竭地吼着操作指令,下面的我们紧张地按着键盘,两根中指(也有单手的,只用一根)在键盘上走走停停,脸色因为兴奋和机房的温度而泛着潮红,双眼在键盘和屏幕上来回移动,单色显示器发出的荧光,从眼球或者镜片上反射出来,使我们看上去像一群两眼发绿的饿狼,如饥似渴地撕咬着尖端科技的猎物。
我有没有在具体项目上运用过Dbase III,已经无从考证了,即使用过,我相信也不超过一个项目,因为我参加工作不过半年,就开始移情别恋到FoxBase了。那是一个数据库应用项目,我以兼职程序员的身份,被我的学长雇佣,在工作日的晚上和周六周日全天,骑50分钟单车,赶到他只有一间房子的公司里打第二份工,全然不顾我还是某保密的军品研发项目的成员,为着几个铜钱,不惜耽误国防科技事业的进步。
FoxBase让我领略了数据库的魅力,我用FoxBase开发的程序不下20个,大到工资和人事管理系统,小到资产负债表的汇总打印。Windows 3.1开始流行后,FoxPro成为主流的数据库,界面改变了,不过核心是一样的。那段时间,我有非常优越的学习环境,一个人独占一间电脑室,比董事长的还大,里面设备齐全,电脑、网络、打印机、UPS电源、空调、防静电地板等等,要什么有什么,最匪夷所思的是,居然还有带浴缸的独立卫生间,如果再加上一张床,就是五星级宾馆了。
这些其实都是电脑的待遇,我只不过沾了电脑的光罢了。动辄数万的电脑,那时是单位里除总经理之外,最娇贵的物品,而作为程序员的我,被几十岁的资深老会计称呼为某工,自尊心也受到了前所未有的满足。
有一台386的机器,配置相当高,20M硬盘,1M内存,是我的至爱。当旧程序不出问题,又没有新程序要开发时,我的全部时光,就消耗在这台电脑上了。拿出我珍藏的3M软盘,里面有Windows 3.1的安装程序,总共好像包括12片软盘吧。安装每次Windows我都郑重其事,将安装盘放在右手边,按顺序排好,用过后的放到左手边,一丝不苟,如果条件允许,我都想沐浴更衣后,焚上一拄香,才行安装之事。
那时的数据库管理系统都很小,我那20M的硬盘,除了容纳Windows 3.1以外,还有足够的空间让我安装FOXBASE。我整天整夜地呆在电脑室里,徜徉于数据库的广阔天地,以至于经理都被我感动了,在部门例会上三番五次表扬我的敬业精神,并且不忘在下班前和蔼地叮嘱我早点休息,完全不知道我除了编程序外,其实还顺便享受了免费的空调。
3. 数据一致性的惨痛教训
我开发的程序绝大多数是基于数据库的,由于开发和维护都是我一手把持,所以,如何让自己变得轻松一点,成了我绞尽脑汁尝试各种数据库设计方案的动力所在。不是我有自虐的嗜好,实在是忍受不了程序设计问题导致的数据不一致所带来的打击。写过数据库程序的人都知道,没有比数据不一致更让人痛苦的事了。
这张表显示张三某天请假被扣了全勤奖,可那张表上却死活找不到请假记录,找来签到本一核对,张三其实真的没有请假,新来的录入员小姑娘,录入了一条张三请假的错误记录,然后又自行删除了,可是电脑不愿意将扣掉的全勤奖补回来。我不思改程序,反出一条例,称此类“异常操作”应立即知会电脑部,不得擅做主张云云。
上个星期所有人都多上了一天班,最多的是李四,连加班在内,上了八天班,可所有日历上都没有星期八,费九牛二虎之力找到那段代码,发现一个循环初值应该为1,而不是0,导致所有的星期一都被重复计数,在表中被插入两次。幸亏负责打印表格的小伙子是个电脑爱好者,平日里喜欢向我问些电脑问题,被吹嘘得有点崇拜我,所以,在签字盖章前偷偷地告诉了我。不过,从此此君对我的教诲多持“三思”的态度,买来很多书一一求证,结果进步反而神速,后来甚至可以帮着我写程序了。
王五从甲部门调到了乙部门,在程序上执行“调动”操作,王五果然出现在乙部门的花名册中,一应资料齐全,省却人事人员很多文案工作,获“多谢”数次,甚为得意。月底,人事人员向主管汇报各部门人力资源状况,主管赫然发现公司多出一人,怒而斥之。查,原来王五的阴魂还在甲部门未散,人事人员朝我翻了几下白眼,扔下一句“什么破程序,还不如我自己统计呢”,掩面而去。直到辞职离开,我再无脸面进人事部办公室,偶尔讨论需求,也只通过电话,或支使那个曾经崇拜我的候补程序员。
系统越做越大,问题越来越多,有些问题,靠坑蒙拐骗已经掩盖不住了,有段时间,我几乎成了千夫所指。我虽然脸皮锻炼得有点厚了,不过还没有厚到长不出胡子来的地步,所以,知耻而后勇,一有空,我就在我的准五星级宾馆里研究数据库的设计,看各种各样的书,做各种各样的设计,比较各种各样的方案,参加各种各样的讲座,慢慢地,一些设计原则在我的头脑中形成了,虽然很不清晰。
有了一些心得后,我很喜欢和别的程序员争论表格设计方案的优劣,有些设计,直觉告诉我会有问题,但我无法说出令人信服的理由,于是双方各执一词,脸红脖子粗,甚至不欢而散。当然,有些程序员记仇,但所有的程序员都不记这种仇,所以,三五天后,大家又会呼朋唤友物以类聚,一边吃着川菜一边继续脸红脖子粗。
程序员都视�I卫真理为己任,只要自己认定的事,没有权威的论断,谁也不服谁。一旦起争端,或固执如石头,对手的利箭全部弹回,或优柔似棉花,敌人的拳脚尽数落空。于是,所有的争论都没有结果,这对于我来说,是件折磨人的事。我是个极端理性的人,凡事喜欢弄个明白,一二三四,有条有理,对就是对,错就是错,容不得任何问题的答案在对与错的中间地带流落,像一个非坐非站的人,半蹲着马步立在那里,无法安定。交锋多次后,我知道,凭自己的修为无法肯定什么和否定什么,更谈不上说服任何人了。
4. DB2的关系模型理论
显然,要想赢得争论,我需要一个权威的理论来支持我,因此,当我读到DB2的关系数据库模型时,我照例用我的问题去拷问它,试图将它打倒。很多理论被打倒了,但这次,DB2的关系模型没有倒下。
忘了是如何搞到那份介绍DB2关系模型的文章的了,不过我印象深刻的是,那是一份制作精美的PowerPoint文档,可能是某大学教授的讲义,或是IBM培训教材的中文版,总之,是一份非常优秀的文档,既有理论,也有例子,深入浅出,很快就带我跨入了关系数据库的门槛。
最吸引我的,是DB2的关系模型。关系模型,是现代关系数据库系统的理论基础,是一个伟大的数学模型。数学是人类抽象思维的最高境界,我对数学的崇拜,从读研开始。我有一个学应用数学的舍友,我经常向他请教一些问题,讨论到最后,剥去无关紧要的细枝末节和千变万化的表面现象,问题的本质往往归结为一个数学命题,而晦涩的数学专着里,大师们早已用聊聊数语为我准备了的答案。
数学之难学,往往不是数学本身的深奥,而是数学着作的写作方式太过专业,其实如果能够结合一些具体的应用去举例说明,我的数学也许不会现在这么差。带着问题去学数学,是更适合于我的方式,只要将定理中字里行间隐藏的意思,联系到应用中,很快就能心领神会。
那篇介绍DB2关系模型的文档,正是用这样的风格来写作的,所以让我产生了相见恨晚的感觉。先介绍一个概念,让你去琢磨,然后举几个例子,作进一步的阐述,一来二去,作者想要告诉你的,你不知不觉中全盘接受了。
但凡是这类文章,绝对不能走马观花,一目十行,否则,可能会漏掉一些至关重要的信息。碰到新的概念或定理,别急着翻看后面的例子,先回想一下应用中让你郁闷的难题,尝试自己去理解,实在参不透了,才在例子中寻找思维的线索。我利用所有的空闲,反复阅读、研磨那份文档。大部分时间,我都在对着文档发呆,双手托腮,面无表情,脑子却飞快运转,像一台CPU使用率达到100%的Windows电脑,停止了对鼠标和键盘的响应。如此这般一个多月,关系模型的理论,在我心中逐渐生根、发芽,并开始开花结果。每一段论述,都能解开郁结于心中的谜团,那种豁然开朗的感觉,如同醍醐灌顶。
我第一次认识了Codd这个名字,油然而生对大师的敬意,并且将1970年烙在了记忆深处。这是数据库历史上划时代的一年,IBM公司的研究员E.F.Codd发表了业界第一篇关于关系数据库理论的论文“A Relational Model of Data for Large Shared Data Banks”,首次提出了关系模型的概念。这篇论文是计算机科学史上最重要的论文之一,也奠定了Codd 博士“关系数据库之父”的地位。
DB2的关系模型,是广东人的老火功夫汤。十几种材料,十几个小时,最后煲出来,也就那么小小几碗,味道之鲜美,让人“过齿不忘”。我一直怀疑那位PowerPoint文档的作者是广东人,并且长于煲汤。Codd博士提供的材料原汁原味,PowerPoint文档作者又厨艺精湛,方才煲出DB2关系模型这份影响我一生的文档。
5. 关系模型改变了我
关系模型是一本武功秘笈,打通了我的任督二脉,那一个多月的闭门修炼,让我的功力大有长进。我开始把自己想象成一个获得师傅真传的武林弟子,怀揣关系模型的内功心诀,走出山门,要去闯荡江湖了。我非常急切地想要获得一份DB2的拷贝,一试身手,可惜,动用了所有渠道,还是未能如愿。DB2只存在于银行的大型主机中,像紫禁城里的大内高手,非我等凡夫俗子可以与之切搓。若想一睹英雄风采,好像只有引刀自宫做太监一条路了。
好在那时候关系模型已经成为大型数据库的理论基础,除DB2以外,还有诸如Oracle、Sybase、SQL Server等以关系模型为核心的关系型数据库管理系统,所以,我没有做太监,仍然获得了与高手过招的机会。我的一些朋友任职的公司,购买了正版的大型数据库,整箱整箱的英文资料,摆在书架上,落满了尘土。买正版数据库的,通常都是关键应用,容不得任何差错,因此,一般都会一同购买技术支持服务,所以,出了问题一律有技术支持可以依靠,维护人员就都懒得去啃这些大部头的蝌蚪文了。这些被人遗弃的废纸,我却如获至宝,因为偶然翻看,竟然发现那里面有关于关系模型的精彩论述。我提出要借来一读,朋友们欣然允诺,仿佛我是收废品的阿叔,帮他们弄走了一堆垃圾,以至于有些书像肉包子打狗,一去无回,他们也都装作不知道了。
有将近一年多,因为某种关系,我周末一般要到另外一个城市去度过。周六中午下班,搭上长途车,三、四个小时的颠簸后,才能到达目的地。上车前,我必随身带一本借来的大部头,车上的时光正好睡个午觉,下车后将书掏出来拿在手里,擦干嘴角因为睡觉残留的印记,再用手指梳理出一个三七分头,装作三好学生的模样,混入旁边的一所大学。或许是大部头的欺骗性外表,或许是我的伪装术着实了得,反正每次都在保安的眼皮子底下偷渡成功。大学校园是最适合修身养性的地方,我随便找个角落,或坐或卧或半躺,翻开大部头,在徐徐清风的熏陶下,很快便能进入忘我的境界。
这段经历,养成了我几个嗜好。第一,坐车爱打瞌睡,并因此丢失过一个提包、两只运动鞋和三把钥匙;第二,没事喜欢混入大学校园,看书,上网或者仅仅是发呆;第三,有英文资料和中文资料,则多半会看英文的;第四,做设计时抛不开数据库,凡是能用数据库实现的,决不做他想。当然,还有一点,那就是我现在一直都梳三七分头,以便使自己看上去显得文化些。
可以毫不夸张地说,DB2的关系模型,改变了我的程序人生,从此以后,我的所有设计,都无一例外地烙上了关系模型的烙印。DB2的关系模型是一套革命性的理论,从1970年出世到现在,整整37年过去了,在数据库领域,还没有可以取代关系模型的学说出现。我作为一个程序员成长的过程中,管理信息系统在中国遍地开花,我的大部分经验,都集中在这个一日千里的领域里。现在,MIS已经演变为ERP、CRM,不过,DB2关系模型的核心地位,依然稳如磐石,不管作为关系模型具体实现的RDBMS市场如何风云变幻,也不管Codd博士已经在4年前与世长辞,DB2关系模型思想的光芒,一直照亮着数据库的夜空。
6. DB2迈向平民
在本文就要结束时,来自db2china的一条消息让我颇感意外,DB2有免费版本可以下载了,称为DB2 Express_C。呵呵,虽然来得有点迟,不过,大名鼎鼎的DB2终于走出深宫,迈向平民,始终是值得庆贺的一件大事。
我一直很留意程序员对数据库技术的讨论,时常光顾ITPUB.net,看看数据库板块的帖子。数据库板块是ITPUB.net非常活跃的一个分支,从安装、配置、管理、维护、调优到开发、认证、培训和专题讨论等,内容不可谓不丰富,可惜,美中不足的是,关于数据库设计方面的帖子不多。
其实,早年我也非常迷恋DBA的角色,能将复杂的数据库系统玩弄于股掌之中,被我视为数据库修为的最高境界。后来,经历的项目多了,发现项目的成败,设计举足轻重,而具体的数据库系统,反倒无关紧要了。其实所有的数据库都是大同小异的,因此,我对具体数据库系统的关注日渐淡漠,兴趣开始转向所有数据库应用系统都要面临的设计问题。再好的数据库系统也无法挽救拙劣的设计,而良好的设计在任何数据库系统上都会有上佳表现。数据库设计的基础不是具体的RDBMS,而是RDBMS的灵魂,即DB2的关系模型,要想在数据库设计上有所作为,除了精通DB2的关系模型理论,别无他法。
现在,DB2来了,带着Codd的关系模型理论,让我们终于有机会溯本追源,一探关系模型的正宗源头。借着DB2的东风,希望51cto能开辟一个以数据库设计为侧重点的板块,向程序员普及和推广DB2的关系模型理论,以及这一理论在实际项目上的运用原则,让有志在数据库设计领域发展的程序员们,少点把时间和精力浪费在诸如“如何消除重复记录”之类毫无意义的帖子上,让DB2关系模型的理论,深入程序员的心中。
文章出自bbs.dbfen.com 转载请注明