嚴(yán)超群,李志宏,曹 峻,師闖闖,楊煜馨
(1河北建筑工程學(xué)院 河北 張家口 075132)
(2燕山大學(xué) 河北 秦皇島 066004)
SQL語(yǔ)言(Structured Query Language)自動(dòng)測(cè)評(píng)系統(tǒng)可以滿(mǎn)足教師與學(xué)生的需求。對(duì)于教師而言可以在平臺(tái)上發(fā)布作業(yè)或?qū)嶒?yàn),且能具體看到同學(xué)們提交的代碼或同學(xué)們的作答情況并上傳自定義數(shù)據(jù)庫(kù)。對(duì)于學(xué)生而言可以隨時(shí)查看日常作業(yè)的信息,并在此基礎(chǔ)上擴(kuò)展了數(shù)據(jù)隔離、錯(cuò)誤類(lèi)型、多語(yǔ)句提交等[1]。
本課題意在為學(xué)生提供一種SQL語(yǔ)言測(cè)試平臺(tái),以協(xié)助學(xué)校教師更好地開(kāi)展數(shù)據(jù)庫(kù)SQL語(yǔ)言實(shí)踐性練習(xí),從而降低教師實(shí)驗(yàn)室管理成本,了解學(xué)生的實(shí)際問(wèn)題和信息,更有效地協(xié)助老師們掌握學(xué)生知識(shí)薄弱點(diǎn),使他們能夠完成國(guó)內(nèi)各地老師出的習(xí)題,從而拓寬他們的視野,通過(guò)建立一個(gè)數(shù)據(jù)共享的實(shí)踐性MOOC平臺(tái),可以充分運(yùn)用SQL語(yǔ)句改善計(jì)算機(jī)應(yīng)用系統(tǒng)的運(yùn)行品質(zhì)和工作效率,協(xié)助他們更好地了解SQL語(yǔ)言[2]。
SQL語(yǔ)句自動(dòng)評(píng)測(cè)系統(tǒng)是一個(gè)由計(jì)算機(jī)自動(dòng)對(duì)SQL語(yǔ)句進(jìn)行評(píng)測(cè)的系統(tǒng),本項(xiàng)目主要分為學(xué)生端和教師端。其中學(xué)生端分為注冊(cè)、登錄、答題三個(gè)板塊。教師端分為審核、題目答案設(shè)計(jì)、成績(jī)統(tǒng)計(jì)、行為統(tǒng)計(jì)四個(gè)板塊。該系統(tǒng)通過(guò)將教師所給結(jié)果與學(xué)生執(zhí)行結(jié)果進(jìn)行比較來(lái)確定答案正確與否,若答案不完整,則通過(guò)數(shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)一步進(jìn)行比較判斷。
結(jié)構(gòu)化查詢(xún)語(yǔ)言是先進(jìn)的非過(guò)程化代碼語(yǔ)句,鼓勵(lì)應(yīng)用者在更多層的信息架構(gòu)上操作。它既不要求客戶(hù)確定對(duì)信息的存儲(chǔ)方式,也不要求客戶(hù)知道具體的信息存儲(chǔ)方法,所以具備完全差異基礎(chǔ)架構(gòu)的各種數(shù)據(jù)庫(kù)系統(tǒng),能夠通過(guò)同樣的結(jié)構(gòu)化查詢(xún)語(yǔ)言成為數(shù)據(jù)輸入和信息管理的標(biāo)準(zhǔn)接口[3]。結(jié)構(gòu)化查詢(xún)語(yǔ)言句子之間可嵌套,這就使得其具有了很大的操作靈活度和極大的使用功能。
SQL能夠自主進(jìn)行數(shù)據(jù)庫(kù)系統(tǒng)生命周期中的所有活動(dòng),包括確定數(shù)據(jù)模型、記錄信息、創(chuàng)建新數(shù)據(jù)庫(kù)系統(tǒng)等各種活動(dòng),這也為數(shù)據(jù)庫(kù)的系統(tǒng)發(fā)展創(chuàng)造了優(yōu)越的條件,當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)投入工作時(shí),還能按照需求隨時(shí)逐步調(diào)整模型,從而不干擾數(shù)據(jù)庫(kù)系統(tǒng)的正常工作,因而使數(shù)據(jù)庫(kù)系統(tǒng)產(chǎn)生了良好的可擴(kuò)充性。
非關(guān)系數(shù)據(jù)模型的數(shù)據(jù)處理語(yǔ)句通常是面向過(guò)程的語(yǔ)句,用它來(lái)實(shí)現(xiàn)用戶(hù)請(qǐng)求時(shí),需要指明存取途徑。而使用SQL語(yǔ)言實(shí)現(xiàn)的統(tǒng)計(jì)功能,用戶(hù)只需指出“做什么樣”,而不用指明“怎么樣”,存取路徑的選定方式和SQL語(yǔ)言的過(guò)程由操作系統(tǒng)內(nèi)部自行實(shí)現(xiàn)。這樣不但大幅度降低了用戶(hù)負(fù)荷,同時(shí)也可以增強(qiáng)數(shù)據(jù)獨(dú)立性。
SQL既是自含式句子,也是嵌合式句子。身為自含式編程語(yǔ)言,它還能自主地提供聯(lián)機(jī)互動(dòng)的應(yīng)用方法,用戶(hù)也就能在終端計(jì)算機(jī)按鍵上通過(guò)注入SQL指令對(duì)數(shù)據(jù)庫(kù)管理系統(tǒng)加以運(yùn)用。而身為嵌入型編程語(yǔ)言,SQL句子也可能內(nèi)嵌到高層程式語(yǔ)言(如C、C、JAVA)中,以供程序員在設(shè)計(jì)程式時(shí)運(yùn)用。
SQL語(yǔ)言于1974年由Boyce和Chamberlin發(fā)明,最先在由IBM有限公司所研發(fā)的企業(yè)關(guān)聯(lián)信息數(shù)據(jù)庫(kù)systeme上實(shí)施[4]。因?yàn)槠渚哂泄δ茇S富、使用方便靈活、使用簡(jiǎn)單易懂等明顯的優(yōu)勢(shì),受到計(jì)算機(jī)行業(yè)和計(jì)算機(jī)用戶(hù)的青睞。1980年10月,由美國(guó)標(biāo)準(zhǔn)計(jì)量管理局(ANSI)的數(shù)據(jù)庫(kù)委員會(huì)X3H2批準(zhǔn),將SQL作為關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的美國(guó)標(biāo)準(zhǔn),同年公布了標(biāo)準(zhǔn)SQL,此后不久,國(guó)際標(biāo)準(zhǔn)化組織(ISO)也做出了類(lèi)似的決議。
SQL在功能上包括三部分,分別是數(shù)據(jù)類(lèi)型定義、數(shù)據(jù)操作和數(shù)據(jù)處理[5]。
SQL的基礎(chǔ)部分相當(dāng)于關(guān)系代數(shù),它同時(shí)也具備了關(guān)系代數(shù)所沒(méi)有的很多特性,例如聚集、數(shù)據(jù)庫(kù)改進(jìn)等。這是一種綜合性的、通用性的、能力極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)編程語(yǔ)言。其特征為:兩種使用方法,統(tǒng)一的語(yǔ)法結(jié)構(gòu)[6]。SQL主要有兩種應(yīng)用方法,一種方法是聯(lián)機(jī)交互應(yīng)用,在這個(gè)方法下的SQL實(shí)際上是當(dāng)作自含式語(yǔ)言來(lái)應(yīng)用的;另一種方法則是直接嵌入到一些高級(jí)程序設(shè)計(jì)語(yǔ)句(如C語(yǔ)句等)中去應(yīng)用的。前一種方法適用于非計(jì)算機(jī)專(zhuān)業(yè)技術(shù)人員應(yīng)用,后一種方法則適用于專(zhuān)門(mén)的計(jì)算機(jī)科學(xué)技術(shù)人員應(yīng)用。雖然方法不同向,但是各種語(yǔ)言的語(yǔ)法結(jié)構(gòu)基本上是一樣的。
SQL語(yǔ)句的3種基本形式:
INSERTINTOtable_name(col_1,col_2,col_3,)VALUES(value_1,value_2,value_3…)
DELETEFROMtable_nameWHEREcol_n=value_n
updateable_nameSETcol_1=value_1,col_2=value_2,col_3=value_3WHEREcol_x=value_x
在設(shè)計(jì)中,讓網(wǎng)頁(yè)元件的名字與底層數(shù)據(jù)庫(kù)表的字段命名相同。利用JavaEE中的request.getParameterNames()方式能夠讀到表單中的每個(gè)元件的名字,有了元素名稱(chēng)借助request.getParameter(elementName)方式才能得到該元件的數(shù)值。所以,在這三個(gè)語(yǔ)言中col_n和value_n就沒(méi)有了未知數(shù),未知的數(shù)據(jù)中只留下了table_name,col_x和value_x.可以編寫(xiě)一個(gè)方法,傳入request對(duì)象,再把table_name,col_x,value_x作為參數(shù)傳入方法,就可自動(dòng)構(gòu)造SQL語(yǔ)句了。
2.1.1 注冊(cè)登錄板塊
學(xué)生在使用該平臺(tái)之前需要實(shí)名注冊(cè),選擇自己的學(xué)校學(xué)院,填寫(xiě)完相關(guān)信息之后可以使用教師所給邀請(qǐng)碼進(jìn)入自己的班級(jí),即可作答教師發(fā)布的實(shí)驗(yàn),使用正則表達(dá)式對(duì)學(xué)生注冊(cè)信息進(jìn)行判斷,查看是否符合要求,將學(xué)生信息通過(guò)后臺(tái)寫(xiě)入數(shù)據(jù)庫(kù)中分類(lèi)管理[7]。
其中可以通過(guò)手機(jī)和郵箱注冊(cè)賬號(hào),手機(jī)注冊(cè)部分使用一條短信業(yè)務(wù)API平臺(tái)結(jié)合Java代碼實(shí)現(xiàn)驗(yàn)證碼的生成和發(fā)送。郵箱注冊(cè)通過(guò)寫(xiě)一個(gè)郵箱驗(yàn)證工具類(lèi)來(lái)實(shí)現(xiàn)后臺(tái)向用戶(hù)郵箱發(fā)送驗(yàn)證碼完成注冊(cè)驗(yàn)證。
2.1.2 個(gè)人中心板塊
在個(gè)人中心板塊中,有成績(jī)查詢(xún)模塊,可幫助學(xué)生了解自己每次做題成績(jī)信息,也可以查看自己所參加的課程。
2.1.3 答題板塊
學(xué)生可在答題板塊中完成教師所布置的實(shí)驗(yàn)作業(yè)和開(kāi)放的試題。提交后系統(tǒng)評(píng)測(cè)答案,給出分?jǐn)?shù);其中也包括討論模塊,學(xué)生可在討論模塊中討論自己的心得和疑惑,老師也可以在該模塊公布相關(guān)信息。其中一個(gè)題對(duì)應(yīng)一個(gè)討論區(qū),方便同學(xué)查閱。討論功能使用Ajax實(shí)現(xiàn)。
其答題模塊中包含了試題模板,使用者可以通過(guò)瀏覽器查詢(xún)頁(yè)面,展示相應(yīng)的數(shù)據(jù)分析,而不用完成煩瑣的大數(shù)據(jù)分析;服務(wù)器上管理使用者所提供的財(cái)務(wù)數(shù)據(jù)是個(gè)長(zhǎng)久的流程,并不適用于隨時(shí)呈現(xiàn),因此針對(duì)以上數(shù)據(jù)分析的特性,根據(jù)C/S架構(gòu)與B/S架構(gòu)的優(yōu)缺點(diǎn),在前臺(tái)與使用者的通訊中使用了B/S架構(gòu),在后臺(tái)財(cái)務(wù)數(shù)據(jù)的管理中也使用了C/S架構(gòu)。
客戶(hù)端在網(wǎng)頁(yè)中使用網(wǎng)上的試卷插件對(duì)試卷進(jìn)行查詢(xún)、回答、提交,并將試卷回答信息打入資料庫(kù)中。服務(wù)器則是利用在線(xiàn)考試的一個(gè)守護(hù)進(jìn)程來(lái)監(jiān)視每一臺(tái)終端,并接受所有客戶(hù)在線(xiàn)考試的申請(qǐng)。該過(guò)程只進(jìn)行客戶(hù)端信息的解析處理,當(dāng)接到申請(qǐng)時(shí),保護(hù)過(guò)程使用某個(gè)線(xiàn)程來(lái)接受信息,再令某個(gè)線(xiàn)程分析處理信息,并且讀出數(shù)據(jù)庫(kù)系統(tǒng)中的相關(guān)參數(shù),使用判分過(guò)程來(lái)管理相應(yīng)的試題答案??蛻?hù)端與服務(wù)器交互如圖1所示。

