如果你想规范化数据,那么我会创建一些不同的表。
您的学生表看起来不错。通常,我对表格使用单数名称,而不是复数。
Student
-------
Student ID
Name
Email
...
这是测试表:
Test
----
Test ID
Test Name
...
我们使用连接表将学生与测试联系起来。
StudentTest
-----------
Student ID
Test ID
Test Started Timestamp
Test Duration
...
测试的时间和长度因学生而异,因此这些列包含在 StudentTest 表中。
问题表。
Question
--------
Question ID
Question Text
还有答案表。
Answer
------
Answer ID
Answer Text
现在事情变得棘手了。您可以像这样根据 ID 将问题分配给测试。
TestQuestion
------------
Test ID
Question ID
但是,如果您这样做,并且有人在测试后更改了问题文本,那么问题 ID 指向的问题与测试中的问题不同。
为了解决这个问题,我们创建这样的历史表:
QuestionHistory
---------------
QuestionHistory ID
Question Text
AnswerHistory
-------------
AnswerHistory ID
Answer Text
所以,我们这样创建 TestQuestion 表:
TestQuestion
------------
Test ID
QuestionHistory ID
然后将问题和答案复制到历史表格中。
出于类似的原因,我们这样创建 QuestionAnswer 表:
QuestionAnswer
--------------
QuestionHistory ID
AnswerHistory ID
Is Correct Answer
您的代码可以确保每个问题都有 4 个可能的答案。该数据库允许多于或少于 4 个可能的答案。
最后,我们将学生的答案与试题联系起来。
StudentQuestionAnswer
---------------------
Student ID
Test ID
QuestionHistory ID
AnswerHistory ID
Is Correct Answer
是的,此处重复了测试 ID 列。这样您就可以按考试以及参加考试的学生进行查询。
Is Correct Answer 字段在 QuestionAnswer 表和 StudentQuestionAnswer 表中具有不同的含义。在 QuestionAnswer 表中,Is Correct Answer 布尔值指向正确答案。在 StudentQuestionAnswer 表中,Is Correct Answer 布尔值表示学生正确回答了问题。
这应该是一个完整的问题/答案数据库。如果需要,您可以将测试与课程联系起来。