mysql - 哪种数据库设计适合复杂的测验应用程序?

标签 mysql database-design

目前我正在为一个复杂的测验应用程序设计一个数据库 (mysql) 架构。我目前正处于提问阶段,并且对表格设计有些挣扎。这是我到目前为止得到的:

问题

task

id  type        etc.
1   mpc
2   text-input
3   matching
4   fill-gaps

task_to_question

task_id     question_id
1           10
2           20
3           30
3           31
3           32
4           40

answer_set ->(task_to_question)

id  question_id answer_id   correct
1   10          100         1
2   10          101         0
3   10          102         0
4   10          103         0
5   20          100         1
6   20          200         1
7   30          100        (1)
8   31          300        (1)
9   32          301        (1)
10  40          100         1
11  40          400         1
12  40          401         1


addon

answer_set_id   gap_number
10               1
11               1  
12               2

这个想法是任务表只有一些基本信息和决定如何处理任务的类型字段。 所有任务都在同一张表中;每个任务都有一个或多个问题 (task_to_question),具体取决于类型,例如mpc 有一个问题,但是你必须匹配问题和答案的任务有 4 个问题。同样,每个问题都可以有多个答案 (answer_set) - 对于一个或两个单词的文本输入尤其重要。因此,即使在任务类型中,问题和答案的数量也是流动的。这当然可以在以后进行限制,也可以添加子类型。 最后一张表仅在任务类型不能由简单字段类型处理时才加入。在此示例中,我需要在“填充文本中的空白”任务中定义空白的顺序。这可以是一个插件表,甚至可以是针对不同任务类型的多个表(以减少开销)

我这样做的目的是尽可能多地重复使用文本字符串。因此,我可以为 mpc、输入、填补空白甚至部分匹配任务使用相同的问题文本和相同的答案字符串。同样,我认为收集自动完成字段的建议将很容易,而无需对重复项进行排序。

可是越想越觉得其实也太心塞了。我已经看到的问题是例如当一个问题只有正确答案或没有答案时,我已经有一些冗余 - 正确的列变得多余。而且我的答案必须是 varchar,即使我可能会添加其他问题类型。然后,当我有截然不同的任务类型时,我可能不得不加入更多的表,那么为什么不从一开始就使用单独的表呢? Ilias 基本上就是这样做的。摆脱每种类型的表格甚至是一个很大的优势吗?再一次,我将只有任务模型,它必须具有所有任务类型的所有处理程序,而不是单独的模型。

哇,文字太多了……好吧,我需要把它写下来才能看到完整的内容。仍然不太确定如何处理它。输入很高兴感谢!

编辑:另一件事...是我的问题,还是 answer_set 表引用 question_id 有点奇怪?这是正确的做法吗?

最佳答案

你似乎在寻找一般性的建议是想法而不是具体的答案,所以我会给你一些我的。

仔细考虑任务和问题之间多对多的需求。我对这种方法有一些担忧: * 当您想在特定任务的上下文中编辑问题时,可能会无意中使该问题对另一个任务无效。 * 是否可以根据上下文(任务)让不同问题的答案不同? * 多对多增加的开销可能与字符串的重用有关。

我不太了解您对表格进行子类型化的需求,所以我真的不能说。

关于mysql - 哪种数据库设计适合复杂的测验应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132099/

相关文章:

MySQL:重复数据或更多查询

MySQL 多重兴趣匹配问题

php - 当结果需要多个 JOIN 时优化对给定表的搜索

MySQL FULL JOIN 与 COUNT 和 GROUP BY

mysql - 什么 "other features"可以合并到火车数据库中?

database-design - 为什么使用多列作为主键(复合主键)

mysql - 组织数据库的最佳方法?

php - 哪种方式在数据库中存储和处理大量数据是合法的?将所有内容存储在一张表中还是通过 id(属性)为每个表创建新表?

php - 使用 group by 进行多个 mysql 查询

mysql - 从 SQL Server 迁移到 AWS Aurora