摘要:本文針對目前數據庫原理課程實踐教學中存在諸多弊病,設計了數據庫系統原理的UBase綜合訓練項目,該項目對于系統地鍛煉學生的實踐能力和動手能力具有一定的啟發指導作用。
關鍵詞:數據庫;UBase項目;實踐教學
中圖分類號:G642
文獻標識碼:B
文章編號:1672-5913(2008)06-0039-02
在數據庫原理課程教學中,實踐教學具有特別重要的地位。然而傳統實踐教學模式存在諸多弊病,改革勢在必行。我院在此認識的基礎上,設計了數據庫系統原理UBASE綜合訓練項目,通過完成UBASE綜合實驗進一步提高學生的實踐動手能力。
1UBase項目簡介
UBase項目是一個綜合性很強的設計開發項目,在完成整個項目的過程中將涉及到以下10門課程的相關知識,包括“數據結構”、“數據庫系統原理”、“SQL語言”、“數據庫系統實現”、“C程序設計”、“C++程序設計”、“軟件工程”、“編譯原理”和“Linux操作系統”等課程。
UBase項目引導學生掌握設計開發一個名為UBase的數據庫管理系統的方法,學生將親手開發一個單用戶、可以執行一些簡單SQL查詢的DBMS。通過該項目的實踐,可以讓學生弄明白DBMS的組成結構,也會明白執行查詢時DBMS內部究竟發生了什么?
為了幫助學生順利完成項目,在實驗開始之前,我們提前提供了UBase DBMS的最頂層和最底層模塊。最頂層模塊為解析器,用于對SQL查詢的解析并調用下層相應的功能以實施各種關系操作;最底層模塊為磁盤的I/O層,用于從磁盤讀數據頁和向磁盤寫數據頁,這里的磁盤是指UNIX文件系統。
2UBase的體系結構
UBase的體系結構如圖1所示,頂層的解析器和底層的磁盤的I/O層管理由教師提供,由學生負責完成中間的五部分。

