我一直在考虑如何设计一个数据库来保存一年多一点的考试题目(开关,大部分关闭)。
首先,简要介绍一下我所追求的内容。我想设计一个足够灵活的数据库来存储不同的问题类型(例如,简短回答或多项选择问题),并且能够选择任意数量的这些问题作为考试存储。
我的问题是:
如何存储考试题目?
由于不同的问题类型需要存储不同的字段,如果我将它们全部放在同一个表questions
下,则会有很多从未使用过的字段。
如果我将问题类型分成不同的表,那么将question_id存储在某个exam_questions
表中要困难得多,因为它们来自不同的表。
我也想不出一种灵活的方式来存储信息。
例如,
questions
- id
- question
- type (multiple choice, short response)
- choice_1 ( used for multiple choice questions)
- choice_2
- choice_3
- choice_4
- choice_5
- answer (short response answer here, or just a/b/c/d/e for multiple choice, t/f for true or false)
这样的设计会被推荐吗?如果没有,有人有任何建议吗?
我还有另一个问题:
如果我想将学生的答案存储到这些考试中,那么将它们存储起来效率是否低效?
exam_responses
- id
- student_id
- exam_id
- question_id or question_number
- response
- mark
提前谢谢你。如果您想要任何其他信息,或者此问题有任何问题,请给我留言,我会尽快修复。
答案 0 :(得分:11)
我会有单独的问答表,并使用question2answer表加入他们
question
--------
- id
- question
- type (multiple choice, short response)
answer
------
- id
- GUIorder (so you can change the sort order on the front end)
- answer
question2answer
---------------
- questionid
- answerid
现在,在构建问题方面,一切都是动态的,而且你没有空列。 快速联接可以让您回到主要问题的所有部分
您的exam_responses
表格现在可以包含以下内容
- id
- questionid
- answerid
- studentid
- response
- mark
答案 1 :(得分:2)
我认为在问题表中为每个响应存储五列并不是一个好的设计。如果问题的选择数量变为6,则必须再添加一列。此外,如果只有两个选项,其余列将保持为空。所以最好是在两个单独的表中:
questions
- id
- question
- type (multiple choice, short response)
- answer (short response answer here, or just a/b/c/d/e for multiple choice, t/f for true or false)
question_choices
- id
- question_id
- choice
然后,您可以根据 questions.id = question_chocies.question_id 条件加入每个特定问题的选项列表。
如果是考试答案,您也应该分成两个表格,以便不重复有关student_id,考试和考试每个问题的标记信息。所以它应该是这样的:
student_exam
- id
- student_id
- exam_id
- mark
student_exam_responses
- exam_id
- question_id or question_number
- response
可以根据 student_exam.id = student_exam_responses.exam_id 条件连接这两个表。