首先设计用户、问卷、问题、选项和回答五张表,通过外键关联确保数据一致性;使用枚举字段区分题型,答案表分离选项ID与文本内容,支持不同类型题目;通过IP限制防止重复提交,建立级联删除机制维护数据完整;可高效执行问题选项查询与统计分析,为中小型问卷系统提供稳定基础。

构建一个基于MySQL的问卷调查系统,关键在于合理设计数据库结构,确保数据的完整性与查询效率。下面介绍如何从零开始搭建一个基础但功能完整的问卷调查系统的数据库模型。
1. 明确系统核心模块
一个典型的问卷调查系统包含以下几个主要实体:
- 用户(User):管理问卷创建者和填写者
- 问卷(Survey):每份问卷的基本信息
- 问题(Question):每道题的内容和类型
- 选项(Option):选择题的可选答案
- 回答(Answer):用户提交的答案记录
2. 设计数据库表结构
根据上述模块,创建对应的MySQL表:
-- 用户表
CREATE TABLE users (
<font size="2> id INT AUTO_INCREMENT PRIMARY KEY,
<font size="2> username VARCHAR(50) UNIQUE NOT NULL,
<font size="2> password VARCHAR(255) NOT NULL,
<font size="2> email VARCHAR(100),
<font size="2> created_at DATETIME DEFAULT CURRENT_TIMESTAMP
<font size="2>);
-- 问卷表
CREATE TABLE surveys (
<font size="2> id INT AUTO_INCREMENT PRIMARY KEY,
<font size="2> title VARCHAR(200) NOT NULL,
<font size="2> description TEXT,
<font size="2> user_id INT,
<font size="2> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
<font size="2> FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
<font size="2>);
-- 问题表
CREATE TABLE questions (
<font size="2> id INT AUTO_INCREMENT PRIMARY KEY,
<font size="2> survey_id INT,
<font size="2> content TEXT NOT NULL,
<font size="2> question_type ENUM('radio', 'checkbox', 'text') DEFAULT 'radio',
<font size="2> sort_order INT DEFAULT 0,
<font size="2> FOREIGN KEY (survey_id) REFERENCES surveys(id) ON DELETE CASCADE
<font size="2>);
-- 选项表
CREATE TABLE options (
<font size="2> id INT AUTO_INCREMENT PRIMARY KEY,
<font size="2> question_id INT,
<font size="2> option_text VARCHAR(200) NOT NULL,
<font size="2> sort_order INT DEFAULT 0,
<font size="2> FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE
<font size="2>);
-- 回答表
CREATE TABLE answers (
<font size="2> id INT AUTO_INCREMENT PRIMARY KEY,
<font size="2> survey_id INT,
<font size="2> question_id INT,
<font size="2> option_id INT NULL,
<font size="2> text_answer TEXT NULL,
<font size="2> user_ip VARCHAR(45),
<font size="2> submit_time DATETIME DEFAULT CURRENT_TIMESTAMP,
<font size="2> FOREIGN KEY (survey_id) REFERENCES surveys(id),
<font size="2> FOREIGN KEY (question_id) REFERENCES questions(id),
<font size="2> FOREIGN KEY (option_id) REFERENCES options(id)
<font size="2>);
3. 关键设计说明与建议
字段设计需要兼顾灵活性与性能:
- question_type 使用枚举:限制为 radio、checkbox、text 等常见类型,便于前端渲染和后端处理
- answer 表中 option_id 和 text_answer 分开:选择题存选项ID,填空题存文本内容,互斥使用
- IP记录防重复提交:可在 answers 表上加唯一索引 (survey_id, user_ip) 防止同一IP多次提交
- 级联删除:删除问卷时自动清理相关问题、选项和答案,保持数据一致性
4. 常用查询示例
系统运行后,典型的数据操作包括:
-- 获取某问卷的所有问题及选项SELECT q.content, o.id, o.option_text
FROM questions q
LEFT JOIN options o ON q.id = o.question_id
WHERE q.survey_id = 1
ORDER BY q.sort_order, o.sort_order;
-- 统计某个选项被选中的次数
SELECT o.option_text, COUNT(*) as count
FROM answers a
JOIN options o ON a.option_id = o.id
WHERE a.question_id = 5
GROUP BY o.id;
基本上就这些。这个结构足够支撑大多数中小型问卷系统的需求,后续可根据实际扩展如逻辑跳转、定时发布、导出报表等功能。重点是打好数据库基础,后面开发才更顺畅。










