### 微信小程序古诗词答题系统的E-R图设计
#### 1. 实体分析
在构建微信小程序的古诗词答题系统时,需要定义几个核心实体及其属性。以下是可能涉及的主要实体:
- **用户 (User)**
用户是参与答题的核心角色,其主要属性包括但不限于:`用户名`, `密码`, `邮箱`, `手机号码`, `注册日期` 等。
- **题目 (Question)**
题目是答题系统的关键部分,其属性通常包括:`题目ID`, `题目内容`, `选项A`, `选项B`, `选项C`, `选项D`, `正确答案`, `难度等级`, `所属分类` 等[^4]。
- **答题记录 (AnswerRecord)**
记录用户的答题情况,用于统计成绩和历史回顾。其属性可以包括:`记录ID`, `用户ID`, `题目ID`, `提交答案`, `是否正确`, `答题时间` 等。
- **管理员 (Admin)**
负责维护系统中的数据,如添加新题目、更新题目信息等。管理员的相关属性包括:`管理员ID`, `姓名`, `权限级别` 等。
- **分类 (Category)**
对题目进行分类管理,便于用户筛选特定类型的题目。其属性一般为:`分类ID`, `分类名称`, `描述` 等。
---
#### 2. 属性关系说明
各实体之间的关系如下:
- **用户 和 答题记录** 是一对多的关系(一个用户可以有多条答题记录)。
- **题目 和 答题记录** 是一对一或多对一的关系(一条答题记录对应一道题目)。
- **管理员 和 题目** 是一对多的关系(一位管理员可以创建多个题目)。
- **题目 和 分类** 是多对多的关系(一道题目可以属于多个分类,一个分类下也可以有多个题目)。
---
#### 3. E-R图示意
以下是基于以上分析绘制的简化版E-R图:
```plaintext
+------------------+ +--------------------+
| User |-------| AnswerRecord |
+------------------+ +--------------------+
| userId | | recordId |
| username |<----- | userId |
| password | | questionId |
| email | | submittedAnswer |
| phone | | isCorrect |
| registrationDate | | answerTime |
+------------------+ +--------------------+
+-------------------+ +------------------+
| Question |-------| Category |
+-------------------+ +------------------+
| questionId | | categoryId |
| content |<----->| categoryName |
| optionA | | description |
| optionB | +------------------+
| optionC |
| optionD |
| correctAnswer |
| difficultyLevel |
| adminId |
+-------------------+
+------------------+
| Admin |
+------------------+
| adminId |
| name |
| permissionLevel |
+------------------+
```
---
#### 4. 数据库表结构设计
根据E-R图的设计思路,以下是对应的数据库表设计方案:
##### 表1: 用户表 (`users`)
```sql
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100),
phone VARCHAR(15),
registration_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
##### 表2: 题目表 (`questions`)
```sql
CREATE TABLE questions (
question_id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT NOT NULL,
option_a VARCHAR(255) NOT NULL,
option_b VARCHAR(255) NOT NULL,
option_c VARCHAR(255) NOT NULL,
option_d VARCHAR(255) NOT NULL,
correct_answer CHAR(1) CHECK(correct_answer IN ('A', 'B', 'C', 'D')),
difficulty_level ENUM('Easy', 'Medium', 'Hard') DEFAULT 'Easy',
category_id INT,
admin_id INT,
FOREIGN KEY(category_id) REFERENCES categories(category_id),
FOREIGN KEY(admin_id) REFERENCES admins(admin_id)
);
```
##### 表3: 答题记录表 (`answer_records`)
```sql
CREATE TABLE answer_records (
record_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
question_id INT NOT NULL,
submitted_answer CHAR(1),
is_correct BOOLEAN DEFAULT FALSE,
answer_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES users(user_id),
FOREIGN KEY(question_id) REFERENCES questions(question_id)
);
```
##### 表4: 管理员表 (`admins`)
```sql
CREATE TABLE admins (
admin_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
permission_level TINYINT DEFAULT 1 COMMENT '1=Basic, 2=Advanced'
);
```
##### 表5: 分类表 (`categories`)
```sql
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(50) NOT NULL,
description TEXT
);
```
---
#### 5. 设计注意事项
- 在实际开发过程中,需考虑字段长度、索引优化等问题以提升查询效率。
- 如果未来扩展性强,则可以在现有基础上增加更多的关联表或字段,例如用户积分体系、排行榜展示等[^3]。
---
###