likes
comments
collection
share

一份简单的调查问卷数据库设计

作者站长头像
站长
· 阅读数 9

背景

参考示例腾讯问卷


项目涉及到有关调查问卷的功能,参考了一些问卷网站的示例,大概了解了一下,一份简单的调查问卷包含哪些元素,它们之间存在哪些关联关系,由此设计出一份简单的数据库表结构。


一份问卷的基本元素

  • 调查问卷主表
CREATE TABLE `survey_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `survey_name` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '主题',
  `survey_description` varchar(1000) CHARACTER SET utf8 DEFAULT NULL COMMENT '描述',
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '开始时间',
  `end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '结束时间',
  `status` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '0' COMMENT '0 发布 1 暂存 2已结束 3已失效',
  `survey_sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
  `top_flag` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '0 置顶 1不置顶',
  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `creator_id` int(11) NOT NULL COMMENT '创建人员ID',
  `updator_id` int(11) NOT NULL COMMENT '更新人员ID',
  `survey_pic_id` int(11) DEFAULT NULL COMMENT '图片id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=113 DEFAULT CHARSET=utf8mb4 COMMENT='调查问卷主表';

问卷主表比较简单,相关描述已注释。

  • 问题主表
CREATE TABLE `question_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `survey_id` int(11) NOT NULL COMMENT '关联调查问卷主表ID',
  `question_type` char(1) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '1 单选 2多选 3填空',
  `question_name` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '问题主题',
  `question_description` varchar(1000) CHARACTER SET utf8 DEFAULT NULL,
  `question_sort` int(11) DEFAULT '0' COMMENT '排序',
  `required_flag` char(1) CHARACTER SET utf8 DEFAULT '0' COMMENT ' 0 必填 1非必填',
  `question_pic_id` int(11) DEFAULT NULL COMMENT '图片id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=212 DEFAULT CHARSET=utf8mb4 COMMENT='调查问卷问题主表';

问题主表,关联问卷主键ID

  • 选项表
CREATE TABLE `option_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `survey_id` int(11) NOT NULL COMMENT '调查问卷ID',
  `question_id` int(11) NOT NULL COMMENT '问题ID',
  `option_name` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '选项名称',
  `option_sort` int(11) NOT NULL,
  `option_pic_id` int(11) DEFAULT NULL COMMENT '图片id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=518 DEFAULT CHARSET=utf8mb4 COMMENT='调查问卷问题选项主表';

问题类型是天空的不需要往选项表里插入内容

到此一份简单的调查问卷基本完成

一份问卷不只是看看

有了问卷之后,我们就需要填写问卷,因此我们还需要一份调查问卷的答案表

  • 答案主表
CREATE TABLE `answer_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '成员id',
  `survey_id` int(11) NOT NULL COMMENT '问卷主表ID',
  `question_id` int(11) NOT NULL COMMENT '问题主表ID',
  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=140 DEFAULT CHARSET=utf8mb4 COMMENT='用户答案表';
  • 答案子表
CREATE TABLE `answer_option_relation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `answer_id` int(11) NOT NULL COMMENT '答案主表id',
  `option_id` int(11) DEFAULT NULL COMMENT '选项主表id',
  `option_content` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '答案内容',
  `answer_pic_id` int(11) DEFAULT NULL COMMENT '图片id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8mb4;

其实两张表可以合并为一张表。问题类型为填空时,答案也不仅限为问题描述,也可能是一张图,这里也可以直接放图片的链接地址,避免再关联去查图片的链接;

统计

作为用户来说,不能像纸质时代那样,一份份自己去统计,因此我们需要给用户一份统计结果展示。个人没有去设计统计表的数据表结构,仅仅是通过关联查询得出的结果来给用户展示。这里提供两个思路:

  • 像我一样关联去查
  • 设计一份调查问卷的结果统计表,你可以写一个job在调查问卷截止的时候去做结果统计然后插入到这张表中。用户查看结果的时候,直接从这张表里取数据即可。