劉金龍,寧 洪,尹俊文
(中國(guó)人民解放軍國(guó)防科學(xué)技術(shù)大學(xué)計(jì)算機(jī)系,湖南 長(zhǎng)沙 410073)
傳統(tǒng)的數(shù)據(jù)庫(kù)案例教學(xué)中,所用案例多為靜態(tài)、單版本,不支持案例可執(zhí)行、設(shè)計(jì)回溯、多版本對(duì)比學(xué)習(xí)、案例改造、協(xié)作等概念,這使得案例教學(xué)法的效果大打折扣。為了解決這個(gè)問(wèn)題,本文提出基于Wiki技術(shù)構(gòu)建的數(shù)據(jù)庫(kù)可執(zhí)行案例系統(tǒng),該系統(tǒng)包含案例可執(zhí)行、基于標(biāo)簽的知識(shí)點(diǎn)組織和面向?qū)W習(xí)的信息推送3個(gè)主要模塊,這3個(gè)模塊將Wiki的特性和案例教學(xué)的優(yōu)點(diǎn)完美結(jié)合,不但使數(shù)據(jù)庫(kù)案例設(shè)計(jì)結(jié)果可盡早執(zhí)行,有助于學(xué)生對(duì)數(shù)據(jù)庫(kù)完整性控制、數(shù)據(jù)異常、數(shù)據(jù)庫(kù)性能等復(fù)雜概念的理解,而且使對(duì)比學(xué)習(xí)、否定式學(xué)習(xí)、協(xié)作學(xué)習(xí)等方式成為可能,無(wú)論是對(duì)施教者還是對(duì)學(xué)習(xí)者,都提供了強(qiáng)有力的幫助。
Wiki是一種在網(wǎng)絡(luò)上開(kāi)放且可供多人協(xié)同創(chuàng)作的超文本系統(tǒng),由沃德·坎寧安于1995年首先開(kāi)發(fā)。沃德·坎寧安將Wiki定義為“一種允許一群用戶利用簡(jiǎn)單的描述來(lái)創(chuàng)建和連接一組網(wǎng)頁(yè)的社會(huì)計(jì)算系統(tǒng)”[3]。這種協(xié)作方式的應(yīng)用,可以更好地促進(jìn)知識(shí)的傳播與應(yīng)用。
XWiki是一個(gè)用Java編寫的基于LGPL發(fā)布的開(kāi)源Wiki平臺(tái)。它是第二代Wiki,不僅提供了傳統(tǒng)Wiki的全部功能,而且可以方便地創(chuàng)建簡(jiǎn)單的協(xié)作式Web應(yīng)用。XWiki擁有優(yōu)秀的架構(gòu),它采用組件的方式組織整個(gè)平臺(tái)。它的一些受歡迎的特性,如頁(yè)面編輯、WYSIWYG編輯器、導(dǎo)出pdf、版本控制等都是通過(guò)組件的方式實(shí)現(xiàn)的,開(kāi)發(fā)者也可以實(shí)現(xiàn)自己的組件,將自己需要的功能無(wú)縫地集成在XWiki平臺(tái)中,它還提供了對(duì)groovy和velocity腳本的支持,用戶可以直接在Wiki頁(yè)面上用腳本進(jìn)行擴(kuò)展。
數(shù)據(jù)庫(kù)案例可執(zhí)行程序以可執(zhí)行的案例為中心,通過(guò)組件等機(jī)制使得創(chuàng)建于Wiki中的條目(案例)擁有可執(zhí)行的特性,卻不失去Wiki的協(xié)同編輯、版本回歸等特性,為數(shù)據(jù)庫(kù)案例教學(xué)帶來(lái)了極大的方便。除了可運(yùn)行,該系統(tǒng)還擁有基于標(biāo)簽樹(shù)的知識(shí)點(diǎn)的組織,面向?qū)W習(xí)的信息推送兩個(gè)主要模塊,另外還提供用戶管理、分組管理、權(quán)限控制等功能,系統(tǒng)的主要功能結(jié)構(gòu)如圖1所示。
圖1 可執(zhí)行系統(tǒng)主要功能結(jié)構(gòu)
案例的可執(zhí)行是該系統(tǒng)的主體部分,它包含了邏輯設(shè)計(jì)與概念設(shè)計(jì)階段的可執(zhí)行和數(shù)據(jù)庫(kù)施行階段的可執(zhí)行。邏輯設(shè)計(jì)與概念設(shè)計(jì)階段的可執(zhí)行允許使用者創(chuàng)建、刪除ER圖和邏輯圖,控制ER圖的版本(為了方便觀察,該處版本控制和Wiki文檔的版本控制是分開(kāi)的,兩者互不影響),從模型圖里向DBMS里映射數(shù)據(jù)庫(kù)表等操作。數(shù)據(jù)庫(kù)實(shí)施階段的可執(zhí)行則可以智能地為數(shù)據(jù)庫(kù)表填充數(shù)據(jù)、在案例頁(yè)面執(zhí)行SQL語(yǔ)句、顯示結(jié)果等,也就是說(shuō)使用者可以在不離開(kāi)Wiki頁(yè)面的情況下完成數(shù)據(jù)庫(kù)設(shè)計(jì)的全過(guò)程。學(xué)習(xí)者在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的過(guò)程中,通過(guò)可執(zhí)行模塊和Wiki提供的版本控制功能,可以很方便地改造原設(shè)計(jì),或者對(duì)其進(jìn)行回溯,進(jìn)行否定式的學(xué)習(xí)。
基于標(biāo)簽樹(shù)的知識(shí)點(diǎn)(條目、案例)的組織主要是針對(duì)XWiki中條目的組織過(guò)于松散提出來(lái)的解決方案。條目組織松散、缺乏結(jié)構(gòu)化是Wiki系統(tǒng)的通病。XWiki中采用了分類和標(biāo)簽兩種方式組織條目,效果也不是很好,該模塊將Wiki中的標(biāo)簽功能進(jìn)行擴(kuò)展,使其可以以樹(shù)形的方式呈現(xiàn),并且允許用戶自由編輯標(biāo)簽樹(shù)的父子結(jié)構(gòu),極大地增加了查找相關(guān)條目(即知識(shí)點(diǎn))的效率。
面向?qū)W習(xí)的信息推送目的是將學(xué)習(xí)者可能關(guān)心的案例(即條目)及其發(fā)生的修改信息推送給學(xué)習(xí)者,該功能不僅可以避免學(xué)習(xí)者對(duì)案例的重復(fù)查找,還能增加學(xué)習(xí)者學(xué)習(xí)的主動(dòng)性。
用戶管理、分組管理主要由施教者完成,施教者在該系統(tǒng)中相當(dāng)于管理員的身份,他可以對(duì)用戶和分組的各種信息進(jìn)行更改,包括創(chuàng)建刪除用戶和分組,分組成員的變更。而學(xué)習(xí)者則只可以更改自己的信息。學(xué)習(xí)者對(duì)分組的管理也僅限于自己創(chuàng)建的分組。權(quán)限控制和分組管理類似,施教者可以控制各個(gè)頁(yè)面的訪問(wèn)、編輯、評(píng)論等權(quán)限,而學(xué)習(xí)者僅能對(duì)自己創(chuàng)建的頁(yè)面進(jìn)行權(quán)限控制。學(xué)習(xí)者利用這些功能,結(jié)合Wiki提供的協(xié)作編輯,可以很方便地展開(kāi)以組為單位的協(xié)作學(xué)習(xí)。
本文提出的系統(tǒng)構(gòu)建于XWiki平臺(tái)之上,XWiki采用Struts、Hibernate等開(kāi)源框架實(shí)現(xiàn),它的架構(gòu)非常優(yōu)秀,不僅嚴(yán)格地遵循了MVC的分層結(jié)構(gòu),也提供了非常簡(jiǎn)便的擴(kuò)展方式,對(duì)于簡(jiǎn)單的Web應(yīng)用,開(kāi)發(fā)者僅需要在Wiki頁(yè)面中編寫簡(jiǎn)單的velocity或者groovy腳本(可以調(diào)用 XWiki提供的 API),配合XWiki對(duì)HTML、CSS和JavaScript的支持即可實(shí)現(xiàn),對(duì)于比較復(fù)雜的需求,XWiki提供了組件的功能。本系統(tǒng)是結(jié)合了組件和腳本兩種方式實(shí)現(xiàn)的。它的邏輯結(jié)構(gòu)如圖2所示。
圖2 可執(zhí)行系統(tǒng)邏輯架構(gòu)
本系統(tǒng)除了借用XWiki原有頁(yè)面、鏈接、標(biāo)簽、版本等一系列機(jī)制支持案例設(shè)計(jì),還通過(guò)腳本和組件兩種方式對(duì)XWiki進(jìn)行擴(kuò)展實(shí)現(xiàn)案例可執(zhí)行、信息推送等一系列主要功能。由于篇幅有限,而且這些功能模塊的實(shí)現(xiàn)機(jī)理具有一定的相似性,本節(jié)選擇依托于主頁(yè)的信息推送和案例可執(zhí)行模塊中SQL語(yǔ)句執(zhí)行兩個(gè)部分,說(shuō)明如何利用腳本和組件擴(kuò)展XWiki平臺(tái)實(shí)現(xiàn)系統(tǒng)各類功能。
信息推送模塊主要是向?qū)W習(xí)者推送他可能關(guān)心的模塊或用戶的動(dòng)態(tài)信息(比如說(shuō)案例的創(chuàng)建刪除等),這些信息最好在第一時(shí)間落入學(xué)習(xí)者的眼中,因此將它放在了首頁(yè)中。該模塊主要通過(guò)velocity腳本實(shí)現(xiàn)。
XWiki將在文檔中發(fā)生的每種操作都定義為一個(gè)事件,比如文檔的創(chuàng)建操作定義為CREAT事件,文檔的更改操作定義為UPDATE事件等。當(dāng)某個(gè)事件發(fā)生時(shí),往往會(huì)伴有大量的信息,比如比較簡(jiǎn)單的CREAT事件發(fā)生時(shí),就會(huì)產(chǎn)生創(chuàng)建文檔的作者、文檔的名字、文檔所屬類別、文檔被打上的標(biāo)簽等信息。XWiki會(huì)將這些信息都保在其支撐數(shù)據(jù)庫(kù)中保存下來(lái),信息推送模塊要做的就是將這些信息讀取出來(lái),并推送給特定用戶。
該模塊通過(guò)velocity腳本為使用者呈現(xiàn)諸多信息,下面以指定天數(shù)內(nèi)瀏覽次數(shù)最多的頁(yè)面為例介紹該功能的實(shí)現(xiàn)模式,該功能的展現(xiàn)效果如圖3所示。
圖3 瀏覽次數(shù)最多的頁(yè)面
該功能可以按用戶指定的天數(shù)和個(gè)數(shù)列出相應(yīng)的瀏覽次數(shù)最多的一些頁(yè)面。這個(gè)功能的核心代碼如下:
用戶訪問(wèn)頁(yè)面會(huì)觸發(fā)一次VIEW事件,這里通過(guò)HQL(Hibernate實(shí)現(xiàn)的面向?qū)ο蟮念怱QL語(yǔ)句)將指定日期內(nèi)每個(gè)頁(yè)面發(fā)生的VIEW事件求和,并降序排列,返回結(jié)果給stats變量,然后通過(guò)XWiki對(duì)HTML和CSS的支持,將這個(gè)結(jié)果展現(xiàn)出來(lái)。
信息推送的其它部分信息的獲取和瀏覽次數(shù)的獲取方式大同小異,都是通過(guò)HQL從數(shù)據(jù)庫(kù)里取得相應(yīng)的信息,然后展示給使用者。
SQL語(yǔ)句執(zhí)行模塊是數(shù)據(jù)庫(kù)實(shí)施階段可執(zhí)行模塊的一個(gè)子模塊,它主要用來(lái)執(zhí)行各種SQL語(yǔ)句,使用者不需要熟悉具體的DBMS,只需要在輸入框內(nèi)輸入各種命令進(jìn)行查詢即可,它的執(zhí)行流程如圖4所示(省略了數(shù)據(jù)庫(kù)連接的細(xì)節(jié))。
圖4 SQL執(zhí)行模塊執(zhí)行流程
該功能通過(guò)XWiki的組件實(shí)現(xiàn)。XWiki是開(kāi)源軟件,它的代碼托管于github,它的程序則是通過(guò)maven進(jìn)行構(gòu)建,開(kāi)發(fā)者也需要通過(guò)maven進(jìn)行組件的擴(kuò)展。當(dāng)配置好maven環(huán)境后,只需在命令行調(diào)用如下命令:
maven就會(huì)自動(dòng)下載好所依賴的jar包,并生成一個(gè)Hello World級(jí)的組件,開(kāi)發(fā)者可以對(duì)這個(gè)組件進(jìn)行修改,實(shí)現(xiàn)自己需要的功能。可執(zhí)行功能組件的入口如下:
組件的入口類必須實(shí)現(xiàn)XWiki提供的ScriptService才能被XWiki識(shí)別為一個(gè)組件。當(dāng)單元測(cè)試確認(rèn)結(jié)果正確后,即可通過(guò) maven的打包功能:mvn package將程序打成jar包。XWiki的組件使用時(shí)只需將打好的jar包添加到類路徑,然后重啟Web容器,即可通過(guò)XWiki提供的命令調(diào)用組件了。SQL執(zhí)行模塊的調(diào)用方法為:
$services.sqlparse..getSqlResultt(articleName,sql)
其中sqlparse為組件實(shí)現(xiàn)時(shí)為組件起的名字。當(dāng)獲得了執(zhí)行結(jié)果后,只需要通過(guò)HTML和CSS即可將查詢結(jié)果展示給學(xué)習(xí)者。
本文在詳細(xì)分析了數(shù)據(jù)庫(kù)案例的功能需求的基礎(chǔ)上,提出基于Wiki開(kāi)發(fā)數(shù)據(jù)庫(kù)案例可執(zhí)行系統(tǒng)的設(shè)計(jì)框架,并通過(guò)典型的模塊介紹了系統(tǒng)的實(shí)現(xiàn)技術(shù)。該系統(tǒng)已完成,正投入試用。該系統(tǒng)雖然是針對(duì)數(shù)據(jù)庫(kù)案例教學(xué)的需求開(kāi)發(fā)的,但其可執(zhí)行機(jī)制、信息推送和知識(shí)點(diǎn)組織等概念很容易推廣到其它具有構(gòu)造性的一類課程中去,為其它的課程案例教學(xué)提供支持。
[1]李紅,宋笑雪,劉小豫.案例教學(xué)法在《數(shù)據(jù)庫(kù)原理》課程中的運(yùn)用[J].現(xiàn)代計(jì)算機(jī):上半月版,2011(11):28-30.
[2]胡科.基于Web2.0的Wiki技術(shù)應(yīng)用研究[J].中國(guó)電化教育,2006(9):101-102.
[3]Steve Wheeler.The good,the bad and the wiki:Evaluating student-generated content for collaborative learning[J].Educational Technology,2008,39(6):987-995.
[4]Besiki Stvilia,Michael Twidale,Linda Smith.Information quality work organization in Wikipedia[J].Journal of the American Society for Information Science and Technology,2008,59(6):983-1001.
[5]王勤明.基于Wiki技術(shù)的網(wǎng)絡(luò)協(xié)作式學(xué)習(xí)模式研究[J].河南農(nóng)業(yè),2007(8):48.
[6]譚支軍.Wiki在教育教學(xué)中的應(yīng)用初探[J].中國(guó)遠(yuǎn)程教育,2005(9):66-67.
[7]高燕,鄒霞,馬偉偉.基于Wiki的網(wǎng)絡(luò)作文教學(xué)模式探究[J].現(xiàn)代教育技術(shù).2007(9):74-76.
[8]趙杰.基于WiKi的協(xié)作學(xué)習(xí)行動(dòng)研究[D].南京:南京師范大學(xué),2007.
[9]康飛,劉家勛.Wiki技術(shù)應(yīng)用案例分析及其啟示[J].中國(guó)現(xiàn)代教育裝備,2007(12):45-46.
[10]莊秀麗.WiKi呼喚網(wǎng)絡(luò)時(shí)代的共創(chuàng)分享[J].中國(guó)研究生,2004(1):52-53.
[11]李兆義.Wiki在高校教育教學(xué)中的應(yīng)用初探[J].中國(guó)現(xiàn)代教育裝備,2009(8):22-25.
[12]譚支軍.基于Wiki在教育教學(xué)中的應(yīng)用初探[J].中國(guó)遠(yuǎn)程教育,2005(5):66-68.
[13]劉勇,鄒霞.基于Web2.0的師生互動(dòng)平臺(tái)的構(gòu)建[J].宜賓學(xué)院學(xué)報(bào),2009,9(12):58-61.
[14]陳立華,徐建初.Wiki:網(wǎng)絡(luò)時(shí)代協(xié)同工作與知識(shí)共享的平臺(tái)[J].中國(guó)信息導(dǎo)報(bào),2005(1):51-54.