2008年8月20日 星期三

如何設計問卷系統?

  其實問卷系統和大多數的系統,都有著大同小意的功能,所以在此就不貲述。
  問卷系統最難處理的就是DataBase,讓User設計問卷時,要如何處理選項是很重要的,當然,如果你把選項訂成有最大上限(例:10個),那這麼一來資料庫的選項欄位只要設10個就行,但這並不是一個好方法,如果今天User,有11的選項,那不就掛點了,所以,如果把同一題的選項做成String並以符號分開(例:","),這樣字串就會變成AAA,BBB,CCC,這樣就可以存在同一個欄位,然後每次在輸出到頁面時,只要依分隔符號將字串切開,就可以正常輸出了。
  小弟在此舉一個最簡單的例子:


(將"題目"和"選項"拆成兩個Table,並以"編號"做關聯)
ps.還有令一種做法,此法為Johnny.Net大大所提出(小弟覺得很特殊):
把選項以二進位方式表示並且儲存為整數或長整數, 然後再放到資料庫裡面去。舉個例子, 假設有一個題目如下:
(1) 請問 blah blah blah...
□ AAA, □ BBB, □ CCC, □ DDD, □ EEE, □ FFF, □ GGG, □ HHH, □ III, □ JJJ

假設獲得的回答是

□ AAA, ■ BBB, □ CCC, □ DDD, ■ EEE, □ FFF, □ GGG, ■ HHH, □ III, ■ JJJ

那麼你就把答案轉換成 0100100101B, 結果變成 125H 或 293。一個 int32 整數的最大值是 2147483647, 或是 7FFFFFFFH, 或是 1111111111111111111111111111111B; 換句話說, 一個問題最多可以儲存 31 個項目的回答 (我覺得應該不會有人願意回答超過 31 個選項的問卷吧? 如果真的有, 則可以採用 bigint/int64), 只會佔用一個整數, 而數值互換的運算速度也很快, 應該不會造成系統什麼負擔。
使用這種方法, 無論單選或複選都同樣適用, 邏輯也相同。
此外, 在針對資料庫中的答案做統計時, 只需要下指令計算該欄位數字除以 2 的 N 次方的餘數是 0 還是 1, 就知道某個項目有多少人勾選, 例如:

(
@pow int
)
AS
BEGIN
SELECT COUNT(*) AS totl
FROM tblMyDataBase
WHERE (fieldA % POWER(2, @pow) = 1)
END

資料來源:
http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3768982&SiteID=14

沒有留言: