0.模塊數據庫
近日對在線考試系統有些想法,因此寫下來和你們討論一下,順便本身也記錄一下這些想法。json
在線考試系統大體有這幾部份內容,下面逐一分析這些模塊和需求瀏覽器
1.試題庫緩存
建立試題庫的意義在於根據知識點建立試題,好比建立一個期中的考試,只須要在試題庫中選擇知識點1,2。而期末考試須要選擇知識點1,2,3,4。這樣相似將試題分組更有利於試題的重複的利用,建立試卷配置中也能更快的找到試題。服務器
而後分析一下試題的類型,實際生活中試題類型基本有這幾種:單選,判斷,多選,填空,問答,做文。前3種題型是能夠經過判斷自動打分的,後三種只能經過人工閱卷。實際在線考試中不多用到後三種的試題,而且必然消耗大量的人力改卷。因此在這裏只考慮單選,判斷,多選的考試試題類型。異步
試題選項和答案Json的形式保存在試題表中的,主要考慮到這些選項並不經常使用也不多關於選項的查詢,因此試題表不須要在多餘的選項表,試題在編輯的和瀏覽操做能夠經過反序列化json內容。最重要的是當生成試卷的時候這些選項json是要複製起來至關方便,這樣避免當試卷生成之後,試題被修改形成試卷邏輯混亂。性能
2.試卷配置spa
這個模塊是系統中最重要的模塊,配置一張試卷的流程以下 。blog
(要注意的是,生成的試卷JSON結果集合不能修改可是能夠停用試卷,防止學員考過之後的試卷被修改,形成以前的數據和當前的不匹配)內存
討論:在線考試系統的性能瓶頸在於,大批量學員同時開始考試時,系統配卷消耗大量的性能。個人處理方式是全部的試卷都預先生成,教師能夠選擇隨機由系統組卷仍是手動組卷。系統組卷設置一個組卷份數好比100份,當1000個學生同時進入考試時,將1000張試卷隨機分配一張給學員,生成的份數越多隨機率越高.若是教師只想給讓全部學員考同一份試卷,只須要手動組一張試卷便可。
3.學員
學員是參與考試的主體,學員經過註冊或者是後臺導入的方式進入系統。若是是註冊還須要對應的審覈功能。學員有兩種方式參加考試和練習,一種是主動選擇這張考卷,一種是被推送這張考卷,只有被推送的學生才能能參加考試。有些比較複雜的系統還會有考試的預先報名。經過審覈之後才能獲取考試的權限。
學員的表結構相對簡單沒什麼可討論的,只是建議學員的主表應該和登陸表分開,學員應該能夠支持多種帳號登錄,好比註冊郵箱、准考證、身份證等登陸方式。
4.考試過程
這裏咱們從學員進入考試提及,當學員點擊進入時,隨機分配一個試卷給學員。頁面加載試卷的內容。 而後開闢一個內存空間用hash形式保存學員根據「本次考試ID_試題ID」保存學員的本次考試的答題記錄,學員每次點擊選項,都向服務器提交本題的數據,提交數據時須要帶上時間戳,防止先提交的數據後到達。當學員不當心關閉頁面,或者電腦死機從新打開瀏覽器的時候,咱們將緩存中的數據顯示在頁面上,讓學員繼續考試。
改卷是一個異步的操做,後臺一個C/s程序實時掃描數據庫,查找已完成答卷而且未改卷的試卷,在內存中提取學員的考試數據一一比對,評卷完成之後將內存的答題內容序列化JSON保存起來(相似試題的保存方式,也能夠考慮保存成文本文件)。查看試卷時先加載試卷,而後加載學員的答卷內容。
5.Api
Api模塊經過REST的方式提供這幾個服務。