呂春利,夏若塵,孫瑞志
(1.中國農業大學 信息與電氣工程學院,北京; 2.中國農業大學煙臺研究院,山東 煙臺)
數據庫原理與實踐是計算機課程學習的一門核心專業課程,旨在通過SQL結構化查詢語言的教學培養學生的數據管理與查詢能力。隨著數據科學的發展,許多大學都在MOOCs平臺上開設了該門課程。但作為一門重實踐練習的課程,MOOCs交互水平低的不利條件使得該課程難以達到理想的教學效果[1-2]。自動測評系統的應用可以彌補這一不足之處。
語義篩查和結果比對是自動測評的兩大實現方式[3]。語義篩查需要根據學科特征構建完整的語義樹,搭建過程較為復雜。鑒于SQL語言是一種非過程化編程語言,編寫十分靈活,以往的大多數自動測評系統都采用了結果對比方式,但都存在學生錯誤答案沒有及時的修改反饋的問題[4-6]。除此之外,由于SQL語句增刪改部分的練習會對預設的數據庫數據做出改動,為維持長久使用,需對數據進行恢復。現有的自動測評系統也缺少該部分的設計[7-8]。本文針對以上不足,基于存儲過程設計了反饋方案和恢復方案,并采用Moodle平臺構建了一個即登即用的在線測評系統和題庫,極大地提高了數據庫原理與實踐的教學效率。
本系統除了可以實現學生SQL代碼正誤評判外,還可以詳細提示學生代碼中存在的錯誤。詳細的錯誤信息包含以下類別:(1)語法錯誤;(2)字段缺失或字段多余;(3)記錄缺失或記錄多余。語法錯誤的 SQL 語句無法被后臺數據庫所執行,本系統將后臺數據庫提供的錯誤信息返回到前臺。當學生代碼的語法正確時,仍然可能出現以上(2)(3)所述情況。學生在自行創建數據庫進行練習時容易忽視這類問題。借助本系統,學生可以很方便發現自己代碼結果中存在的缺陷,并及時進行改正。
由于增刪改部分的題目在執行后會改動數據庫數據,影響其他查詢題目和后續同學的使用,因此要對表單做恢復處理。以往的部分系統設計種采用回滾操作執行此操作,但MySQL rollback回滾函數僅能在未commit之前提交,因此需要關閉autocommit,對每項事務進行手動提交之后再次回滾。而整個課程體系的題庫都采用同一個數據庫,關閉autocommit會加倍出題工作量和代碼執行效率。因此本文采用存儲過程加刷新備份表單的方式解決增刪改部分題目的數據恢復。
在此之前已開發的系統均為單一課程系統,只能供數據庫原理與實踐這一門課使用,無法與其他課程的資源合并到同一個平臺,不利于學校或者教育機構管理及維護網站,而且其中的題目排列,更新及進度安排無法靈活調節,系統使用復雜。本文采用Moodle設計此門課程的自動測評。
Moodle(Modular Object-Oriented Dynamic Learning Environment)是一個用于制作網絡課程或網站自由的開源軟件包[9]。它是一個全球性的開發項目,用以支持社會建構主義(social constructionist)的教育框架[10]。此系統最大的特點即模塊化,網站的內容管理以課程為單位,在不同的課程之內可以個性化創建各種各樣的課程活動模塊——論壇、測驗、資源、投票、問卷調查、作業、聊天、專題討論[3]。平臺支持無限制的課程目錄創建,課程管理員可以在任何時候隨意創建,移動,下載,修改課程以及課程內容,還可以隨著課程的進度隱藏或者激活課程以及其內容。采用這種架構的系統完全可以滿足一個多課程并行,用戶規模大的教育需求。
通過開源商店下載安裝的Moodle基礎框架中已有各種功能模塊的基礎框架,使用者需要根據自身需求編寫填充內容,增加約束DIY更多個性化的功能。題目的自動測評主要通過利用Moodle平臺的在線評測活動組完成。此活動由四個基礎功能模塊組合完成--題目編寫模塊,代碼運行模塊,測試用例模塊,結果顯示模塊。
題目編寫模塊和測試用例模塊類似一個文檔小程序,教師分別在這兩部分編寫題目要求和參考答案。代碼運行模塊分為代碼前綴,代碼,代碼后綴三個部分。代碼為學生作業中提交的答案代碼,代碼的前后綴為教師或管理員編寫的代碼執行環境。系統在運行中會將三部分自動拼合成一段并且運行。Python作為一門優秀的“膠水語言”適宜于數據庫進行交互,因此在前后綴部分采用Python 3.5與后臺數據庫連接支持SQL語句運行。在代碼的前綴部分執行連接數據庫,調用存儲過程,在后綴部分執行抓取代碼運行結果。此被抓取的運行結果即代碼運行模塊的執行結果,該結果將被系統自動用于與測試用例模塊中預設答案的部分對比,然后給出評分和出錯原因并且將其顯示在結果顯示模塊中。

