哪种方法最适合在mysql中存储以后将用于统计的单词列表?

Try*_*der 7 php mysql database

细节

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

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

|testid |       missedwords                     | score     |   userid  |
*************************************************************************
| quiz1 | wordlist,missed,skipped,words         |  59       |   1       |
| quiz2 | different,quiz,list                   |  65       |   1       |
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,我希望在每个测验结束时显示统计数据,这些统计信息包含了参加quiz1的用户最常错过的单词.
我假设如上所述将错过的单词存储在一列中对于此目的而言是低效的,因为我需要提取信息然后计算它 - (可能使用php计算 - 除非我将计算的数据存储在单独的表中).

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

|Instance|  missed word     |
*****************************
|   1    |  wordlist        |
|   1    |  missed          |
|   1    |  skipped         |
Run Code Online (Sandbox Code Playgroud)

另一种方法我可以用tally创建一个表,并在每次quiz1时更新它.

Testid  |   wordlist|   missed| skipped| otherword|
**************************************************
Quiz1   |        1  |        1|       1| 0        |
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是每个测验需要一个不同的表,因为每个测验都会使用不同的单词.此外,信息丢失是因为仅保留了计数而不是相关数据,例如哪个用户错过了哪些单词.

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

编辑 用户可以根据自己的喜好重复测验.他们的信息不会更新,而是为他们重新进行的每个测验创建一个新实例.

mar*_*kus 3

做到这一点的最佳方法是将单词集合完全规范化。这样,分析就会变得简单快捷。

quiz_words with wordID, word
quiz_skipped_words with quizID, userID, wordID
Run Code Online (Sandbox Code Playgroud)

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

SELECT wordID, word 
FROM quiz_words 
JOIN quiz_skipped_words USING (wordID) 
WHERE userID = ?;
Run Code Online (Sandbox Code Playgroud)

您可以添加一个 group by 子句来对同一单词进行分组计数。

要获取特定单词的计数:

SELECT COUNT(*) 
FROM quiz_words 
WHERE word LIKE '?';
Run Code Online (Sandbox Code Playgroud)