试卷随机题目随机选项数据库设计


试卷生成

如何做到试卷的题目选项随机:

最近接到一个需求,就是根据题库中的题目,生成试卷,不过有随机题目这种生成,可以选择多种要求,例如: 各个题型的数量要求,题目乱序,选项乱序。

针对此需求,数据库表结构该如何设计,实现呢?


一、设计思路

  1. 首先题目的录入应该考虑,答案不能固定,应该考虑根据答案的需要来确定题目的正确性,然后选项乱序后,仍然可以根据序号,来确定正确答案
  2. 选项乱序后的展示效果, 例如 选项为 ABCD ,乱序后其实也应该为ABCD ,不过每个选项内容要变,所以这里也采用顺序来处理,而非固定值
  3. 根据题目生产试卷后,移除题目,应该不影响历史试卷,所以这里应该考虑采用一种快照方式,将题目保存到试卷中,而且要做到乱序后,明确正确答案
  4. 根据题目生产试卷后,修改题目,应该考虑已经生成的试卷,应该同步修改这个被修改过的题的题目内容或者选项

二、具体表设计

这里大概一共有如下几张表: 题目表,题目选项表,试卷表,试卷题目关系表

题目表

CREATE TABLE `question` (
  `id` bigint(20) NOT NULL COMMENT '问题id',
  `title` mediumtext NOT NULL COMMENT '题干',
  `question_type` varchar(55) DEFAULT NULL COMMENT '试题类型 单选 多选 填空 主观题',
  `analysis` mediumtext COMMENT '试题解析',
  `answer_order` tinyint(2) DEFAULT '0' COMMENT '答案严格顺序:0-不需要 1-需要(只作用于填空题)',
  `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
  `del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='题目表';

题目选项表

CREATE TABLE `question_option` (
  `id` bigint(20) NOT NULL COMMENT '答案主键',
  `question_id` bigint(20) NOT NULL COMMENT '问题id',
  `content` varchar(255) DEFAULT NULL COMMENT '答案内容',
  `answer` tinyint(1) NOT NULL DEFAULT '0' COMMENT '正确答案: 0-否 1-是',
  `sort` int(4) DEFAULT NULL COMMENT '答案顺序',
  `del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='题目选项';

由于选项可以乱序,这里采用一对多实现题目和选项的关联,并标记正确答案,其中答案顺序sort与答案answer同样重要

试卷表

CREATE TABLE `assignment` (
  `id` bigint(20) NOT NULL COMMENT '试卷主键',
  `name` varchar(55) DEFAULT NULL COMMENT '考试名称',
  `score` int(4) NOT NULL DEFAULT '100' COMMENT '考试总分值',
  `mark` varchar(255) DEFAULT NULL COMMENT '作业要求',
  `question_order` tinyint(2) DEFAULT '0' COMMENT '题目顺序: 0-乱序 1-有序',
  `option_order` tinyint(2) DEFAULT '0' COMMENT '选项顺序: 0-乱序 1-有序 (单选,多选)',
  `del_flag` char(1) DEFAULT '0' COMMENT '0-正常,1-删除',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷';

试卷题目表

CREATE TABLE `assignment_item` (
  `id` bigint(20) NOT NULL COMMENT '题id',
  `assignment_id` bigint(20) NOT NULL COMMENT '试卷id',
  `question_id` bigint(20) NOT NULL COMMENT '问题id',
  `answer_json` text COMMENT '问题答案json:[{"optionId":1,"content":3,"answer":0},{"optionId":2,"content":4,"answer":1}]',
  `sort` int(2) NOT NULL DEFAULT '0' COMMENT '排序',
  `score` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '题目分值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='试卷题目';

这里采用answer_json 类似json的方式,记录每个题目的选项以及正确答案,处理方式更加灵活,可以做到即使乱序后,依然能知道正确答案,当然这json内容,也是根据之前的题目和选项生成的(乱序与否均可)


总结

如上就实现了对于目前需求的数据库设计,这里简单说下,前端展示的问题:

对于题目的展示

返回的数据为(题目–对应多个题目选项),前段可以根据选项遍历,展示选项内容,根据题目是否为正确答案,选择是否标记正确选项,而选项的项目名称例如: ABCD 这种应该忽略,弱化,按照顺序根据长度,遍历的时候,按照正常 A B C D 的顺序展示即可

对于试卷中的题目展示

其实与上面同理,不同的是,这次后端需要对于题目中的 answer_json解析,解析后数据格式仍然与上面的题目中的题目选项内容保持一致,所以依然展示选项的时候,还是根据选项的长度来展示 ABCD ,然后每个后边直接展示选项内容即可,选项的正确答案,依然根据answer 为1 处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞旅行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值