圖1 系統流程圖
對于查詢類語句,系統將在數據庫中用學生代碼和教師代碼分別創建視圖view_studybar_student和view_studybar_ans。視圖(VIEW)具有安全性、邏輯獨立性等優點,不對數據進行獨立存儲。從根本上來說,一個結果集恰對應著來自學吧的一條查詢語句。在測評初始化時,只需要刪除原先測評時創建的視圖,再重新創建即可。
而學生在執行增刪改操作后,會對表中數據造成污染,因此需要通過數據恢復以保證不同時候的操作都能得到相同的結果。為保證數據安全性,DBMS只能授權給學生特定表的非只讀操作權限。這里以student表為例說明,同時數據庫中已建立表結構與student表相同的student_table表和student_table_TEMP表。來自學吧平臺的用戶只有權限修改student_table表中的數據。當數據庫連接成功后,系統隨即調用存儲過程,為清空student_table表和student_table_TEMP表的數據,并分別把student表中的數據復制到這兩張表中。
檢查字段正確性需要對比view_studybar_student和view_studybar_ans的字段是否一致。可借助MySQL的INFORMATION_SCHEMA數據庫獲取字段的詳細信息。主要代碼如下。

因為需對比的兩張表的表結構是動態的,所以需要利用INFORMATION_SCHEMA數據庫動態獲取字段信息,為達到使用要求還需對此結果用group_concat函數進行處理。隨后對比兩張表的記錄并向學吧平臺返回學生提交SQL結果集中的異常記錄。實現代碼如下。


題目是SQL語言練習的核心內容,也是影響在線測評系統實際應用的重要因素。由于SQL語言靈活可嵌套使用,一般的教學中所使用的題目都為獨立的單條SQL編寫練習。但實際應用中,數據庫語言需要支持前端網站或者軟件的功能等綜合操作,此外整體數據庫架構的設計學習更是重要[11]。因此本文采用情境式引導設計題庫,每道題目都有來自實際應用中的情境前提,明晰知識的使用范圍。學生在學習數據庫課程的初期需要廣泛學習語法細節,后期則需要完成具有一定綜合性的題目。設計一個兼顧廣度與深度的題庫也是本系統的任務。SQL查詢類題庫設計框架見表1。該查詢類題庫的設計思路既便于學生循序漸進學習,也可以為教師后續針對性補充題目提供參考。系統目前已有80余道題目,任課教師還可結合教學情況自行添加。

表1 SQL 查詢類題庫設計框架
本系統已在中國農業大學雨虹學網投入測試使用,有效提升了學生在數據庫課程代碼練習的效率。根據Moodle官網統計數據,使用Moodle注冊的網站達104,230個,覆蓋225個國家,共開設19,475,559門課程,設計測試問題達1,733,094,640道[12]。中國目前許多高校的都采用Moodle搭建自己的計算機教學平臺,如中國農業大學雨虹學網,哈爾濱工業大學Moodle學習平臺,南京農業大學計算機軟件研究所課程網站等均采用Moodle搭建[13]。鑒于數據庫原理與應用此門課程在計算機教學中的重要性和其語言編寫的獨特性,本文提出的系統可供其他高校參考,建設或者完善此門課程的教學活動,減輕教師的負擔,給學生及時的學習反饋。此外,由于一些在線教學網站如MOOCs,菜鳥教程等都缺少一個配合教學內容的練習端,考核效率低,是這些平臺的共有的缺點。本文所采用的Moodle平臺黑盒測試的理念可供參考,以及本文提出的關于數據庫原理與實踐這門課程的評判反饋與恢復機制也可以用作參考建設和完善SQL結構化查詢語言的相關課程練習。