首先设计数据库表结构,包括问卷、题目、选项、回答和答案详情五张表,通过外键关联;接着用SQL创建表并实现增删改查操作,如插入问卷题目、保存用户回答、统计选项次数等;最后可扩展用户标识、逻辑跳转、状态管理及数据导出功能,配合后端语言提供Web服务。

搭建一个简单的问卷调查系统,核心是设计合理的数据表结构,并通过 SQL 实现问卷的增删改查与答题逻辑。下面以 MySQL 为例,带你一步步实现一个基础但完整的问卷系统。
1. 数据库表结构设计
一个基本的问卷系统需要管理问卷、题目、选项和用户回答。建议创建以下几张表:
问卷表(surveys)
存储问卷基本信息- id: 主键
- title: 问卷标题
- description: 描述
- created_at: 创建时间
题目表(questions)
每个问题属于某个问卷- id: 主键
- survey_id: 外键,关联 surveys.id
- content: 题目内容
- type: 题型(如单选 radio、多选 checkbox、文本 text)
选项表(options)
每个题目可有多个选项- id: 主键
- question_id: 外键,关联 questions.id
- option_text: 选项文字
- sort_order: 排序
回答表(responses)
记录用户提交的答卷- id: 主键
- survey_id: 所属问卷
- submitted_at: 提交时间
答案详情表(answers)
每道题的回答明细- id: 主键
- response_id: 外键,关联 responses.id
- question_id: 对应题目
- option_id: 选择的选项(多选可多条记录)
- text_answer: 文本类题目的回答内容
2. 创建表的 SQL 示例
执行以下语句建立数据库结构:
CREATE TABLE surveys (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
<p>CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT,
content TEXT NOT NULL,
type ENUM('radio', 'checkbox', 'text') DEFAULT 'radio',
FOREIGN KEY (survey_id) REFERENCES surveys(id) ON DELETE CASCADE
);</p><p>CREATE TABLE options (
id INT AUTO_INCREMENT PRIMARY KEY,
question_id INT,
option_text VARCHAR(255),
sort_order INT DEFAULT 0,
FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE
);</p><p>CREATE TABLE responses (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT,
submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (survey_id) REFERENCES surveys(id)
);</p><p>CREATE TABLE answers (
id INT AUTO_INCREMENT PRIMARY KEY,
response_id INT,
question_id INT,
option_id INT DEFAULT NULL,
text_answer TEXT,
FOREIGN KEY (response_id) REFERENCES responses(id) ON DELETE CASCADE,
FOREIGN KEY (question_id) REFERENCES questions(id),
FOREIGN KEY (option_id) REFERENCES options(id)
);</p>3. 常见操作 SQL 示例
添加一份问卷和题目
-- 添加问卷
INSERT INTO surveys (title, description) VALUES ('用户满意度调查', '了解用户体验');
<p>-- 添加题目
INSERT INTO questions (survey_id, content, type)
VALUES (1, '您对服务满意吗?', 'radio');</p><p>-- 添加选项
INSERT INTO options (question_id, option_text, sort_order)
VALUES (1, '非常满意', 1), (1, '一般', 2), (1, '不满意', 3);</p>保存用户回答
-- 记录一次提交 INSERT INTO responses (survey_id) VALUES (1); SET @response_id = LAST_INSERT_ID(); <p>-- 回答选择题 INSERT INTO answers (response_id, question_id, option_id) VALUES (@response_id, 1, 1); -- 选了“非常满意”</p><p>-- 回答文本题(假设还有个文本题 question_id=2) INSERT INTO answers (response_id, question_id, text_answer) VALUES (@response_id, 2, '希望响应更快一些');</p>
统计某题各选项被选次数
SELECT o.option_text, COUNT(a.option_id) as count FROM options o LEFT JOIN answers a ON o.id = a.option_id WHERE o.question_id = 1 GROUP BY o.id, o.option_text;
4. 系统扩展建议
基础功能完成后,可逐步增强:
- 增加用户标识字段(如 user_id),防止重复提交
- 支持逻辑跳转:根据前一题答案决定是否显示下一题
- 添加问卷状态(启用/关闭)
- 导出统计结果到 CSV 或图表展示
- 使用索引优化查询性能,如在 survey_id、question_id 上建索引
基本上就这些。用好外键约束和合理拆表,MySQL 能很好地支撑一个轻量级问卷系统。实际开发中配合 PHP、Python 或 Node.js 提供 Web 接口即可对外服务。