圖1UBase的體系結構
3開發環境
UBase項目使用C++在Linux平臺下完成。編譯時在Makefile文件中加上CXXFLAGS = -g -Wall(表示打開所有警告)選項,可以讓C++在編譯時進行很多檢查,從而減少運行時錯誤。編輯工具采用vi源程序編輯器;程序編譯和連接工具選用make;編寫測試程序的腳本語言用perl;使用purify跟蹤內存錯誤的工具;使用gdb作為調試工具;使用cvs版本作為控制工具。
4UBase項目的實驗內容設計
UBase項目分為五個部分。第一部分實現緩存管理模塊,第二部分實現在頁上存儲變長記錄的類,第三部分實現堆文件,第四部分實現數據字典和一些應用工具,第五部分實現一些關系操作符。UBase項目的目標是實現一個迷你數據庫管理系統(UBase),雖然其功能遠比不上商業DBMS,但確實可以執行一些相當有用的查詢。
4.1磁盤空間管理模塊
UBase數據庫管理系統的最底層為磁盤I/O層。該模塊為UBase上層提供創建文件;刪除文件;打開文件;關閉文件;在文件中分配磁盤頁;回收文件中磁盤頁;讀文件中磁盤頁;向文件寫磁盤頁和取文件首頁頁號的功能,該模塊包括2個類:一個為文件類(class File),另一個為數據庫類(class DB)。該模塊的具體實現(源代碼)由教師提供,學生可以直接使用,但要求學生必須仔細閱讀文檔及源代碼,了解該實現的細節有助于完成項目的其他部分。
4.2緩存管理模塊
緩存管理模塊要為UBase數據庫管理系統實現一個緩存管理器。由于數據庫本身的大小通常為可用內存的100到1000倍,在特定時刻,內存中只能存放數據庫的一小部分,緩存管理器就是用來控制哪些頁應該駐留在內存中。每當UBase的上層模塊發出數據頁請求,緩存管理器必須檢查請求的頁是否已經在緩存池。如果在,緩存管理器只需簡單地返回該頁的指針;如果不在,緩存管理器要騰出一幀(如果該幀已臟,就必須先將其寫入磁盤),然后將請求的頁從磁盤讀入到內存中騰出的幀。由于緩存池通常包含上千幀(大型數據庫管理系統在內存中分配上GB的緩存)。每次頁請求都順序搜索一遍緩存池會影響性能,解決的辦法是用溢出桶散列表跟蹤每個緩存幀的狀態。
UBase項目的緩存替代策略采用給幀加Love/Hate標記的算法和時鐘算法,其效果類似LRU和MRU。
緩存管理器包含三個類:
(1) BufMgr類,緩存管理器的主類。
(2) BufHashTbl類,用來形成映射文件及頁號到緩存池幀號的散列表。
(3) BufDesc類,用來跟蹤每個緩存幀的狀態。
BufMgr類只有一個實例。BufMgr類的一個關鍵組成部分就是緩存池本身,是用幀數組實現的。BufHashTbl類也只有一個實例,該實例將是BufMgr類的一個私有數據成員。假設緩存池總共包含N個幀,則BufMgr類將擁有另外一個私有數據成員,他是由包含N個BufDesc類實例的矢量組成的。
除了以上的類和類的實例,還有一個“未釘住的”(unpinned)緩存池幀的雙向鏈表。“未釘住”是指當前沒有被數據庫管理系統上層對象使用的幀,因而是可以被緩存管理器交換出內存的犧牲品。“釘住的”(Pinned)頁是永遠不能被選中為替代對象的。這個雙向鏈表是通過把BufDesc類的所有實例鏈接在一起而實現的,指向該雙向鏈表兩端的指針是BufMgr類的私有數據成員。
4.3頁上存儲變長記錄的類
在UBbase的第二部分,要求實現一個page類。頁在數據庫中用來存放記錄,同時也是磁盤和緩存池交換數據的單位。緩存池在項目的第一部分實現,一頁可以存放1到多條變長記錄,記錄是按插槽結構存儲的。在這一部分,Page類的定義已經提供,要求學生通過代碼完成對Page類的插入、刪除、更新記錄,得到下一條記錄、當前記錄等具體操作。
4.4堆文件
UBase項目第三部分要實現一個堆文件管理器,用于提供文件的掃描功能、過濾功能(查找功能)、記錄插入功能及記錄的刪除功能等。堆文件層包括三個主要的類:FileHdrPage類,通過目錄頁(頁號的數組)實現堆文件結構;HeapFile類,實現記錄的插入和刪除功能;HeapFileScan類(從HeapFile類繼承而來),實現文件的掃描功能和過濾功能(查找功能)。
4.5數據字典和一些應用工具
項目的第四部分將實現UBase一些前端命令和數據庫應用工具,同時還要實現UBase的數據字典表的管理。為了幫助學生實現UBase前端命令,我們事先為學生提供了一個解析器來解析用戶命令和SQL命令(一個子集)。該解析器從標準輸入讀入一行命令,解析該行命令并調用適當的后臺函數進行處理。
4.6關系操作符
在UBase項目的第五部分,要實現查詢、插入和刪除操作的功能。查詢包括選擇、投影及連接算法,完成創建數據庫、新建表,查看表結構、向表中插入記錄、刪除表中的記錄、修改表中的記錄、查詢表中的記錄、刪除表結構、刪除數據庫等基本功能。
5測試程序的設計
在UBase項目的每一部分,都設計了測試程序,通過運行可執行的測試程序可以檢查學生完成目標的準確性。
6評分標準
學生完成項目的某個部分后,必須提交源代碼。實驗課教師將檢查源代碼,編譯、運行和測試程序的準確性。每部分的評分標準如表1所示:

7UBase項目的實施效果
數據庫原理UBase項目設計完成之后,考慮到本科學生實際動手能力和對知識理解深度的欠缺,先由新疆農業大學計算機與信息工程學院的6名研究生和11名本科生具體實施,完成學生用UBase系統的框架設計之后,將UBase項目作為計算機科學與技術042班和信息管理與信息系統042班共144名學生的數據庫系統原理實驗課的必修作業。現已完成教師用UBase項目的完整系統和UBase項目的實習手冊,并開設了UBase項目的學習網站和學習論壇,供學生和教師在線交流。經過一年多的實踐,UBase項目在學生中收到預期的效果,鍛煉了學生的動手能力和實踐能力,也加深了學生對相關理論知識的理解,提高了學生學習理論知識的興趣。
參考文獻
[1] 瞿中. 數據庫教學方法改革的探索與實踐[J]. 黑龍江高教研究,2006,2(142):113-114.
[2] 胡軍,夏英,王國胤. “賽課結合”在數據庫原理實踐教學中的探索[J]. 實驗室研究與探索,2007,26(12):267-269.