2012-03-07 65 views
1

我試圖在數據庫中記錄測試/測驗分數。當可能有很多測試和用戶時,最好的方法是什麼?在MySQL中存儲測驗結果的最佳方法

這些是我考慮過的一些選項:我應該爲每個測驗和用戶創建一個新的列,還是這有其侷限性?這可能會很慢嗎?我應該爲每個用戶&測驗創建一個新行嗎?我應該堅持我原來的'用戶'數據庫,並在文本中進行編碼?

在計劃上詳細闡述一下:JavaScript測驗,用AJAX提交分數,然後腳本將它發送到數據庫。我是新的PHP,所以我不確定一個好的方法。

任何幫助將不勝感激:)這是一個學校的科學公平

回答

0

我想說創建數據庫表,也許一個列出所有學生(姓名,出生日期,學生證),然後一個爲所有測試(得分,日期,寫作)。你只會訪問數據庫,還是你的學生也可以訪問它?如果是後者,您需要確保創建準確的安全或「意見」,以確保學生一次只能看到自己的成績(不是每個人的成績)。

+0

我的想法是,學生可以得到他們的分數,也許老師也可以。我喜歡你的解決方案,所以我可以通過學生和測試搜索:D只是有點不確定最好的方式來解決問題 – MaxQ 2012-03-07 19:37:49

1

我會建議您的數據庫中的3個數據表:學生,測試和分數。

每個學生都需要有一個ID和任何其他名稱(名稱,dob等)的字段來記錄他們。 測試應該有ID和其他任何字段(名稱,日期,重量等)。 分數應該有學生證,考試ID和分數(任何其他)。

這意味着您可以查詢學生並加入分數表以獲取所有學生的分數。您也可以將這些結果加入測試表中,將標籤貼到每個分數上,並根據分數和權重計算分數。

或者,您可以查詢測試並加入分數,以獲得給定測試中的所有分數以獲取班級統計數據。

+0

謝謝!表設置:QuizUserId,QuizId,QuizScore,QuizTimestamp – MaxQ 2012-03-07 20:22:28

0

絕對不會創建動態列! (每個測驗都沒有列)。當他們沒有識別用戶(或者一般的任何表項)時,也向用戶表(或者任何表格)添加列是不好的事情......

這是normalization的一個很好的例子,你應該避免存儲任何冗餘行。要做到這一點,您需要創建3個表格,並且要創建foreign keys以確保分數始終引用現有用戶和測驗。例如: -

  1. users - idnicknamename
  2. quizzes - idquizNamequizOtherData
  3. scores - iduser_id(引用users.idquiz_id (ref。,(ref。quizzes.idscore

然後每名用戶競猜行添加到scores表。另外,您可以爲列user_idquiz_id創建UNIQUE密鑰,以禁止用戶完成一次以上的測驗。

這將是快速的,不會存儲冗餘(不需要的額外)數據。

要獲得id的測驗結果,例如誰的提交本測驗的人,從最高階到最低得分4和用戶信息,你會做的查詢,如:

SELECT users.*, scores.score 
FROM scores RIGHT JOIN users ON(users.id=scores.user_id) 
WHERE scores.quiz_id = 4 
ORDER BY score DESC 

我之所以正確的使用加盟這裏是因爲可能有網友認爲這樣做並不測驗,但是每一個得分始終有一個現有用戶&測驗(由於foreign keys

要獲得所有用戶的整體信息,測驗和分數,你會做這樣的事情:

SELECT * 
FROM quizzes 
LEFT JOIN scores ON(quizzes.id=scores.quiz_id) 
LEFT JOIN users ON(users.id=scores.user_id) 
ORDER BY quizzes.id DESC, scores.score DESC, users.name ASC 

BTW:如果你是PHP的新手(或者任何人閱讀本文),請使用PHP's PDO接口與你的數據庫進行通信:) AVOID的功能像mysql_query,至少使用mysqli_query,但爲了便於攜帶,我建議留在PDO中。