7

细节

我有一个测验(我们称之为 quiz1)。Quiz1 每次生成时都使用相同的词表。如果用户需要,他们可以跳过单词来完成测验。我想将那些跳过的单词存储在 mysql 中,然后对它们进行统计。

起初我打算将错过的单词作为字符串存储在一列中。每个单词都用逗号分隔。

|testid |       missedwords                     | score     |   userid  |
*************************************************************************
| quiz1 | wordlist,missed,skipped,words         |  59       |   1       |
| quiz2 | different,quiz,list                   |  65       |   1       |

这种方法的问题是,我想在每次测验结束时显示参加测验的用户最常错过哪些单词的统计数据。
我假设将遗漏的单词存储在上面的一列中为此目的是低效的,因为我需要提取信息然后对其进行计数-(可能使用 php 进行计数-除非我将已计数的数据存储在单独的表中)。

然后我想也许我需要为遗漏的单词创建一个单独的表格下表的优点是应该很容易从下表中计算单词。

|Instance|  missed word     |
*****************************
|   1    |  wordlist        |
|   1    |  missed          |
|   1    |  skipped         |

另一种方法是我可以创建一个带有计数的表,并在每次进行 quiz1 时更新它。

Testid  |   wordlist|   missed| skipped| otherword|
**************************************************
Quiz1   |        1  |        1|       1| 0        |

这种方法的问题是我需要为每个测验使用不同的表格,因为每个测验将使用不同的单词。信息也丢失了,因为只保留了计数,而不是用户错过了哪些单词的相关数据。

问题

你会使用哪种方法?为什么?欢迎使用替代方法来完成此任务。如果您发现我的逻辑中有任何缺陷,请随时指出。

编辑 用户将能够根据需要多次重新参加测验。他们的信息不会更新,而是会为他们重新进行的每个测验创建一个新实例。

4

5 回答 5

3

最好的方法是让单词集合完全标准化。这样,分析将变得简单快捷。

quiz_words with wordID, word
quiz_skipped_words with quizID, userID, wordID

要获取用户的所有跳过的单词:

SELECT wordID, word 
FROM quiz_words 
JOIN quiz_skipped_words USING (wordID) 
WHERE userID = ?;

您可以添加一个 group by 子句来获得相同单词的组计数。

要获取特定单词的计数:

SELECT COUNT(*) 
FROM quiz_words 
WHERE word LIKE '?';
于 2013-04-24T08:26:39.530 回答
1

根据数据库规范化理论,第二种方法更好,因为理想情况下,一个关系表单元格应该只存储一个值,它是原子的且不可拆分的。每个单词都是一个实体实例。

另外,我可能建议不要创建Quiz-Word表,而是在表中保留另一列Missed-Word用于测验,为此指定了这个词,然后将此列用作Quiz表的外键。那么您可能会避免实时表生成(这是数据库设计中的“坏习惯”)。

于 2013-04-24T08:19:55.537 回答
1

为什么没有 quiz 表和 quiz_words 表,quiz_words 表会将 id、quizID、word 存储为列。然后为每个测验实例在 quiz_words 表中为用户使用的每个单词创建记录。

然后,您可以根据 quizID 和/或测验类型在 quiz_words 表上运行 mysql counts

于 2013-04-24T08:20:46.790 回答
1

您要实现的最佳解决方案(来自我的观点)是标准化方法:

  • test具有test_id列和其他列的表
  • missed_words具有id(AI PK) 和word(UQ) 的表,在这里您还可以有一个列,每次在表hits中建立与该单词的关联时,该列都应该增加,test_missed_words 这样您就拥有了您想要已经编译的统计信息并且您没有不需要从选择查询中计算它们
  • test_missed_words这是一个具有test_idmissed_word_id(复合PK)的链接表

这样您就没有多余的数据(遗漏的单词),并且您可以轻松提取所需的统计信息

于 2013-04-24T08:22:30.003 回答
1

保留尽可能多的信息(并且能够在以后编译特定于用户的统计信息以及现在的整体统计信息),我将创建一个类似于以下内容的表结构:

                  Stats
quizId  |   userId  |     type|    wordId|
******************************************
1       |        1  |   missed|         4|
1       |        1  |  skipped|         7|

Wheretype可以是int定义不同类型的操作,也可以是字符串表示 - 取决于您是否认为它可以更多。^^

然后:

     Quizzes
quizId  |  quizName|
********************
       1|    Quiz 1|

使用为每个测验制作的单词列表,例如:

     WordList (pk: wordId)
quizId  |   wordId|   word|
***************************
      1 |       1 |    Cat|
      1 |       2 |    Dog|

您可以随心所欲地拥有您的user桌子,我们只是将其链接id到该系统。

这样,所有id字段都将是表中的非唯一键stats。当用户跳过或遗漏一个词时,您会将id该词的stats与相关的quizId和一起添加到表中type。以这种方式获取统计数据将使作为per-user基础、per-word基础或per-type基础——或三者的组合变得容易。它还将使每个测验的单词列表以及用于制作测验的容易获得。^^

希望这可以帮助!

于 2013-04-24T08:35:58.550 回答