說到數(shù)據(jù)庫,我認(rèn)為不能不先談數(shù)據(jù)結(jié)構(gòu)。1996年,在我初入大學(xué)學(xué)習(xí)計算機編程時,當(dāng)時的老師就告訴我們說:計算機程序=數(shù)據(jù)結(jié)構(gòu)+算法。盡管現(xiàn)在的程序開發(fā)已由面向過程為主逐步過渡到面向?qū)ο鬄橹鳎疫€是深深贊同8年前老師的告訴我們的公式:計算機程序=數(shù)據(jù)結(jié)構(gòu)+算法。面向?qū)ο蟮某绦蜷_發(fā),要做的第一件事就是,先分析整個程序中需處理的數(shù)據(jù),從中提取出抽象模板,以這個抽象模板設(shè)計類,再在其中逐步添加處理其數(shù)據(jù)的函數(shù)(即算法),最后,再給類中的數(shù)據(jù)成員和函數(shù)劃分訪問權(quán)限,從而實現(xiàn)封裝。
數(shù)據(jù)庫的最初雛形據(jù)說源自美國一個奶牛場的記賬薄(紙質(zhì)的,由此可見,數(shù)據(jù)庫并不一定是存儲在電腦里的數(shù)據(jù)^_^),里面記錄的是該奶牛場的收支賬目,程序員在將其整理、錄入到電腦中時從中受到啟發(fā)。當(dāng)按照規(guī)定好的數(shù)據(jù)結(jié)構(gòu)所采集到的數(shù)據(jù)量大到一定程度后,出于程序執(zhí)行效率的考慮,程序員將其中的檢索、更新維護(hù)等功能分離出來,做成單獨調(diào)用的模塊,這個模塊后來就慢慢發(fā)展、演變成現(xiàn)在我們所接觸到的數(shù)據(jù)庫管理系統(tǒng)(DBMS)——程序開發(fā)中的一個重要分支。
下面進(jìn)入正題,首先按我個人所接觸過的程序給數(shù)據(jù)庫設(shè)計人員的功底分一下類:
1、沒有系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的程序員。這類程序員的作品往往只是他們的即興玩具,他們往往習(xí)慣只設(shè)計有限的幾個表,實現(xiàn)某類功能的數(shù)據(jù)全部塞在一個表中,各表之間幾乎毫無關(guān)聯(lián)。網(wǎng)上不少的免費管理軟件都是這樣的東西,當(dāng)程序功能有限,數(shù)據(jù)量不多的時候,其程序運行起來沒有什么問題,但是如果用其管理比較重要的數(shù)據(jù),風(fēng)險性非常大。
2、系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu),但是還沒有開發(fā)過對程序效率要求比較高的管理軟件的程序員。這類人多半剛從學(xué)校畢業(yè)不久,他們在設(shè)計數(shù)據(jù)庫表結(jié)構(gòu)時,嚴(yán)格按照教科書上的規(guī)定,死扣E-R圖和3NF(別灰心,所有的數(shù)據(jù)庫設(shè)計高手都是從這一步開始的)。他們的作品,對于一般的access型輕量級的管理軟件,已經(jīng)夠用。但是一旦該系統(tǒng)需要添加新功能,原有的數(shù)據(jù)庫表差不多得進(jìn)行大換血。
3、第二類程序員,在經(jīng)歷過數(shù)次程序效率的提升,以及功能升級的折騰后,終于升級成為數(shù)據(jù)庫設(shè)計的老鳥,第一類程序員眼中的高人。這類程序員可以勝任二十個表以上的中型商業(yè)數(shù)據(jù)管理系統(tǒng)的開發(fā)工作。他們知道該在什么樣的情況下保留一定的冗余數(shù)據(jù)來提高程序效率,而且其設(shè)計的數(shù)據(jù)庫可拓展性較好,當(dāng)用戶需要添加新功能時,原有數(shù)據(jù)庫表只需做少量修改即可。
4、在經(jīng)歷過上十個類似數(shù)據(jù)庫管理軟件的重復(fù)設(shè)計后,第三類程序員中堅持下來沒有轉(zhuǎn)行,而是希望從中找出“偷懶”竅門的有心人會慢慢覺悟,從而完成量變到質(zhì)變的轉(zhuǎn)換。他們所設(shè)計的數(shù)據(jù)庫表結(jié)構(gòu)有一定的遠(yuǎn)見,能夠預(yù)測到未來功能升級所需要的數(shù)據(jù),從而預(yù)先留下伏筆。這類程序員目前大多晉級成數(shù)據(jù)挖掘方面的高級軟件開發(fā)人員。
5、第三類程序員或第四類程序員,在對現(xiàn)有的各家數(shù)據(jù)庫管理系統(tǒng)的原理和開發(fā)都有一定的鉆研后,要么在其基礎(chǔ)上進(jìn)行二次開發(fā),要么自行開發(fā)一套有自主版權(quán)的通用數(shù)據(jù)庫管理系統(tǒng)。
我個人正處于第三類的末期,所以下面所列出的一些設(shè)計技巧只適合第二類和部分第三類數(shù)據(jù)庫設(shè)計人員。同時,由于我很少碰到有興趣在這方面深鉆下去的同行,所以文中難免出現(xiàn)錯誤和遺漏,在此先行聲明,歡迎大家指正,不要藏私哦8)
一、樹型關(guān)系的數(shù)據(jù)表
不少程序員在進(jìn)行數(shù)據(jù)庫設(shè)計的時候都遇到過樹型關(guān)系的數(shù)據(jù),例如常見的類別表,即一個大類,下面有若干個子類,某些子類又有子類這樣的情況。當(dāng)類別不確定,用戶希望可以在任意類別下添加新的子類,或者刪除某個類別和其下的所有子類,而且預(yù)計以后其數(shù)量會逐步增長,此時我們就會考慮用一個數(shù)據(jù)表來保存這些數(shù)據(jù)。按照教科書上的教導(dǎo),第二類程序員大概會設(shè)計出類似這樣的數(shù)據(jù)表結(jié)構(gòu):
類別表_1(Type_table_1)
名稱 類型 約束條件 說明
type_id int 無重復(fù) 類別標(biāo)識,主鍵
type_name char(50) 不允許為空 類型名稱,不允許重復(fù)
type_father int 不允許為空 該類別的父類別標(biāo)識,如果是頂節(jié)點的話設(shè)定為某個值
數(shù)據(jù)庫的最初雛形據(jù)說源自美國一個奶牛場的記賬薄(紙質(zhì)的,由此可見,數(shù)據(jù)庫并不一定是存儲在電腦里的數(shù)據(jù)^_^),里面記錄的是該奶牛場的收支賬目,程序員在將其整理、錄入到電腦中時從中受到啟發(fā)。當(dāng)按照規(guī)定好的數(shù)據(jù)結(jié)構(gòu)所采集到的數(shù)據(jù)量大到一定程度后,出于程序執(zhí)行效率的考慮,程序員將其中的檢索、更新維護(hù)等功能分離出來,做成單獨調(diào)用的模塊,這個模塊后來就慢慢發(fā)展、演變成現(xiàn)在我們所接觸到的數(shù)據(jù)庫管理系統(tǒng)(DBMS)——程序開發(fā)中的一個重要分支。
下面進(jìn)入正題,首先按我個人所接觸過的程序給數(shù)據(jù)庫設(shè)計人員的功底分一下類:
1、沒有系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的程序員。這類程序員的作品往往只是他們的即興玩具,他們往往習(xí)慣只設(shè)計有限的幾個表,實現(xiàn)某類功能的數(shù)據(jù)全部塞在一個表中,各表之間幾乎毫無關(guān)聯(lián)。網(wǎng)上不少的免費管理軟件都是這樣的東西,當(dāng)程序功能有限,數(shù)據(jù)量不多的時候,其程序運行起來沒有什么問題,但是如果用其管理比較重要的數(shù)據(jù),風(fēng)險性非常大。
2、系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu),但是還沒有開發(fā)過對程序效率要求比較高的管理軟件的程序員。這類人多半剛從學(xué)校畢業(yè)不久,他們在設(shè)計數(shù)據(jù)庫表結(jié)構(gòu)時,嚴(yán)格按照教科書上的規(guī)定,死扣E-R圖和3NF(別灰心,所有的數(shù)據(jù)庫設(shè)計高手都是從這一步開始的)。他們的作品,對于一般的access型輕量級的管理軟件,已經(jīng)夠用。但是一旦該系統(tǒng)需要添加新功能,原有的數(shù)據(jù)庫表差不多得進(jìn)行大換血。
3、第二類程序員,在經(jīng)歷過數(shù)次程序效率的提升,以及功能升級的折騰后,終于升級成為數(shù)據(jù)庫設(shè)計的老鳥,第一類程序員眼中的高人。這類程序員可以勝任二十個表以上的中型商業(yè)數(shù)據(jù)管理系統(tǒng)的開發(fā)工作。他們知道該在什么樣的情況下保留一定的冗余數(shù)據(jù)來提高程序效率,而且其設(shè)計的數(shù)據(jù)庫可拓展性較好,當(dāng)用戶需要添加新功能時,原有數(shù)據(jù)庫表只需做少量修改即可。
4、在經(jīng)歷過上十個類似數(shù)據(jù)庫管理軟件的重復(fù)設(shè)計后,第三類程序員中堅持下來沒有轉(zhuǎn)行,而是希望從中找出“偷懶”竅門的有心人會慢慢覺悟,從而完成量變到質(zhì)變的轉(zhuǎn)換。他們所設(shè)計的數(shù)據(jù)庫表結(jié)構(gòu)有一定的遠(yuǎn)見,能夠預(yù)測到未來功能升級所需要的數(shù)據(jù),從而預(yù)先留下伏筆。這類程序員目前大多晉級成數(shù)據(jù)挖掘方面的高級軟件開發(fā)人員。
5、第三類程序員或第四類程序員,在對現(xiàn)有的各家數(shù)據(jù)庫管理系統(tǒng)的原理和開發(fā)都有一定的鉆研后,要么在其基礎(chǔ)上進(jìn)行二次開發(fā),要么自行開發(fā)一套有自主版權(quán)的通用數(shù)據(jù)庫管理系統(tǒng)。
我個人正處于第三類的末期,所以下面所列出的一些設(shè)計技巧只適合第二類和部分第三類數(shù)據(jù)庫設(shè)計人員。同時,由于我很少碰到有興趣在這方面深鉆下去的同行,所以文中難免出現(xiàn)錯誤和遺漏,在此先行聲明,歡迎大家指正,不要藏私哦8)
一、樹型關(guān)系的數(shù)據(jù)表
不少程序員在進(jìn)行數(shù)據(jù)庫設(shè)計的時候都遇到過樹型關(guān)系的數(shù)據(jù),例如常見的類別表,即一個大類,下面有若干個子類,某些子類又有子類這樣的情況。當(dāng)類別不確定,用戶希望可以在任意類別下添加新的子類,或者刪除某個類別和其下的所有子類,而且預(yù)計以后其數(shù)量會逐步增長,此時我們就會考慮用一個數(shù)據(jù)表來保存這些數(shù)據(jù)。按照教科書上的教導(dǎo),第二類程序員大概會設(shè)計出類似這樣的數(shù)據(jù)表結(jié)構(gòu):
類別表_1(Type_table_1)
名稱 類型 約束條件 說明
type_id int 無重復(fù) 類別標(biāo)識,主鍵
type_name char(50) 不允許為空 類型名稱,不允許重復(fù)
type_father int 不允許為空 該類別的父類別標(biāo)識,如果是頂節(jié)點的話設(shè)定為某個值