☆李游
(宜賓市一中,四川宜賓 644000)
為了提高教學質量,筆者一直想為學生編寫一個在線測試練習系統。在網上查詢了多篇關于試題庫結構設計的文章,大多討論的是試題系統設計方面的理論知識,討論從底層實現數據庫存儲的文章還比較缺乏,而真正把數據結構拿來分析的則更少了。經過一段時間的思考研究,筆者最終完成了試題庫系統的設計,現將里面使用到的題庫存儲數據結構拿出來與大家交流討論。
首先從題型結構分析,在日常各種類型考試中,我們經常見到的題型可以歸納為以下七種。
(1)判斷題——題型描述:判斷題是一種以對或錯來選擇的答案。一般表現為出一句話,然后在后面進行對錯的選擇,
例:柳宗元是唐代詩人? 正確 錯誤
(2)單項選擇——題型描述:題干給出一定的描述,然后在下面給出若干個備選項,要求考生把被選擇項進行比較,選出正確且符合題意的一個。
例:下列選項中哪位不是唐代的詩人?
A、李白 B、杜甫 C、陶淵明 D、高適
(3)多項選擇、不定項選擇——題型描述:題干給出一定的描述,然后在下面給出若干個備選項,要求考生把被選擇項進行比較,選出一個或多個符合題意的答案。
例:下面哪些詩人是唐代詩人。
A、白居易 B、陸游 C、洛賓王 D、王安石E、孟浩然
(4)配伍選擇題、連線題——題型描述:一般將題目分為若干組,備選項分為若干組,備選項可重復選用,也可不選用,每題只有1個最佳答案備選項相應。這類題型在醫學考試中經常出現。
例:請將下面詩人與所在朝代進行配對。
A、唐朝 B、宋朝 C、明朝 D、清朝
①柳宗元 ②賈仲明 ③陸游 ④朱熹 ⑤陳子龍
(5)填空題、填充題——題型描述:其形式大概為先給出已知條件,在而后的語句中空出要問的答案以橫線或括號代替,以此要求應試者填上正確解。
例:白居易是( )朝代的著名詩人。
(6)名詞解釋、簡答題、問答題、論述題——題型描述:這類題一般都是給出一個問題,要求考生用自己的語言對問題的理解進行闡述。
例:請談談唐代詩人以及他們詩歌的特點。
(7)綜合題——題型描述:將以上若干種題型組合起來形成一種綜合試題的結構。比如:語文、英語中的閱讀理解、公務員考試中的資料分析等題型,它是一種復合題,里面可能由填空、判斷、單選、簡答等多種題型的組合。
例:請閱讀下面詩句回答下面問題。
紅豆生南國,春來發幾枝?
愿君多采擷,此物最相思。
①此詩的標題是( ),作者是( )。
②作者所在的朝代是( )。
A、唐朝 B、宋朝 C、明朝 D、清朝
③此詩表明了作者什么樣的思想感情?
……
為了能對各個試題進行有效管理和高效利用,我們使用兩個表來存儲試題章節、專題(知識點)等內容。兩個表的數據結構相似。
以章節表為例進行介紹。ID為字符型,使用每兩位存儲一個大的分類級別,采用樹型結構存儲,可以進行幾十個層次的分類;ChapterName用來存儲章節的名稱;ParentID用來存儲父一級的章節ID,如果為空則為最頂級;Memo用來存儲章節說明,其數據結構如表1、表2所示。

表1

表2
為了讓試題庫有更好的靈活性,又能提高數據庫的處理效率,因此對于試題庫我們采用Question、Options、Answer三個表來儲存。
ID為自增字段用來唯一標識試題。
Content為文本類型,用來存儲試題的題干部份。由于綜合題的題干也存儲在這里,因此,它的字段長度要設置得夠大,至少能容納語文或英語中閱讀題的文章。對于填空題,由于填空內容是處于題干中的,所以,我們對每個需要填空的地方插入一個“【】”標記來處理。當出題程序識別出是填空題題型時,程序就會去搜索這個字段中“【】”的內容,替換成文本輸入框顯示在出題程序中,供用戶輸入填空內容。
Flag為題型標記字段,分別用1至7來標記試題的類型。1為判斷題,2為單選題,3為多選題,4為配伍題,5為填空題,6為簡答題,7為綜合題。
ParentQuestionID為數值型,用于記錄父級題目的ID編號。由于試題中配伍題、綜合題兩種試題它下面會有兩個或以上的子試題目,屬于復合型試題。通過這個標記可以讓每個子試題唯一對應一個父題目,而當標記為-1時,說明這個試題是獨立的試題。使用這種存儲結構可以輕易地表示出幾十上百個子試題出來。
ChapterID為字符型,它用于關聯章節表中的ID。
TopicID為字符型,它用于關聯專題表中的ID。

表3 Question表
ID為自增字段用來唯一標識備選項。
QuestionID為數值型用來存儲Question表題目的ID,從而標記選項是屬于哪個題目的。
Option為字符型或文本類型用于存儲選擇中的每個備選項。
這種數據結構特有的好處就是可以靈活處理選擇項的數量,無論是三項選擇還是六項的選擇,甚至幾十項的選擇都可以輕易表示出來。

表4 Options表
ID為自增字段用來唯一標答案。
QuestionID為數值型用來存儲Question表題目的ID,從而標記選項是屬于哪個題目的。
DifficultLevel為數值型,用來存儲試題的難易度,這個難易度是由試題錄入人員人工判斷的,作為題庫系統應該需要考慮存儲這個信息。
Answer為字符型,用來存儲試題的答案。
判斷題:使用0,1來標記正確和錯誤。
單選題:(包括配伍題里面的子題目)使用1,2,3,4……來表示A、B、C、D……
多選題:使用 1,2,3,4……來表示 A、B、C、D……,對于多選題中多于2個以上的選項只需要將每個選項序列依次排列即可,比如:134表示ACD。
填空題:如果一個題目有多個空需要回答,則每個填空對應的參考答案用特殊標記“●”來間隔,但對于多個一個空可能出現多個答案都是正確的情況比如:某個空填寫“唐代”或“唐朝”都算正確的話,就在每個備選答案之間用特殊標記“★”間隔。
簡答題:此處設置為空,直接使用后面的分析部分作為參考答案。
Right、Wrong為數值型,用來存儲客觀題測試時正確和錯誤的次數,從而更為精確地計算出難度系數。
Analysis為文本型,能存儲大量文字信息,用來存儲各個試題的分析。而主觀試題的分析也就是答案,直接存儲在這個字段即可。

表5 Answer表
本文詳細介紹了一種比較通用的試題庫系統的數據結構設計,并結合7種典型的題型詳細介紹了它們在數據庫中存儲結構。目前,已經將這個數據結構成功應用到我們的試題問答系統和在線測試系統中,具有較好的實用性和靈活通用性,程序執行效率也高,希望本文能為即將進行測試系統設計開發的朋友提供參考。另外,我們設計了一個信息技術教育考試網,數據庫就使用了這個結構,網址是<http://itedu.17ks.net/>,歡迎大家光臨。
[1]譚順平,盧瓊紅,胡曉燕.基于知識點的試題庫建設研究[J].廣西教育,2011,(27).
[2]葉文,試題庫的研究與開發[J]科技致富向導,2011,(30).