【正文】
了要執(zhí)行的操作,而且也找出了這些操作執(zhí)行的順序、執(zhí)行每步所用的算法、獲得所存儲(chǔ)數(shù)據(jù)的方式以及數(shù)據(jù)從一個(gè)操作傳遞給另一個(gè)操作的方式。最簡(jiǎn)單的情況是記錄的所有字段均為定長(zhǎng),則可以將字段連接成記錄。數(shù)據(jù)庫(kù)負(fù)責(zé)表示和存儲(chǔ)由這個(gè)定義描述的關(guān)系。 總之, MyDB 是一個(gè)基于關(guān)系代數(shù)的、用 C 實(shí)現(xiàn)的、面向教學(xué)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。所有這些數(shù)據(jù)庫(kù)的復(fù)雜性給數(shù)據(jù)庫(kù)的設(shè)計(jì)帶來(lái)很大的挑戰(zhàn)。因此,數(shù)據(jù)庫(kù)原理一般都作為計(jì)算機(jī)專業(yè)的基礎(chǔ)課程學(xué)習(xí)。 研制數(shù)據(jù)庫(kù)對(duì)于從事數(shù)據(jù)庫(kù)開(kāi)發(fā)的科研人員和教學(xué)人員是一件十分有價(jià)值的工作。當(dāng)然由于系統(tǒng)的功能和規(guī)模不一樣,其復(fù)雜程度也相差很大。而與人工智能的結(jié)合又使它獲得了新的血液。 研制 DBMS 的重要性 數(shù)據(jù)庫(kù)技術(shù)產(chǎn)生于 1970 年前后。 以上三點(diǎn)明顯地說(shuō)明了:“實(shí)踐”在數(shù)據(jù)庫(kù)原理教學(xué)中的重要性。而且這些實(shí)踐都太過(guò)理想化,完全把底層原理透明化了,這些實(shí)踐充其量只不過(guò)是對(duì) SQL語(yǔ)言熟悉而已。 C program language 目 錄 論文總頁(yè)數(shù): 24頁(yè) 1 引言 ................................................................... 5 數(shù)據(jù)庫(kù)課程教學(xué)的現(xiàn)狀 .................................................. 5 研制 DBMS的重要性 .................................................... 5 MyDB的設(shè)計(jì)目標(biāo) ....................................................... 6 2 數(shù)據(jù)庫(kù)理論 ............................................................. 6 數(shù)據(jù)元素的表示 ....................................................... 6 .............................................................. 6 .............................................................. 7 ................................................................ 7 查詢編譯器 ........................................................... 7 3 MyDB的實(shí)現(xiàn) ............................................................. 9 記錄的定義 ........................................................... 9 命令解析模塊 ........................................................ 10 詞法分析器 ...................................................... 11 語(yǔ)法分析器 ...................................................... 15 SQL語(yǔ)句的實(shí)現(xiàn) ................................................... 17 基本表模塊 .......................................................... 22 ......................................................... 22 ..................................................... 23 數(shù)據(jù)存儲(chǔ)模塊 ........................................................ 24 結(jié) 論 .................................................................... 25 參考文獻(xiàn) .................................................................. 25 致 謝 .................................................................... 27 聲 明 .................................................................... 28 1 引言 數(shù)據(jù)庫(kù)課程教學(xué)的現(xiàn)狀 現(xiàn)在數(shù)據(jù)庫(kù)教學(xué)的不足突出地表現(xiàn)在以下幾點(diǎn): 1.普遍只強(qiáng)調(diào)理論,不重視實(shí)踐,在學(xué)習(xí)過(guò)程中難以對(duì)概念深刻領(lǐng)悟,課程結(jié)束后就很快把其中許多內(nèi)容給淡忘掉了。整個(gè)系統(tǒng)是用 C 語(yǔ)言、采用模塊化的程序設(shè)計(jì)思想實(shí)現(xiàn)的。隨著各種數(shù)據(jù)獲取技術(shù)和數(shù)據(jù)庫(kù)技術(shù)的迅速發(fā)展,人們積累的數(shù)據(jù)越來(lái)越多 ,如何更加合理的管理數(shù)據(jù)顯得更加重要。小型數(shù)據(jù)庫(kù)就是模擬目前比較流行的一些大型數(shù)據(jù)庫(kù),實(shí)現(xiàn)通過(guò)在命令行輸入相應(yīng)命令來(lái)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),管理和查詢。 關(guān)鍵詞: MyDB;命令解析;數(shù)據(jù)存儲(chǔ); C 語(yǔ)言 Minidatabase Design and Implementation of Command Interpreter and Data Storage Abstract In this information era, data has been a kind of resource. With the fast development of data getting technology and database technology, people accumulate more and more data. How to manage these data more rational bee more and more important. Minidatabase is to simulate popular database at present and implement data storage, management and querying by inputting mands from mand line. This Minidatabase —— MyDB includes two modules: SQL mand parser and data storage. SQL mand parser takes in change of parsing user mands and operating tables, such as creating a table, deleting a table, inserting elements into table and updating table. The primary function of data storage module is to save and manage user data. The whole system is designed with the idea of modularized programmer and developed with C program language. Key words: MyDB 。 2.現(xiàn)有對(duì)數(shù)據(jù)庫(kù)的實(shí)踐也是流于形式,內(nèi)容膚淺與真實(shí)的數(shù)據(jù)庫(kù)管理系統(tǒng)相去甚遠(yuǎn)。 3.用真實(shí)的數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)實(shí)踐顯然要好得多。需要一個(gè)能夠真正對(duì)數(shù)據(jù)庫(kù)所學(xué)理論進(jìn)行有效的實(shí)踐的數(shù)據(jù)庫(kù)管理系統(tǒng)。它的出現(xiàn)使得計(jì)算機(jī)的應(yīng)用進(jìn)入了新的時(shí)期,社會(huì)的每個(gè)領(lǐng)域都與計(jì)算機(jī)發(fā)生了聯(lián)系。20世紀(jì) 80 年代中期數(shù)據(jù)庫(kù)技術(shù)進(jìn)入一個(gè)新的層次, 智能數(shù)據(jù)庫(kù)、演繹數(shù)據(jù)庫(kù)、專家數(shù)據(jù)庫(kù)、面向?qū)ο髷?shù)據(jù)庫(kù)、工程數(shù)據(jù)庫(kù)、多介質(zhì)數(shù)據(jù)庫(kù)、并行數(shù)據(jù)庫(kù)、實(shí)時(shí)數(shù)據(jù)庫(kù)等就是當(dāng)代數(shù)據(jù)庫(kù)研究的前沿。大一點(diǎn)的數(shù)據(jù)庫(kù)如 IMS 花費(fèi)幾千人年,系統(tǒng) R的研制花費(fèi)了 120 個(gè)專家人年以及幾千程序員 人年, SYSTEM2020 花 費(fèi) 400 人年。通過(guò)參加研制數(shù)據(jù)庫(kù)的工作,可以加深對(duì)數(shù)據(jù)庫(kù)技術(shù)的理解,弄清其來(lái)龍去脈,提高技術(shù)水平,從而改進(jìn)數(shù)據(jù)庫(kù)教學(xué)質(zhì)量。 MyDB 的設(shè)計(jì)目標(biāo) 先看看國(guó)際上有關(guān)數(shù)據(jù)庫(kù)發(fā)展的情況。 如果個(gè)人想設(shè)計(jì)并實(shí) 現(xiàn)一個(gè)商用的數(shù)據(jù)庫(kù)基本上是不可能的,復(fù)雜的技術(shù)細(xì)節(jié)會(huì)把數(shù)據(jù)庫(kù)的最基本的理論完全掩蓋。 2 數(shù)據(jù)庫(kù)理論 數(shù)據(jù)元素的表示 首先,研究一下最基本的數(shù)據(jù)元素的表示,即關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)中的屬性值的表示。既然關(guān)系是元組的集合,元組與記錄或 “結(jié)構(gòu)”( C或 C++術(shù)語(yǔ))相似,可以設(shè)想每一個(gè)元組在磁盤中作為一條記錄來(lái)存儲(chǔ)。 ? 記錄首部 當(dāng)設(shè)計(jì)記錄的格式的時(shí)候,必然會(huì)引出另一個(gè)問(wèn)題:通常在記錄中需要保存一些信息,而這些信息不是任何字段的值。 查詢編譯的開(kāi)始幾個(gè)階段如圖所示: 圖 1 查詢編譯的階段圖 1. 語(yǔ)法分析與語(yǔ)法分析樹(shù) 語(yǔ)法分析器的工作是接收用類似 SQL 這樣的語(yǔ)言編寫(xiě) 的文本并將之轉(zhuǎn)換成語(yǔ)法分析樹(shù),結(jié)點(diǎn)對(duì)應(yīng)于以下兩者之一: 1)原子:它們是詞法成分,如關(guān)鍵字(如 SELECT 等)、關(guān)系或?qū)傩缘拿?、常?shù)、括號(hào)、操作符(如 +等),以及其它成分; 2)語(yǔ)法類:即在一個(gè)查詢中起相似作用的查詢子成分所形成族的名字。然而,若該結(jié)點(diǎn) 是一個(gè)語(yǔ)法類,則其子女通過(guò)該語(yǔ)言的語(yǔ)法規(guī)則之一進(jìn)行描述。 2) Select 列表 SelList ::= Attribute , SelList SelList ::= Attribute 這兩條規(guī) 則說(shuō)明一個(gè)選擇列表可以為任何由逗號(hào)分隔的屬性列表:要么是單個(gè)屬性,要么是一個(gè)屬性、一個(gè)逗號(hào)以及一個(gè)或多個(gè)屬性的任意列表。 按照我們所描繪的語(yǔ)法,此查詢語(yǔ)句的語(yǔ)法分析樹(shù)如下所示 圖 2 語(yǔ)法分析樹(shù) 根是語(yǔ)法類 Query,任何一個(gè)查詢語(yǔ)句的語(yǔ)法樹(shù)都必然是這種情況。 在 MyDB 中,段與記錄的關(guān)系可表示如下: 記錄長(zhǎng)度 字段數(shù) 字段名 1 字段名 2 ?? 字段名 n 文件指針 字段類型 字段類型 字段類型 字段長(zhǎng)度 字段長(zhǎng)度 字段長(zhǎng)度 圖 3 段與記錄的關(guān)系 段和記錄的定義在 中實(shí)現(xiàn): 1. 段的定義: typedef struct FldInforStruct { /* 字段名 */ char fldname[10] 。 } FieldInfor_T 。 /* 字段結(jié)構(gòu)信息指針數(shù)組, 0號(hào)單元未用 */ FieldInfor_T fldinforptr[MAX_FIELD_NUM + 1]。用 SQL 語(yǔ)言編寫(xiě)的命令一般都是解釋執(zhí)行的。由于 MyDB 的各個(gè)模塊 接口是采用 C 語(yǔ)言函數(shù)調(diào)用,因此 SQL 語(yǔ)言也不可避免地要和底層模塊的接口函數(shù)打交道。 實(shí)現(xiàn)各流程的函數(shù)會(huì)在下面分別敘述。詞法分析的任務(wù)在于提取關(guān)鍵字、省略多余空格等等。 /* 字段信息指針 */ FieldInfor_T *fld 。 /* 表達(dá)式 */ char expression[30] 。 此接口參數(shù)定義了用戶命令的結(jié)構(gòu)信息,以便后來(lái)詞法分析中關(guān)鍵字及有效值的提取。 此函數(shù)用于刪除詞頭逗號(hào); ? int CountSymbol (char *S , char c) 。 /*跳過(guò)分隔符(雙引號(hào)的分隔符除外) */ while((*ScanPos len) amp。) InStr = !InStr 。amp。 (*ScanPos) ++ 。 。 } ? int GetSubstr_BetweenDelim(char *S , int *ScanPos , char Delim1 , char Delim2 , char *Substr)。 if(len == 0) { *Substr = 39。 } /*驗(yàn)明左邊的分隔符 */ while((left len) amp。 right = left + 1 。 if(S[right] != Delim2) return 0 。\039。 此函數(shù)在串 S 中掃描起點(diǎn)后,取出由合法字符集合 ValidCh 組成的 子串Substr,并且移動(dòng)掃描點(diǎn)到新的位置,用于詞法分析。 。 left = *ScanPos 。 /*復(fù)制子串 */ strncpy(Substr , amp。 。 此函數(shù)用于把命令行記錄,即分析結(jié)果清 0; ? void CallbackCmdRec (CmdRec_Type CmdRec)。 此函數(shù)用于將字段信息放入 Cmd