我们有一个网络应用程序,用户可以在其中参加在线考试。
考试管理员将创建一份问卷。一份问卷可以有很多问题。每个问题都是一个选择题 (MCQ)。
假设管理员创建了一个包含 10 个问题的问卷。用户尝试这些问题。现在,与真正的考试不同,用户可以多次尝试单个问卷。我们必须跟踪他的所有尝试。
例如
User_id Questionnaire_id question_id answer attempt_date attempt_no
1 1 1 a 1 June 2013 1
1 1 2 b 1 June 2013 1
1 1 1 c 2 June 2013 2
1 1 2 d 2 June 2013 2
现在也可能发生这样的情况,在用户尝试了两次相同的问题后,管理员可以从同一个调查表中删除一个问题,但用户的尝试历史记录仍应参考该问题,以便用户可以在其尝试历史记录中看到他的该问题,尽管管理员删除那个问题。
如果用户现在尝试这个更改后的问卷,他应该只会看到 1 个问题。
User_id Questionnaire_id question_id answer attempt_date attempt_no
1 1 1 a 3 June 2013 3
此外,在此用户修改部分问题后,用户尝试历史记录应显示修改前的问题,而任何新尝试都应显示修改后的问题。
我们如何在数据库级别进行管理?
我的第一直觉是,
对于删除,不要进行物理删除,只需使问题处于非活动状态,以便历史记录仍然可以跟踪用户尝试。
对于修改,为问题创建版本,每次新尝试都参考每个问题的最新版本,并在尝试时保留参考问题版本的历史记录。