背景
参考示例腾讯问卷
项目涉及到有关调查问卷的功能,参考了一些问卷网站的示例,大概了解了一下,一份简单的调查问卷包含哪些元素,它们之间存在哪些关联关系,由此设计出一份简单的数据库表结构。
一份问卷的基本元素
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;
其实两张表可以合并为一张表。问题类型为填空时,答案也不仅限为问题描述,也可能是一张图,这里也可以直接放图片的链接地址,避免再关联去查图片的链接;
统计
作为用户来说,不能像纸质时代那样,一份份自己去统计,因此我们需要给用户一份统计结果展示。个人没有去设计统计表的数据表结构,仅仅是通过关联查询得出的结果来给用户展示。这里提供两个思路: