iT邦幫忙

0

PHP 問卷系統架構

今天想要寫一個可以給客戶自動擴充題目的問卷系統
題目除了標題外,下方的格式有 input, radio, checkbox, textarea
生成編輯部分沒有什麼問題,但怎麼樣存進資料庫取用目前還在想方式

方法一:將所有結構用區隔符號全部儲存至一個表單
假設區隔符號是 ###(當然實際操作時會用複雜一點的),那就是
tbl_question

field_id 1
field_title 問題A###問題B###
field_type input###radio
field_answer ###A,B,C

再用 ### 去拆陣列形成題目,答案用另外一個 table 儲存
tbl_answer
field_id 1
field_fk 1
field_answer 答案一###A,C

這樣的好處是資料表關聯性很簡便,但有一個很大的問題就是,如果修改問卷刪除了某個題目或移動了順序,那答案撈出來的順序就會錯亂

方法二:每個問題都各自存成結果
tbl_question

field_id = 1
field_fk abc
field_title 問題A
field_type input
field_items

field_id 2
field_fk abc
field_title 問題B
field_type radio
field_items A,B,C

tbl_answer

field_id 1
field_fk 1
answer_column 答案一

field_id 2
field_fk 1
answer_column 答案二

field_id 3
field_fk 2
answer_column A,C

這樣的好處是題目怎麼變動都不會影響答案的撈取結果,缺點是答案撈取方式複雜,不能用一隻 sql 搞定,必須搭配 function 不斷的連線取得結果再組合,有多少題目就要取幾次,感覺挺消費挺高的,不知道是否有其他方法可以提供小弟參考

1 個回答

10
wiseguy
iT邦超人 1 級 ‧ 2012-03-13 00:13:00
最佳解答

第一種解法不好。如果你要用分隔字元,倒不如用 php serialize、XML、json 三種其中一種還比較好。其中 XML 欄位,很多資料庫已經支援 SQL + XPath 查詢。

第二種解法比較普遍,你說的問題,通常會把答案種類就拆成幾個 table。比如有單選、複選、填充三種,那就用三種不同 table 去存答案。為什麼要這樣做?因為既然是問卷,最重要的是答案的統計,不會是個人選了什麼。

除非你要做的是考卷,那麼就會有作答答案與標準答案的比對,這就更複雜,要考慮的問題更多。

我要發表回答

立即登入回答