盧錦運(yùn)等
摘要:隨著互聯(lián)網(wǎng)的普及和信息技術(shù)的迅猛發(fā)展,網(wǎng)絡(luò)問(wèn)卷調(diào)查已成為數(shù)據(jù)、資料收集的一種常用手段。傳統(tǒng)網(wǎng)絡(luò)問(wèn)卷調(diào)查系統(tǒng)普遍缺少題目邏輯跳轉(zhuǎn)和用戶填答校驗(yàn)功能,針對(duì)這一情況提出一種支持邏輯跳轉(zhuǎn)和填答約束的網(wǎng)絡(luò)問(wèn)卷調(diào)查系統(tǒng)的實(shí)現(xiàn)方法。該方法基于校驗(yàn)規(guī)則實(shí)現(xiàn)了對(duì)用戶填答的約束,同時(shí)通過(guò)設(shè)置跳轉(zhuǎn)邏輯增強(qiáng)了問(wèn)卷的靈活性和適應(yīng)性。該方法在2013年重慶市基礎(chǔ)教育質(zhì)量監(jiān)測(cè)教師問(wèn)卷調(diào)查中得到應(yīng)用,結(jié)果表明,該方法能夠提高回收數(shù)據(jù)的準(zhǔn)確性與規(guī)范性,具有較強(qiáng)的適用性。
關(guān)鍵詞:網(wǎng)絡(luò)問(wèn)卷調(diào)查系統(tǒng);JSON;邏輯跳轉(zhuǎn);填答約束;MongoDb
DOIDOI:10.11907/rjdk.143621
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2015)001010704
0 引言
問(wèn)卷調(diào)查是數(shù)據(jù)、資料收集的一種常用手段。傳統(tǒng)的問(wèn)卷調(diào)查通過(guò)人工方式發(fā)放、回收、統(tǒng)計(jì)問(wèn)卷。隨著互聯(lián)網(wǎng)的普及和信息技術(shù)的迅猛發(fā)展,傳統(tǒng)人工問(wèn)卷調(diào)查方式越來(lái)越無(wú)法滿足社會(huì)發(fā)展和人們生活的需求,網(wǎng)絡(luò)問(wèn)卷調(diào)查以其低成本、高可靠性、高效性、互動(dòng)性等特點(diǎn)逐漸成為當(dāng)前一種主流的調(diào)查方法[7]。
當(dāng)前網(wǎng)絡(luò)問(wèn)卷調(diào)查實(shí)現(xiàn)方式主要有兩種:①HTML靜態(tài)頁(yè)面。這種方式將所有要調(diào)查的問(wèn)題做成HTML頁(yè)面后上傳至服務(wù)器,當(dāng)更新題目信息時(shí)需要重新更新HTML頁(yè)面。因此,靜態(tài)頁(yè)面方式效率低下且需要專業(yè)人員完成;②基于ASP、PHP等編程語(yǔ)言與數(shù)據(jù)庫(kù)相結(jié)合制作而成的動(dòng)態(tài)頁(yè)面。該方式效率較高,操作更為方便,是目前的主流做法。
迄今為止,市面上出現(xiàn)了多種網(wǎng)絡(luò)問(wèn)卷調(diào)查軟件,這些軟件基本可以實(shí)現(xiàn)數(shù)據(jù)采集功能,但是大多缺乏對(duì)用戶輸入數(shù)據(jù)的動(dòng)態(tài)校驗(yàn),從而使后期對(duì)調(diào)查數(shù)據(jù)清理的工作量巨大,同時(shí)由于無(wú)法設(shè)置跳轉(zhuǎn)邏輯題而使問(wèn)卷靈活性和適用性較差。本文擬結(jié)合重慶市基礎(chǔ)教育質(zhì)量監(jiān)測(cè)教師問(wèn)卷調(diào)查系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)環(huán)節(jié)探討在網(wǎng)絡(luò)問(wèn)卷調(diào)查系統(tǒng)中如何實(shí)現(xiàn)用戶填答的約束校驗(yàn)及題目的邏輯跳轉(zhuǎn)功能。
1 系統(tǒng)設(shè)計(jì)
1.1 系統(tǒng)架構(gòu)
三層模式具有安全性高、維護(hù)成本低、各層之間耦合度較低等優(yōu)點(diǎn),因此本文采用了Web顯示層、業(yè)務(wù)邏輯層和數(shù)據(jù)層(即B/S/D)的三層模式架構(gòu),如圖1所示。
圖1 三層模式架構(gòu)
Web顯示層主要用于提供人機(jī)交互界面,本文中Web顯示層通過(guò)JavaScript腳本語(yǔ)言實(shí)現(xiàn)以下功能:接收用戶輸入數(shù)據(jù)、校驗(yàn)用戶輸入數(shù)據(jù)、向服務(wù)器回傳數(shù)據(jù)、根據(jù)用戶填答動(dòng)態(tài)生成下一題。
業(yè)務(wù)邏輯層主要接收客戶端請(qǐng)求并將數(shù)據(jù)傳給數(shù)據(jù)層,同時(shí)將處理結(jié)果返回至客戶端。本文在業(yè)務(wù)邏輯層采用三層開發(fā)框架RTC(RealThinClient SDK)。RTC采用HTTP 協(xié)議實(shí)現(xiàn)數(shù)據(jù)傳輸,具有效率高、穩(wěn)定性好等優(yōu)點(diǎn)。
數(shù)據(jù)層主要用于存儲(chǔ)系統(tǒng)使用過(guò)程中產(chǎn)生的數(shù)據(jù)。傳統(tǒng)的數(shù)據(jù)存儲(chǔ)方式主要采用Oracle、SQL Server、MySQL等關(guān)系型數(shù)據(jù)庫(kù),然而在大數(shù)據(jù)背景下,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在高并發(fā)讀寫、高效率存儲(chǔ)等方面越來(lái)越顯得力不從心[1]。鑒于重慶市基礎(chǔ)教育質(zhì)量監(jiān)測(cè)教師問(wèn)卷調(diào)查系統(tǒng)要在兩小時(shí)內(nèi)完成數(shù)萬(wàn)名教師問(wèn)卷調(diào)查,在高頻率的數(shù)據(jù)讀寫操作中,為了保證系統(tǒng)的穩(wěn)定性,本文采用了并發(fā)性高、靈活性強(qiáng)、支持海量數(shù)據(jù)存儲(chǔ)的NoSQL(Not-Only SQL)存儲(chǔ)系統(tǒng)MongoDb[9]。
1.2 數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)
MongoDb以keyvalue形式存儲(chǔ)數(shù)據(jù)。相比于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)庫(kù)、表(table)、記錄(record)3個(gè)層次,MongoDb則由數(shù)據(jù)庫(kù)、集合(collection)、文檔對(duì)象(Documentoriented、BSON)3個(gè)層次組成[2],其中MongoDb中的collection對(duì)應(yīng)于關(guān)系型數(shù)據(jù)庫(kù)里的table。
與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在使用前必須定義數(shù)據(jù)存儲(chǔ)模型不同,MongoDb的數(shù)據(jù)存儲(chǔ)模式是自由的(schemafree),即在同一個(gè)collection里可以有不同格式或類型的文檔對(duì)象[3]。MongoDb中一個(gè)collection的實(shí)例如下:
{"_id":"1","USERNAME":"Tom","PASSWORD":"123456"}
{"_id":"2","USERNAME":"LILY","AGE":"10","GENDER":"female"}
{"_id":"3","USERNAME":"Peter","PWD":11111}
雖然MongoDb的數(shù)據(jù)存儲(chǔ)模式自由,但在一般情況下,為了便于數(shù)據(jù)管理,同一個(gè)集合內(nèi)的文檔對(duì)象都會(huì)以相同格式定義存儲(chǔ)。結(jié)合重慶市基礎(chǔ)教育質(zhì)量監(jiān)測(cè)教師問(wèn)卷內(nèi)容及網(wǎng)絡(luò)問(wèn)卷調(diào)查的特點(diǎn),本文設(shè)計(jì)了以下幾個(gè)集合:用戶集合(USER_INFO)、問(wèn)卷集合(SURVEYS)、問(wèn)卷題目集合(SURVEY_QUESTIONS)、結(jié)果集合(SURVEY_ANS)。用戶集合主要存儲(chǔ)教師相關(guān)信息,包括教師登錄問(wèn)卷系統(tǒng)所需的賬號(hào)和密碼。問(wèn)卷集合用于存儲(chǔ)問(wèn)卷基本信息,包括問(wèn)卷、問(wèn)卷指導(dǎo)語(yǔ)以及問(wèn)卷其它相關(guān)屬性。問(wèn)卷題目集合用于存儲(chǔ)每套問(wèn)卷所包含的題目信息,包括、題目類型(本文設(shè)計(jì)了單選、多選、填空、問(wèn)答4種題型),以及單選或多選類型問(wèn)題中可供選擇的選項(xiàng)信息、填答約束規(guī)則、跳轉(zhuǎn)邏輯設(shè)置等。結(jié)果集合則用于存放回收的調(diào)查數(shù)據(jù),其結(jié)構(gòu)根據(jù)問(wèn)卷題目動(dòng)態(tài)生成。
2 關(guān)鍵技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
2.1 數(shù)據(jù)傳輸格式
在大規(guī)模、高并發(fā)的Web系統(tǒng)應(yīng)用中,選擇一種合適的數(shù)據(jù)傳輸格式至關(guān)重要。JSON (JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,易于閱讀和編碼,同時(shí)它是JavaScript規(guī)范的子集[8],因此能很好地被大部分瀏覽器解析,避免了不同瀏覽器帶來(lái)的兼容性問(wèn)題。另一方面,JSON在數(shù)據(jù)傳輸效率方面明顯優(yōu)于其它數(shù)據(jù)傳輸格式[4,5]。另外,本文所采用的MongoDB數(shù)據(jù)庫(kù)以BSON格式存儲(chǔ),而BSON是一種類JSON二進(jìn)制形式的存儲(chǔ)格式,兩者之間轉(zhuǎn)換較為容易。鑒于以上幾點(diǎn),本文選擇JSON作為問(wèn)卷系統(tǒng)的數(shù)據(jù)傳輸格式。
以下是以JSON描述一道題目的示例:
{
"ID" : "1",
"TITLE" : "目前,您正在使用的手機(jī)是什么品牌?",
"OPTIONS":"1=IPhone;2=三星;3=華為;4=聯(lián)想;5=其它",
"TYPE" : "多選題",
"ATTACH" : "2;2;;5,6;",
"ISREQUIRED" : "1",
"CONSTRAIN": "{'atype':'multchoise','minc':'1','maxc':'2','mutex':'5'}"
}
該JSON對(duì)象包括7個(gè)元素:①題目編號(hào)(ID)為1;②題目(TITLE)為“目前,您正在使用的手機(jī)是什么品牌?”;③選項(xiàng)(OPTIONS)一共包括“IPhone、三星、華為、聯(lián)想、其它”等5個(gè)選項(xiàng),其對(duì)應(yīng)的選項(xiàng)值分別為“1、2、3、4、5”,5個(gè)選項(xiàng)以“;”連接;④題目類型(TYPE)為多選題;⑤附加題(ATTACH)存儲(chǔ)題目的跳轉(zhuǎn)邏輯;⑥是否必做題(ISREQUIRED)值為1時(shí)表示必做,0表示選做;⑦填答約束(CONSTRAIN)為此題的填答規(guī)則。
2.2 填答約束
為了減輕后期對(duì)問(wèn)卷調(diào)查結(jié)果數(shù)據(jù)的清理工作,需要對(duì)用戶填答的數(shù)據(jù)格式加以約束才能確?;厥諗?shù)據(jù)格式的統(tǒng)一,因此在問(wèn)卷發(fā)布前需要設(shè)置好問(wèn)題的填答規(guī)則。
上文介紹了題目JSON數(shù)據(jù)中CONSTRAIN元素為題目的填答規(guī)則。本文通過(guò)對(duì)CONSTRAIN值的解析,調(diào)用相關(guān)校驗(yàn)功能實(shí)現(xiàn)對(duì)用戶輸入的約束。若題目無(wú)需對(duì)用戶輸入進(jìn)行約束,則該元素對(duì)應(yīng)值為空。
題目的填答規(guī)則由問(wèn)卷編制人員根據(jù)實(shí)際情況進(jìn)行動(dòng)態(tài)設(shè)置。本文采用模塊化思想,對(duì)用戶填答校驗(yàn)部分進(jìn)行模塊化設(shè)計(jì),傳入約束規(guī)則、填答結(jié)果以及題目相關(guān)信息即可獲得用戶填答的校驗(yàn)結(jié)果,如圖2所示。
圖2 問(wèn)卷填答校驗(yàn)?zāi)K
下面分別以填空題、多選題為例介紹對(duì)用戶填答約束的實(shí)現(xiàn)方法。
(1) 填空題的填答規(guī)則主要用于約束用戶輸入為統(tǒng)一格式的值。
如:你的年齡?
若此題沒(méi)有設(shè)置填答規(guī)則,用戶的填答可能會(huì)五花八門:30、30歲、三十歲、30、200等各種格式甚至是非合理的答案,要使填答結(jié)果統(tǒng)一為合理的英文數(shù)字,且對(duì)于教師而言年齡段一般在18到70歲之間,這道題的填答規(guī)則可設(shè)置如下:{'atype':'integer','minvalue':'18','maxvalue':'70'},這個(gè)規(guī)則中atype表示只允許用戶填答整數(shù),minvalue表示允許用戶輸入的最小值為18,maxvalue則表示允許輸入的最大值為70。通過(guò)設(shè)置這一規(guī)則,可以約束用戶的輸入只能為介于18~70之間的整數(shù)。若無(wú)需限制用戶輸入的最小值或最大值,則可通過(guò)將minvalue或maxvalue對(duì)應(yīng)的值設(shè)為空來(lái)實(shí)現(xiàn)。
同樣,如果要約束填答結(jié)果為小數(shù),則設(shè)置規(guī)則中的atype為number,如果填答結(jié)果為時(shí)間格式,則設(shè)置atype為date,并可以通過(guò)設(shè)置mindate和maxdate的值限制用戶輸入的時(shí)間范圍。
圖3為此題對(duì)應(yīng)的效果圖。
(2)多選題的填答規(guī)則主要包括限制用戶選擇選項(xiàng)的個(gè)數(shù)以及互斥選項(xiàng)的設(shè)置。以2.1中的題目為例,該題的填答規(guī)則為:{'atype':'multchoise','minc':'1','maxc':'2','mutex':'5'} 。該規(guī)則中atype值為multchoise,表示此規(guī)則為多選題的約束規(guī)則;minc值為1,表示最少需要選擇一個(gè)選項(xiàng);maxc值為2,表示最多只能選擇兩個(gè)選項(xiàng);mutex為互斥選項(xiàng),其對(duì)應(yīng)的值為某一選項(xiàng)值,表示該選項(xiàng)不能與其它選項(xiàng)同時(shí)被選中。若此題沒(méi)有互斥題,mutex對(duì)應(yīng)的值則為空。在多選題約束規(guī)則中,minc對(duì)應(yīng)的值應(yīng)大于等于1且小于等于maxc對(duì)應(yīng)的值,而maxc對(duì)應(yīng)的值則應(yīng)大于等于minc對(duì)應(yīng)的值而小于等于選項(xiàng)的個(gè)數(shù)。
圖4為此題對(duì)應(yīng)的效果圖。
圖3 填空題填答約束效果
圖4 多選題填答約束效果
2.3 邏輯跳轉(zhuǎn)
隨著問(wèn)卷內(nèi)容的多樣化,邏輯跳轉(zhuǎn)逐漸成為了網(wǎng)絡(luò)問(wèn)卷調(diào)查系統(tǒng)的重要功能之一。邏輯跳轉(zhuǎn)的主要思想是在用戶填答問(wèn)卷時(shí),系統(tǒng)能夠根據(jù)被訪者當(dāng)前題目的答案和編制問(wèn)卷時(shí)定制的跳轉(zhuǎn)邏輯動(dòng)態(tài)地生成下一題,以供用戶繼續(xù)作答[6]。
本文通過(guò)對(duì)相關(guān)題目設(shè)置附加題的形式實(shí)現(xiàn)題目邏輯跳轉(zhuǎn)的控制。在問(wèn)卷發(fā)布前首先將問(wèn)卷題目分為兩類:一類是必做題,另一類是附加題。必做題指在用戶填答過(guò)程中必須回答的題,它不依賴于其它題目而出現(xiàn);附加題則不一定出現(xiàn)在用戶填答過(guò)程中,它的出現(xiàn)依賴于用戶對(duì)其它題目的填答及跳轉(zhuǎn)邏輯。以圖5所示的例子解釋本文的邏輯跳轉(zhuǎn)設(shè)計(jì)思想。
圖5中,問(wèn)卷共有5道題,其中只有題目一為必做題,題目二、三、四、五均為附加題,題目二、三、四的出現(xiàn)依賴于用戶對(duì)題目一的填答及跳轉(zhuǎn)邏輯設(shè)定。若用戶在題目一中選擇的答案為A,那么下一道題則為題目三;若選擇了B,下一道題為題目二;若選擇C,則下一道題為題目四;若選擇D,則題目二、三、四均不出現(xiàn)而直接結(jié)束問(wèn)卷;同樣,當(dāng)用戶對(duì)題目三的填答符合跳轉(zhuǎn)邏輯,則系統(tǒng)動(dòng)態(tài)生成題目五。
圖5 問(wèn)卷填答流程
選擇題和填空題的跳轉(zhuǎn)邏輯有所區(qū)別,選擇題的跳轉(zhuǎn)是在用戶選擇設(shè)定了邏輯跳轉(zhuǎn)指令選項(xiàng)后進(jìn)行,而填空題跳轉(zhuǎn)則在用戶填答的答案滿足邏輯跳轉(zhuǎn)條件后進(jìn)行。2.1中介紹了題目JSON中ATTACH元素存儲(chǔ)題目跳轉(zhuǎn)邏輯,根據(jù)選擇題和填空題的填答差異,本文分別設(shè)計(jì)了選擇題和填空題的跳轉(zhuǎn)邏輯格式。下面分別介紹選擇題和填空題邏輯跳轉(zhuǎn)的實(shí)現(xiàn)方式:
(1) 選擇題的ATTACH中存儲(chǔ)的是每個(gè)選項(xiàng)對(duì)應(yīng)的附加題題號(hào),當(dāng)用戶選擇了某個(gè)或某幾個(gè)選項(xiàng)后,下一道題則根據(jù)選中選項(xiàng)對(duì)應(yīng)的附加題題號(hào)動(dòng)態(tài)生成。本文將每個(gè)選項(xiàng)對(duì)應(yīng)的附加題題號(hào)以“;”相連,因此N個(gè)選項(xiàng)就對(duì)應(yīng)有N組附加題題號(hào)(若某個(gè)選項(xiàng)無(wú)附加題則留空,若有多個(gè)附加題則附加題題號(hào)以“,”隔開),在ATTACH存儲(chǔ)中就有N-1個(gè)“;”。
以2.1中的題目為例,該題共有5個(gè)選項(xiàng),因此ATTACH存儲(chǔ)有5組附加題題號(hào):第1個(gè)選項(xiàng)“IPHONE”和第2個(gè)選項(xiàng)“三星”對(duì)應(yīng)的附加題題號(hào)都為2,表示當(dāng)用戶選擇了第1或第2個(gè)選項(xiàng)后,下一道題將會(huì)是第2題;第3和第5個(gè)選項(xiàng)對(duì)應(yīng)的附加題題號(hào)為空,則表示當(dāng)用戶選擇“華為”或“其它”選項(xiàng)后將不會(huì)有附加題而直接進(jìn)入下一題;第4個(gè)選項(xiàng)對(duì)應(yīng)的附加題題號(hào)為5和6,表明當(dāng)用戶選擇了“聯(lián)想”選項(xiàng)后,系統(tǒng)將第5題和第6題附加到此題之后。
(2) 填空題的ATTACH中存儲(chǔ)的則是跳轉(zhuǎn)邏輯表達(dá)式,其語(yǔ)法規(guī)則是:表達(dá)式=附加題題號(hào),即當(dāng)用戶的答案滿足了表達(dá)式后則下一道題為附加題題號(hào)對(duì)應(yīng)的題目。
如:>0&&<50=10,20表示如果輸入的答案介于0~50之間則在其后附加第10題和第20題。
本文問(wèn)卷生成步驟如下:
Step1:初始化題目數(shù)組QusArray并將數(shù)組下標(biāo)QusIndex設(shè)為0,將問(wèn)卷中所有必做題按題號(hào)順序裝入至QusArray中。
Step2:若QusIndex=length(QusArray),則結(jié)束此次問(wèn)卷;否則生成QusArray[QusIndex]題號(hào)對(duì)應(yīng)的題目。
Step3:校驗(yàn)用戶輸入。若校驗(yàn)失敗,提示用戶校驗(yàn)信息;否則,保存當(dāng)前答案并且進(jìn)行INC(QusIndex),同時(shí)根據(jù)答案和題目的跳轉(zhuǎn)邏輯判斷是否有附加題,若有附加題且題號(hào)不存在于QusArray中,則將附加題依次插入到QusArray中,插入的起始位置為QusIndex+1,轉(zhuǎn)Step2。
3 結(jié)語(yǔ)
本文提出了一種支持邏輯跳轉(zhuǎn)及填答約束的網(wǎng)絡(luò)調(diào)查問(wèn)卷系統(tǒng)技術(shù)實(shí)現(xiàn)方法,通過(guò)對(duì)題目設(shè)置輸入約束規(guī)則實(shí)現(xiàn)了用戶填答結(jié)果的規(guī)范性、保證了數(shù)據(jù)的準(zhǔn)確性,從而大大減輕了后期數(shù)據(jù)清理工作量;另一方面,通過(guò)對(duì)相應(yīng)題目設(shè)置跳轉(zhuǎn)邏輯增強(qiáng)了問(wèn)卷的靈活性和適應(yīng)性。本方法已成功應(yīng)用于2013年重慶市基礎(chǔ)教育質(zhì)量監(jiān)測(cè)教師問(wèn)卷調(diào)查系統(tǒng)中,結(jié)果表明,該系統(tǒng)在問(wèn)卷靈活性、結(jié)果準(zhǔn)確性以及系統(tǒng)并發(fā)性上都能很好地滿足網(wǎng)上問(wèn)卷調(diào)查需要。