資源描述:
《數(shù)據(jù)庫(kù)設(shè)計(jì)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、說(shuō)到數(shù)據(jù)庫(kù),我認(rèn)為不能不先談數(shù)據(jù)結(jié)構(gòu)。1996年,在我初入大學(xué)學(xué)習(xí)計(jì)算機(jī)編程時(shí),當(dāng)時(shí)的老師就告訴我們說(shuō):計(jì)算機(jī)程序=數(shù)據(jù)結(jié)構(gòu)+算法。盡管現(xiàn)在的程序開(kāi)發(fā)已由面向過(guò)程為主逐步過(guò)渡到面向?qū)ο鬄橹?,但我還是深深贊同8年前老師的告訴我們的公式:計(jì)算機(jī)程序=數(shù)據(jù)結(jié)構(gòu)+算法。面向?qū)ο蟮某绦蜷_(kāi)發(fā),要做的第一件事就是,先分析整個(gè)程序中需處理的數(shù)據(jù),從中提取出抽象模板,以這個(gè)抽象模板設(shè)計(jì)類,再在其中逐步添加處理其數(shù)據(jù)的函數(shù)(即算法),最后,再給類中的數(shù)據(jù)成員和函數(shù)劃分訪問(wèn)權(quán)限,從而實(shí)現(xiàn)封裝?! ?shù)據(jù)庫(kù)的最初雛形據(jù)說(shuō)源
2、自美國(guó)一個(gè)奶牛場(chǎng)的記賬薄(紙質(zhì)的,由此可見(jiàn),數(shù)據(jù)庫(kù)并不一定是存儲(chǔ)在電腦里的數(shù)據(jù)^_^),里面記錄的是該奶牛場(chǎng)的收支賬目,程序員在將其整理、錄入到電腦中時(shí)從中受到啟發(fā)。當(dāng)按照規(guī)定好的數(shù)據(jù)結(jié)構(gòu)所采集到的數(shù)據(jù)量大到一定程度后,出于程序執(zhí)行效率的考慮,程序員將其中的檢索、更新維護(hù)等功能分離出來(lái),做成單獨(dú)調(diào)用的模塊,這個(gè)模塊后來(lái)就慢慢發(fā)展、演變成現(xiàn)在我們所接觸到的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)——程序開(kāi)發(fā)中的一個(gè)重要分支?! ∠旅孢M(jìn)入正題,首先按我個(gè)人所接觸過(guò)的程序給數(shù)據(jù)庫(kù)設(shè)計(jì)人員的功底分一下類: 1、沒(méi)有系
3、統(tǒng)學(xué)習(xí)過(guò)數(shù)據(jù)結(jié)構(gòu)的程序員。這類程序員的作品往往只是他們的即興玩具,他們往往習(xí)慣只設(shè)計(jì)有限的幾個(gè)表,實(shí)現(xiàn)某類功能的數(shù)據(jù)全部塞在一個(gè)表中,各表之間幾乎毫無(wú)關(guān)聯(lián)。網(wǎng)上不少的免費(fèi)管理軟件都是這樣的東西,當(dāng)程序功能有限,數(shù)據(jù)量不多的時(shí)候,其程序運(yùn)行起來(lái)沒(méi)有什么問(wèn)題,但是如果用其管理比較重要的數(shù)據(jù),風(fēng)險(xiǎn)性非常大?! 。?、系統(tǒng)學(xué)習(xí)過(guò)數(shù)據(jù)結(jié)構(gòu),但是還沒(méi)有開(kāi)發(fā)過(guò)對(duì)程序效率要求比較高的管理軟件的程序員。這類人多半剛從學(xué)校畢業(yè)不久,他們?cè)谠O(shè)計(jì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)時(shí),嚴(yán)格按照教科書(shū)上的規(guī)定,死扣E-R圖和3NF(別灰心,所有的數(shù)
4、據(jù)庫(kù)設(shè)計(jì)高手都是從這一步開(kāi)始的)。他們的作品,對(duì)于一般的access型輕量級(jí)的管理軟件,已經(jīng)夠用。但是一旦該系統(tǒng)需要添加新功能,原有的數(shù)據(jù)庫(kù)表差不多得進(jìn)行大換血。 ?。场⒌诙惓绦騿T,在經(jīng)歷過(guò)數(shù)次程序效率的提升,以及功能升級(jí)的折騰后,終于升級(jí)成為數(shù)據(jù)庫(kù)設(shè)計(jì)的老鳥(niǎo),第一類程序員眼中的高人。這類程序員可以勝任二十個(gè)表以上的中型商業(yè)數(shù)據(jù)管理系統(tǒng)的開(kāi)發(fā)工作。他們知道該在什么樣的情況下保留一定的冗余數(shù)據(jù)來(lái)提高程序效率,而且其設(shè)計(jì)的數(shù)據(jù)庫(kù)可拓展性較好,當(dāng)用戶需要添加新功能時(shí),原有數(shù)據(jù)庫(kù)表只需做少量修改即可?!?/p>
5、 4、在經(jīng)歷過(guò)上十個(gè)類似數(shù)據(jù)庫(kù)管理軟件的重復(fù)設(shè)計(jì)后,第三類程序員中堅(jiān)持下來(lái)沒(méi)有轉(zhuǎn)行,而是希望從中找出“偷懶”竅門(mén)的有心人會(huì)慢慢覺(jué)悟,從而完成量變到質(zhì)變的轉(zhuǎn)換。他們所設(shè)計(jì)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)有一定的遠(yuǎn)見(jiàn),能夠預(yù)測(cè)到未來(lái)功能升級(jí)所需要的數(shù)據(jù),從而預(yù)先留下伏筆。這類程序員目前大多晉級(jí)成數(shù)據(jù)挖掘方面的高級(jí)軟件開(kāi)發(fā)人員?! 。?、第三類程序員或第四類程序員,在對(duì)現(xiàn)有的各家數(shù)據(jù)庫(kù)管理系統(tǒng)的原理和開(kāi)發(fā)都有一定的鉆研后,要么在其基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),要么自行開(kāi)發(fā)一套有自主版權(quán)的通用數(shù)據(jù)庫(kù)管理系統(tǒng)?! ∥覀€(gè)人正處于第三類的末
6、期,所以下面所列出的一些設(shè)計(jì)技巧只適合第二類和部分第三類數(shù)據(jù)庫(kù)設(shè)計(jì)人員?! ∫?、樹(shù)型關(guān)系的數(shù)據(jù)表 不少程序員在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候都遇到過(guò)樹(shù)型關(guān)系的數(shù)據(jù),例如常見(jiàn)的類別表,即一個(gè)大類,下面有若干個(gè)子類,某些子類又有子類這樣的情況。當(dāng)類別不確定,用戶希望可以在任意類別下添加新的子類,或者刪除某個(gè)類別和其下的所有子類,而且預(yù)計(jì)以后其數(shù)量會(huì)逐步增長(zhǎng),此時(shí)我們就會(huì)考慮用一個(gè)數(shù)據(jù)表來(lái)保存這些數(shù)據(jù)。按照教科書(shū)上的教導(dǎo),第二類程序員大概會(huì)設(shè)計(jì)出類似這樣的數(shù)據(jù)表結(jié)構(gòu):類別表_1(Type_table_1)名稱
7、 類型 約束條件 說(shuō)明type_id int 無(wú)重復(fù) 類別標(biāo)識(shí),主鍵type_name char(50)不允許為空類型名稱,不允許重復(fù)type_fatherint不允許為空該類別的父類別標(biāo)識(shí),如果是頂節(jié)點(diǎn)的話設(shè)定為某個(gè)唯一值 這樣的設(shè)計(jì)短小精悍,完全滿足3NF,而且可以滿足用戶的所有要求。是不是這樣就行呢?答案是NO!Why? 我們來(lái)估計(jì)一下用戶希望如何羅列出這個(gè)表的數(shù)據(jù)的。對(duì)用戶而言,他當(dāng)然期望按他所設(shè)定的層次關(guān)系一次羅列出所有的類別,例如這樣:總類別 類別1 類
8、別1.1 類別1.1.1 類別1.2 類別2 類別2.1 類別3 類別3.1 類別3.2 …… 看看為了實(shí)現(xiàn)這樣的列表顯示(樹(shù)的先序遍歷),要對(duì)上面的表進(jìn)行多少次檢索?注意,盡管類別1.1.1可能是在類別3.2之后添加的記錄,答案仍然是N次。這樣的效率對(duì)于少量的數(shù)據(jù)沒(méi)什么影響,但是日后類型擴(kuò)充到數(shù)十條甚至上百條記錄后,單單列一次類型就要檢索數(shù)十次該表,整個(gè)程序的運(yùn)行效率就不敢恭維了?;蛟S第二類程序員會(huì)說(shuō),那我再建一個(gè)臨時(shí)數(shù)組或臨時(shí)表,專門(mén)保