为在线评估设计数据库的更好方法
Better way to design database for online assesment
我正在开发在线考试模块,最初我已经创建了数据库并且当问题数量固定时它工作正常,在我的情况下我有 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_sheettable这样
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 或更多,所以更好的方法或任何其他想法是什么
你的 "alternate option" 很完美。您使用第二个 table 作为答案:
考试 ID、用户 ID、问题 ID、答案 ID。 ExamID 很重要,如果一个用户可以用相同的问题再次填写测试-sheet。
稍后您可以使用其他一些信息对其进行扩展,例如回答持续时间等
我会制作两个 tables 来存储结果(可能是语法不正确,我通常使用 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 table 来存储问题的随机顺序。一开始,您可以用随机顺序用空行填充 table 。如果问题还没有回答,存储在 answer_id NULL 或 0.
我正在开发在线考试模块,最初我已经创建了数据库并且当问题数量固定时它工作正常,在我的情况下我有 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_sheettable这样
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 或更多,所以更好的方法或任何其他想法是什么
你的 "alternate option" 很完美。您使用第二个 table 作为答案: 考试 ID、用户 ID、问题 ID、答案 ID。 ExamID 很重要,如果一个用户可以用相同的问题再次填写测试-sheet。
稍后您可以使用其他一些信息对其进行扩展,例如回答持续时间等
我会制作两个 tables 来存储结果(可能是语法不正确,我通常使用 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 table 来存储问题的随机顺序。一开始,您可以用随机顺序用空行填充 table 。如果问题还没有回答,存储在 answer_id NULL 或 0.