为在线评估设计数据库的更好方法

时间:2016-06-17 07:41:18

标签: mysql sql database database-design database-schema

我正在研究在线考试模块,最初我创建了数据库,当问题的数量得到修复时它工作正常,在我的情况下我有10个问题和多个用户,现在要求是不同的我想要进行50个问题的考试,那么我该怎么做,或者管理员可以根据要求改变问题的数量

CREATE TABLE `test_sheet` (
`user_id` varchar(200) NOT NULL,
`q1` int(10) DEFAULT '0',
`q2` int(10) DEFAULT '0',
`q3` int(10) DEFAULT '0',
`q4` int(10) DEFAULT '0',
`q5` int(10) DEFAULT '0',
`q6` int(10) DEFAULT '0',
`q7` int(10) DEFAULT '0',
`q8` int(10) DEFAULT '0',
`q9` int(10) DEFAULT '0',
`q10` int(10) DEFAULT '0',
`ip_address` varchar(100) DEFAULT 'Not Available',
`score` int(50) DEFAULT NULL,
`start_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`random_question` varchar(500) DEFAULT NULL,
`passedTime` varchar(500) DEFAULT NULL,
`remainTime` varchar(500) DEFAULT NULL,
`last_update_time` varchar(500) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

现在就像这样的test_sheet表

insert  into `test_sheet`(`user_id`,`q1`,`q2`,`q3`,`q4`,`q5`,`q6`,`q7`,`q8`,`q9`,`q10`,`ip_address`,`score`,`start_time`,`random_question`,`passedTime`,`remainTime`,`last_update_time`) values ('demo@123',0,0,0,0,0,0,0,0,0,0,'Not Available',0,'2016-06-11 14:46:52','1,5,4,2,3,10,9,7,6,8','59','5258','2016-06-11 14:47:25');

我有一个像这样的替代选项

User_ID   ||  Q_ID    ||  ANS_ID 
demo@123  ||    1     ||   4
demo@123  ||    2     ||   3
demo@123  ||    3     ||   2
demo@123  ||    4     ||   4
demo@123  ||    5     ||   1
Xyzz@123  ||    1     ||   2
Xyzz@123  ||    2     ||   4
Xyzz@123  ||    3     ||   2
Xyzz@123  ||    4     ||   1
Xyzz@123  ||    5     ||   3

现在我有50个或更多的问题,考试的用户可能是300,所以行数约为15000或更多,所以更好的方法或任何其他想法

1 个答案:

答案 0 :(得分:1)

您的“备用选项”非常完美。您使用第二个表格来获得答案: ExamID,UserID,QuestionID,AnswerID。如果一个用户可以再次使用相同的问题填写测试表,则ExamID很重要。

稍后您可以使用其他一些信息扩展它,例如answer-duration等。

我会创建两个表来存储结果(可能是语法不是korrekt,我通常使用MS-SQL):

CREATE TABLE test_sheet
    (
    test_id int NOT NULL,
    user_id varchar(200) NOT NULL,
    ip_address varchar(100) NULL,
    score int NULL,
    start_time timestamp NULL,
    passed_time int,
    remain_time int,
    ...
    PRIMARY KEY (test_id)
    )

CREATE TABLE test_sheet_answer
    (
    test_id int NOT NULL,
    question_id int NOT NULL,
    question_order int NOT NULL,
    answer_id int NULL,
    answer_duration int DEFAULT(0),
    PRIMARY KEY(test_id, question_id)
    )

已编辑:使用test_sheet_answer表存储问题的随机顺序。在开始时,您可以使用随机顺序填充表中的空行。如果问题尚未得到解答,请将其存储在answer_id NULL或0中。