圖1 客戶(hù)端與服務(wù)器的交互
2.2.1 班級(jí)管理模塊
教師可在該模塊創(chuàng)建班級(jí),以實(shí)現(xiàn)管理學(xué)生成績(jī)和發(fā)布試題等功能。
教師發(fā)布試題后,經(jīng)系統(tǒng)自動(dòng)評(píng)判實(shí)驗(yàn)結(jié)果后對(duì)學(xué)生公布,整個(gè)結(jié)果公布模塊主要是根據(jù)評(píng)分和教師對(duì)結(jié)果進(jìn)行評(píng)價(jià)兩個(gè)方面來(lái)進(jìn)行的,學(xué)員可根據(jù)自我測(cè)評(píng)成績(jī)向教師在線(xiàn)詢(xún)問(wèn),從而加強(qiáng)師生互動(dòng),提高教學(xué)效果。
2.2.2 成績(jī)統(tǒng)計(jì)模塊
統(tǒng)計(jì)每位學(xué)生的答題正確率、答題時(shí)長(zhǎng)、提交次數(shù),從而判斷試題難易程度,將相關(guān)數(shù)據(jù)形成可視化圖表來(lái)顯示每位同學(xué)的答題情況,方便教師了解學(xué)生情況。
2.2.3 后臺(tái)關(guān)鍵技術(shù)實(shí)現(xiàn)
該過(guò)程最主要的任務(wù)就是做到自動(dòng)、真實(shí)、精確地評(píng)價(jià)每一次實(shí)驗(yàn)成績(jī)。因此對(duì)答案的評(píng)估也是基礎(chǔ)功能。一種實(shí)現(xiàn)方式是直接對(duì)比SQL語(yǔ)言,另一種則是直接對(duì)比學(xué)員成績(jī)和老師的回答。不過(guò),因?yàn)镾QL語(yǔ)言具有高度靈活性,SQL問(wèn)題往往能夠通過(guò)很多種不同的SQL語(yǔ)言實(shí)現(xiàn),但是在使用第一種方法的過(guò)程中,需要進(jìn)行大量的實(shí)驗(yàn),對(duì)所有的結(jié)果預(yù)測(cè)也并不算準(zhǔn)確,這在某種程度上直接降低了SQL語(yǔ)言的操作性。但是,針對(duì)結(jié)果進(jìn)行對(duì)比分析,則能夠更好地避免這種問(wèn)題。因此可以通過(guò)直接評(píng)估回答的方式做出正確評(píng)估?;卮鹋卸ǖ幕舅悸肥牵悍謩e根據(jù)所使用的SQL語(yǔ)句和正常的SQL語(yǔ)句,比較二者所給出的結(jié)果(預(yù)先保持真正的搜索結(jié)論不為空),如兩個(gè)結(jié)論相同,則視為回答準(zhǔn)確,否則視為回答不恰當(dāng)。
盡管實(shí)際的結(jié)果與問(wèn)題的解決并沒(méi)有什么區(qū)別,但是在整個(gè)過(guò)程中無(wú)法重新排序知識(shí)并且對(duì)重復(fù)的內(nèi)容進(jìn)行刪減,這種情況下就會(huì)產(chǎn)生一種十分嚴(yán)重的問(wèn)題,針對(duì)其進(jìn)行全錯(cuò)的判斷顯然也并不合理。因此,在得出結(jié)論的過(guò)程中,可以采用梯度結(jié)論的方式,確保不完全正確結(jié)果的判定更加準(zhǔn)確,進(jìn)而充分保障以偏概全的情況得以有效避免。在完成具體任務(wù)的過(guò)程中,能夠借助SQL語(yǔ)言對(duì)整個(gè)工作進(jìn)行充分的排序,最后折返時(shí)間,在這種情況下由于沒(méi)有將工作數(shù)據(jù)的狀態(tài)進(jìn)行調(diào)整,因此對(duì)其他學(xué)生的作業(yè)成果并不會(huì)產(chǎn)生實(shí)質(zhì)性的影響。下文為JAVA代碼,以此為例針對(duì)關(guān)鍵技術(shù)進(jìn)行說(shuō)明。
(1)對(duì)于查詢(xún)操作,引入minus關(guān)鍵字比較兩者結(jié)果是否相同。核心代碼如下:
/*拼接兩個(gè)SQL字符串*/
StringspliceSql1=“(”+sql1+“)”+“minusall”+“(”+sql2+“)”;
recordingList1=samplesDAO.query(conn,spliceSql1);
/*判斷查詢(xún)結(jié)果是否相同*/
isEqual=(recordList1.size()==0)?true:false;
(2)對(duì)于更新操作,先執(zhí)行提交的SQL語(yǔ)句,然后查詢(xún)更新后的記錄是否符合預(yù)期,如果符合則為正確,否則視為不正確。核心代碼如下:
/*執(zhí)行學(xué)生提交的SQL語(yǔ)句*/
iCode=stmt.executeUpdate(userSolution);
/*執(zhí)行完畢后再次進(jìn)行查詢(xún)獲取得到結(jié)果集record2*/
record2=samplesDAO.query(conn,extraSQL);
/*查看record2中相應(yīng)記錄的值是否被更新成指定的值*/
(1)相關(guān)判斷審查SQL語(yǔ)句程序的設(shè)計(jì),數(shù)據(jù)庫(kù)存儲(chǔ)設(shè)置。
(2)在線(xiàn)考試的具體接口的實(shí)現(xiàn),如數(shù)據(jù)庫(kù)接口、頁(yè)面設(shè)計(jì)接口和權(quán)限接口設(shè)計(jì)。
(3)數(shù)據(jù)編排模塊的實(shí)現(xiàn)。該板塊可以允許創(chuàng)建選擇題(包括單項(xiàng)選擇題、多項(xiàng)選擇題、填空題、程序設(shè)計(jì)題)。
(4)后臺(tái)守護(hù)程序的設(shè)計(jì),頁(yè)面交互設(shè)計(jì)等。
應(yīng)用SQL語(yǔ)言能夠使編碼工作的整體難度得以充分降低,相關(guān)工作人員在開(kāi)展工作的過(guò)程中不必再進(jìn)行大量繁雜的工作,更不用擔(dān)心工作過(guò)程中會(huì)不會(huì)出現(xiàn)元件遺漏、元件命名錯(cuò)誤以及忘記處理單引號(hào)的情況發(fā)生。在應(yīng)用SQL語(yǔ)言的過(guò)程中,能夠?qū)ο到y(tǒng)功能進(jìn)行自動(dòng)區(qū)分,明確邏輯層以及內(nèi)容層的SQL語(yǔ)言構(gòu)造。在實(shí)際應(yīng)用的過(guò)程中,若重新調(diào)整了數(shù)據(jù)庫(kù)表,SQL語(yǔ)言的應(yīng)用促使工作人員只需要進(jìn)行一個(gè)表格內(nèi)容更新就可以實(shí)現(xiàn)大量工作的優(yōu)化,原本沒(méi)有寫(xiě)好的邏輯處理不用刻意地進(jìn)行處理,節(jié)省了大量的時(shí)間,并且為后續(xù)的維護(hù)提供了極大的便利?;谧詣?dòng)構(gòu)造的SQL語(yǔ)言,能夠更加高效地優(yōu)化程序,使操作更加簡(jiǎn)單,大大減少了工作人員的工作量,在很多領(lǐng)域都有較強(qiáng)的應(yīng)用價(jià)值。但是不得不說(shuō),SQL語(yǔ)言的應(yīng)用也存在一定的弊端,其需要消耗一定的性能,在一些特定的情況下,尤其是元素較多的情況下,這種性能消耗問(wèn)題更加明顯。但是,對(duì)于這種條件的限制并沒(méi)有十分的嚴(yán)格,因此總體上而言,SQL語(yǔ)言的應(yīng)用價(jià)值還是很高的。
綜上所述,SQL語(yǔ)言(Structured Query Language)是具備了信息操縱和資料描述等各種特性的數(shù)據(jù)庫(kù)語(yǔ)言,由于這種語(yǔ)言具備交互性?xún)?yōu)點(diǎn),可給使用者帶來(lái)很大的方便,現(xiàn)代企業(yè)管理系統(tǒng)也可充分運(yùn)用SQL語(yǔ)言改善計(jì)算機(jī)應(yīng)用系統(tǒng)的運(yùn)行品質(zhì)和工作效率。SQL語(yǔ)言不但可以單獨(dú)使用于終端,而且能夠作為子語(yǔ)言對(duì)其他編程給予有效幫助。SQL可和其他編程語(yǔ)言共同完善軟件性能,從而向使用者提供更多更全面的資訊。