最近遇到个需求需要设计个问卷调查,包括发布问卷、选择题型、提交问卷、统计选择题的选项概率,所以就简单设计了下。(备注:无题库概念)
1、数据库设计
问卷信息表
DROP TABLE IF EXISTS `t_survey_info`;
CREATE TABLE `t_survey_info` (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`description` longtext COMMENT '描述',
`is_read_only` varchar(1) DEFAULT NULL COMMENT '是否只读 1 是 0 否',
`del_flag` varchar(255) DEFAULT NULL COMMENT '是否有效 0 否 1 是',
`is_load` varchar(1) DEFAULT NULL COMMENT '上下架 0 否 1 是',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`operate_user` varchar(255) DEFAULT NULL COMMENT '操作用户',
`begin_time` varchar(100) DEFAULT NULL COMMENT '开始时间',
`end_time` varchar(100) DEFAULT NULL COMMENT '结束时间',
`link_url` varchar(255) DEFAULT NULL COMMENT '问卷地址',
`link_key` varchar(255) DEFAULT NULL COMMENT '问卷key',
PRIMARY KEY (`id`) USING BTREE,
KEY `INDEX_LINK_KEY` (`link_key`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='问卷信息表';
问卷题目表
DROP TABLE IF EXISTS `t_survey_question`;
CREATE TABLE `t_survey_question` (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`question_title` varchar(255) DEFAULT NULL COMMENT '问题标题',
`question_type` varchar(255) DEFAULT NULL COMMENT '问题类别(单选 多选 问答)',
`question_content` longtext COMMENT '问题内容(单选 多选)',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`operate_user` varchar(255) DEFAULT NULL COMMENT '操作用户',
`del_flag` varchar(1) DEFAULT NULL COMMENT '是否有效 0 否 1 是',
`is_load` varchar(1) DEFAULT NULL COMMENT '上下架 0 否 1 是',
`is_required` varchar(1) DEFAULT NULL COMMENT '是否必填 0 否 1 是',
`survey_id` bigint(30) DEFAULT NULL COMMENT '问卷Id',
`order_sort` int(10) DEFAULT NULL COMMENT '排序字段',
`total_num` int(10) DEFAULT NULL COMMENT '数量',
PRIMARY KEY (`id`) USING BTREE,
KEY `INDEX_SURVEY_ID` (`survey_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='问卷问题表';
问卷题目选项表
DROP TABLE IF EXISTS `t_survey_item`;
CREATE TABLE `t_survey_item` (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`question_id` bigint(30) DEFAULT NULL COMMENT '问题Id',
`survey_id` bigint(30) DEFAULT NULL COMMENT '问卷ID',
`total_num` int(20) DEFAULT NULL COMMENT '总数量',
`question_type` varchar(100) DEFAULT NULL COMMENT '问题类别',
`choice_content` varchar(100) DEFAULT NULL COMMENT '选择内容',
`percent_num` varchar(20) DEFAULT NULL COMMENT '百分比',
`choice_key` varchar(100) DEFAULT NULL COMMENT '内容key',
PRIMARY KEY (`id`) USING BTREE,
KEY `INDEX_QUESTION_ID` (`question_id`) USING BTREE,
KEY `INDEX_SURVEY_ID` (`survey_id`) USING BTREE,
KEY `INDEX_CHOICE_INDEX` (`choice_content`,`question_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=160 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='问卷题目选项表';
问卷答案表
DROP TABLE IF EXISTS `t_survey_answer`;
CREATE TABLE `t_survey_answer` (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`question_id` bigint(30) DEFAULT NULL COMMENT '问题Id',
`survey_id` bigint(30) DEFAULT NULL COMMENT '问卷ID',
`choice_content` varchar(3000) DEFAULT NULL COMMENT '选择(填写内容)',
`user_id` varchar(30) DEFAULT NULL COMMENT '用户ID',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户名称',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`question_type` varchar(255) DEFAULT NULL COMMENT '问题类别',
`phone` varchar(100) DEFAULT NULL COMMENT '手机号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `INDEX_QUESTION_ID` (`question_id`,`survey_id`,`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='问卷答案表';
2、关键逻辑点
获取问卷信息频繁,增加缓存
问卷重复提交,利用redis increment以及前端置灰色
每个选项数量+1 ,异步线程
3、代码展示
管理后台+接口,代码不上传,需自己实现!