2011-08-20 88 views
3

此刻,我正在为一个复杂的测验应用程序设计数据库(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?这是做到这一点的正确方法吗?

回答

0

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

请仔细考虑多任务和问题之间的多对多需求。我对这种方法有一些担忧: *如果您想在特定任务的上下文中编辑问题,可能会无意中将该问题设置为另一项任务的无效。 *基于上下文(任务)的问题可能有不同的答案吗? *多对多的额外开销可能是重复使用字符串的问题。

我不太了解您需要进行子输入表格的操作,所以我不能真正说出来。