调查问卷系统的基本表结构
### 1. **通用表结构**
- **问卷表(surveys)**:存储问卷的基本信息。
```sql
CREATE TABLE surveys (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
- **问题表(questions)**:存储每个问卷的问题。
```sql
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
question_text TEXT NOT NULL,
question_type ENUM('text', 'multiple_choice', 'single_choice') NOT NULL,
FOREIGN KEY (survey_id) REFERENCES surveys(id)
);
```
- **选项表(options)**:针对选择题,存储选项。
```sql
CREATE TABLE options (
id INT AUTO_INCREMENT PRIMARY KEY,
question_id INT NOT NULL,
option_text TEXT NOT NULL,
FOREIGN KEY (question_id) REFERENCES questions(id)
);
```
- **回答表(responses)**:存储用户的回答。
```sql
CREATE TABLE responses (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
user_id INT, -- 如果有用户系统
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (survey_id) REFERENCES surveys(id)
);
```
- **回答详情表(response_details)**:存储每个回答的具体内容。
```sql
CREATE TABLE response_details (
id INT AUTO_INCREMENT PRIMARY KEY,
response_id INT NOT NULL,
question_id INT NOT NULL,
answer_text TEXT, -- 用于文本回答
option_id INT, -- 用于选择题回答
FOREIGN KEY (response_id) REFERENCES responses(id),
FOREIGN KEY (question_id) REFERENCES questions(id),
FOREIGN KEY (option_id) REFERENCES options(id)
);
```
### 2. **优点**
- **灵活性**:通过外键关联,支持动态添加问卷和问题。
- **可维护性**:表结构清晰,易于扩展和维护。
- **性能优化**:减少表数量,降低数据库管理复杂度。
### 3. **示例查询**
- **获取某个问卷的所有问题**:
```sql
SELECT * FROM questions WHERE survey_id = 1;
```
- **获取某个问卷的所有回答**:
```sql
SELECT * FROM responses WHERE survey_id = 1;
```
- **获取某个回答的详细信息**:
```sql
SELECT * FROM response_details WHERE response_id = 1;
```
### 4. **总结**
- **不建议为每个问卷单独建表**,应采用通用表结构,通过外键关联问卷、问题和回答。
- 这种设计更灵活、易于维护,且能有效减少数据库复杂度。
- **问卷表(surveys)**:存储问卷的基本信息。
```sql
CREATE TABLE surveys (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
- **问题表(questions)**:存储每个问卷的问题。
```sql
CREATE TABLE questions (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
question_text TEXT NOT NULL,
question_type ENUM('text', 'multiple_choice', 'single_choice') NOT NULL,
FOREIGN KEY (survey_id) REFERENCES surveys(id)
);
```
- **选项表(options)**:针对选择题,存储选项。
```sql
CREATE TABLE options (
id INT AUTO_INCREMENT PRIMARY KEY,
question_id INT NOT NULL,
option_text TEXT NOT NULL,
FOREIGN KEY (question_id) REFERENCES questions(id)
);
```
- **回答表(responses)**:存储用户的回答。
```sql
CREATE TABLE responses (
id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
user_id INT, -- 如果有用户系统
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (survey_id) REFERENCES surveys(id)
);
```
- **回答详情表(response_details)**:存储每个回答的具体内容。
```sql
CREATE TABLE response_details (
id INT AUTO_INCREMENT PRIMARY KEY,
response_id INT NOT NULL,
question_id INT NOT NULL,
answer_text TEXT, -- 用于文本回答
option_id INT, -- 用于选择题回答
FOREIGN KEY (response_id) REFERENCES responses(id),
FOREIGN KEY (question_id) REFERENCES questions(id),
FOREIGN KEY (option_id) REFERENCES options(id)
);
```
### 2. **优点**
- **灵活性**:通过外键关联,支持动态添加问卷和问题。
- **可维护性**:表结构清晰,易于扩展和维护。
- **性能优化**:减少表数量,降低数据库管理复杂度。
### 3. **示例查询**
- **获取某个问卷的所有问题**:
```sql
SELECT * FROM questions WHERE survey_id = 1;
```
- **获取某个问卷的所有回答**:
```sql
SELECT * FROM responses WHERE survey_id = 1;
```
- **获取某个回答的详细信息**:
```sql
SELECT * FROM response_details WHERE response_id = 1;
```
### 4. **总结**
- **不建议为每个问卷单独建表**,应采用通用表结构,通过外键关联问卷、问题和回答。
- 这种设计更灵活、易于维护,且能有效减少数据库复杂度。