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,导致所有的星期一都被重复计数,在表中被插入两次。幸亏负责打印表格的小伙子是个电脑爱好者,平日里喜欢向我问些电脑问题,被吹嘘得有点崇拜我,所以,在签字盖章前偷偷地告诉了我。不过,从此此君对我的教诲多持三思的态度,买来很多书一一求证,结果进步反而神速,后来甚至可以帮着我写程序了。
  王五从甲部门调到了乙部门,在程序上执行调动操作,王五果然出现在乙部门的花名册中,一应资料齐全,省却人事人员很多文案工作,获多谢数次,甚为得意。月底,人事人员向主管汇报各部门人力资源状况,主管赫然发现公司多出一人,怒而斥之。查,原来王五的阴魂还在甲部门未散,人事人员朝我翻了几下白眼,扔下一句什么破程序,还不如我自己统计呢,掩面而去。直到辞职离开,我再无脸面进人事部办公室,偶尔讨论需求,也只通过电话,或支使那个曾经崇拜我的候补程序员。
  系统越做越大,问题越来越多,有些问题,靠坑蒙拐骗已经掩盖不住了,有段时间,我几乎成了千夫所指。我虽然脸皮锻炼得有点厚了,不过还没有厚到长不出胡子来的地步,所以,知耻而后勇,一有空,我就在我的准五星级宾馆里研究数据库的设计,看各种各样的书,做各种各样的设计,比较各种各样的方案,参加各种各样的讲座,慢慢地,一些设计原则在我的头脑中形成了,虽然很不清晰。
  有了一些心得后,我很喜欢和别的程序员争论表格设计方案的优劣,有些设计,直觉告诉我会有问题,但我无法说出令人信服的理由,于是双方各执一词,脸红脖子粗,甚至不欢而散。当然,有些程序员记仇,但所有的程序员都不记这种仇,所以,三五天后,大家又会呼朋唤友物以类聚,一边吃着川菜一边继续脸红脖子粗。
  程序员都视扞卫真理为己任,只要自己认定的事,没有权威的论断,谁也不服谁。一旦起争端,或固执如石头,对手的利箭全部弹回,或优柔似棉花,敌人的拳脚尽数落空。于是,所有的争论都没有结果,这对于我来说,是件折磨人的事。我是个极端理性的人,凡事喜欢弄个明白,一二三四,有条有理,对就是对,错就是错,容不得任何问题的答案在对与错的中间地带流落,像一个非坐非站的人,半蹲着马步立在那里,无法安定。交锋多次后,我知道,凭自己的修为无法肯定什么和否定什么,更谈不上说服任何人了。
  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的东风,希望ITPUB.net能开辟一个以数据库设计为侧重点的板块,向程序员普及和推广DB2的关系模型理论,以及这一理论在实际项目上的运用原则,让有志在数据库设计领域发展的程序员们,少点把时间和精力浪费在诸如如何消除重复记录之类毫无意义的帖子上,让DB2关系模型的理论,深入程序员的心中。