此刻,我正在为一个复杂的测验应用程序设计数据库(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,input,fill-the-gap和部分甚至匹配任务的字符串。同样,我认为收集自动填充字段的建议非常容易,无需重复排序。
但是越想想它,我越觉得它实际上太过分了。我已经看到的问题是当问题只有正确或没有答案时,我已经有一些冗余 - 正确的列变得多余。我的答案必须是varchar,即使我可能会添加其他问题类型。然后,当我拥有完全不同的任务类型时,我可能不得不加入更多的表格,那么为什么不从一开始就使用单独的表格呢?这基本上是在伊利亚斯完成的。在摆脱每种类型的桌子方面它甚至是一个很大的优势?然后再次,我将只有任务模型必须具有所有任务类型的所有处理程序,而不是单独的模型。
哇,这是很多文字......好吧,我需要写下来看看它的全部。仍然不太确定如何处理它。输入很高兴赞赏!
编辑:另一件事......是只是我,或者它有点奇怪,answer_set表引用question_id?这是做到这一点的正确方法吗?