|
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關系模型的理論,深入程序員的心中。
it知識庫:令我難忘的DB2數據庫之路,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。