# 知识库
相关源文件
- [.gitignore](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/.gitignore)
- [sql/create_table.sql](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql)
- [src/main/java/com/ubanillx/smartclass/config/MyBatisPlusConfig.java](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/java/com/ubanillx/smartclass/config/MyBatisPlusConfig.java)
- [src/main/java/com/ubanillx/smartclass/generate/CodeGenerator.java](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/java/com/ubanillx/smartclass/generate/CodeGenerator.java)
- [src/main/resources/mapper/PostFavourMapper.xml](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/resources/mapper/PostFavourMapper.xml)
- [src/main/resources/mapper/PostMapper.xml](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/resources/mapper/PostMapper.xml)
- [src/main/resources/mapper/PostThumbMapper.xml](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/resources/mapper/PostThumbMapper.xml)
- [src/main/resources/mapper/UserMapper.xml](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/resources/mapper/UserMapper.xml)
## 数据库模式概览

该文档详细描述了 SmartClass 后端的数据库模式。该数据库基于 MySQL 构建，包含多个相互关联的表，支持学习平台的各种核心功能，包括用户管理、AI 虚拟形象交互、每日学习内容、课程管理和游戏化元素。

该模式旨在高效存储和检索所有核心功能所需的数据，同时保持系统中不同实体之间的正确关系。

来源：[sql/create_table.sql1-6](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L1-L6)

## 数据库结构概览

SmartClass 数据库使用关系模型，主要包括以下组件：

1. **用户管理系统** - 用户账户、个人资料和学习统计数据表
2. **AI 虚拟形象系统** - 支持 AI 会话学习的表格
3. **每日学习系统** - 每日学习内容如文章和词汇表
4. **课程管理系统** - 课程、章节、小节和用户进度表
5. **成就系统** - 游戏化元素表如成就和里程碑
6. **社交功能** - 帖子、点赞、收藏和其他社交互动表

### 数据库实体关系图

来源：[sql/create_table.sql10-434](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L10-L434)

## 核心表

### 用户管理表

用户管理系统包括用于存储用户信息、学习统计数据和日常目标的表。

#### 用户表

`user` 表存储基本的用户信息、认证详情和个人资料数据。

|列名|类型|描述|
|---|---|---|
|id|bigint|主键|
|userAccount|varchar(256)|用户名|
|userPassword|varchar(512)|加密密码|
|userGender|int|性别 (0-男, 1-女, 2-未指定)|
|unionId|varchar(256)|微信开放平台ID|
|mpOpenId|varchar(256)|微信公众号openId|
|userName|varchar(256)|用户昵称|
|userAvatar|varchar(1024)|头像URL|
|userProfile|varchar(512)|用户简介|
|userRole|varchar(256)|角色 (student/teacher/admin/ban)|
|userEmail|varchar(256)|电子邮件地址|
|birthday|datetime|出生日期|
|createTime|datetime|记录创建时间|
|updateTime|datetime|记录更新时间|
|isDelete|tinyint|软删除标志 (0-活动, 1-删除)|

来源：[sql/create_table.sql10-34](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L10-L34)

#### 用户学习统计表

`user_learning_stats` 表跟踪用户的学习进度和活动。

|列名|类型|描述|
|---|---|---|
|id|bigint|主键|
|userId|bigint|引用 user.id|
|level|int|当前用户等级|
|experience|int|当前经验值|
|nextLevelExp|int|升级所需经验|
|learningDays|int|总学习天数|
|continuousCheckIn|int|连续签到天数|
|totalCheckIn|int|总签到天数|
|totalPoints|int|获得的总积分|
|totalBadges|int|获得的总徽章数|
|lastCheckInTime|datetime|最后签到时间戳|

来源：[sql/create_table.sql94-114](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L94-L114)

#### 用户日常目标表

这组表管理用户的学习目标和跟踪。

来源：[sql/create_table.sql173-238](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L173-L238)

### 每日学习系统表

每日学习系统为用户提供每日文章和词汇。

#### 每日文章相关表

来源：[sql/create_table.sql117-135](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L117-L135)

#### 每日词汇相关表

来源：[sql/create_table.sql138-157](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L138-L157)

### AI 虚拟形象系统表

AI 虚拟形象系统通过个性化 AI 角色实现会话学习。

来源：[sql/create_table.sql642-755](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L642-L755)

### 课程管理表

课程系统管理教育内容，包括课程、章节、小节和用户进度。

来源：[sql/create_table.sql438-605](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L438-L605)

### 成就与游戏化表

成就系统实施游戏化元素以鼓励用户参与。

来源：[sql/create_table.sql267-400](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L267-L400)

### 社区与社交表

这些表支持社交互动如帖子、点赞和评论。

来源：[sql/create_table.sql37-74](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L37-L74) [sql/create_table.sql403-434](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L403-L434)

## 数据库设计原则

### 软删除模式

SmartClass 数据库中的大多数表都使用 `isDelete` 标志（tinyint）而不是物理删除记录来实现软删除。这允许数据恢复并维护系统的参照完整性。

使用软删除的表示例：

- 用户表
- 课程表
- 成就表

来源：[sql/create_table.sql32](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L32-L32) [sql/create_table.sql482](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L482-L482) [sql/create_table.sql289](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L289-L289)

### 时间戳跟踪

所有表都包含 `createTime` 和 `updateTime` 列以跟踪记录的创建和修改时间：

```sql
createTime   datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime   datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间'
```

`updateTime` 使用 `on update CURRENT_TIMESTAMP` 功能，在每次修改记录时自动更新时间戳。

来源：[sql/create_table.sql30-31](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L30-L31)

### 索引策略

数据库模式广泛使用索引来优化查询性能：

1. **主键**：所有表都有自增 `id` 字段作为主键
2. **外键索引**：引用其他表的列被索引（例如 `userId`, `courseId`）
3. **搜索索引**：在经常用于搜索或过滤的列上建立索引
4. **唯一索引**：防止多对多关系中的重复条目

索引声明示例：

```sql
index idx_userId (userId),
index idx_courseId (courseId),
unique uk_user_course (userId, courseId)
```

来源：[sql/create_table.sql33](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L33-L33) [sql/create_table.sql484-487](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L484-L487) [sql/create_table.sql584](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L584-L584)

## 数据访问实现

SmartClass 后端使用 MyBatis Plus 作为 ORM 框架与数据库进行交互。

### MyBatis Plus 配置

```java
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件，用于高效的查询分页
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
```

来源：[src/main/java/com/ubanillx/smartclass/config/MyBatisPlusConfig.java13-28](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/java/com/ubanillx/smartclass/config/MyBatisPlusConfig.java#L13-L28)

### 实体映射

MyBatis XML 映射器用于定义数据库表和 Java 实体类之间的映射。例如，User 实体的映射：

```xml
<resultMap id="BaseResultMap" type="com.ubanillx.smartclass.model.entity.User">
    <id property="id" column="id"/>
    <result property="userAccount" column="userAccount"/>
    <result property="userPassword" column="userPassword"/>
    <!-- 其他属性 -->
</resultMap>
```

来源：[src/main/resources/mapper/UserMapper.xml7-28](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/src/main/resources/mapper/UserMapper.xml#L7-L28)

## 数据库关系与约束

数据库设计实现了几种关系类型：

### 一对多关系

例子包括：

- 一个用户可以有多个学习记录（`user` 至 `user_learning_stats`）
- 一个课程可以包含多个章节（`course` 至 `course_chapter`）
- 一个 AI 虚拟形象可以拥有多个聊天历史记录（`ai_avatar` 至 `ai_avatar_chat_history`）

### 多对多关系

通过连接表实现：

- 用户和课程：`user_course`
- 用户和成就：`user_achievement`
- 用户和每日词汇：`user_daily_word`

### 外键引用

虽然在 SQL 中并未显式定义物理外键约束，但数据库设计通过命名约定和索引来遵循外键关系：

```sql
userId     bigint    not null comment '用户ID',
index idx_userId (userId)
```

这种方法在开发过程中提供了灵活性，同时保持了表之间的逻辑关系。

来源：[sql/create_table.sql98-99](https://github.com/Ubanillx/smartclass-backend/blob/0873c502/sql/create_table.sql#L98-L99)

## 结论

SmartClass 数据库模式旨在支持一个全面的在线学习平台，该平台具有通过 AI 虚拟形象实现个性化学习、每日学习内容、结构化课程和游戏化元素的功能。该模式遵循良好的数据库设计实践，具有适当的索引、时间戳跟踪和关系建模。

有关 API 如何与此数据库模式交互的信息，请参阅 [API 参考](https://deepwiki.com/Ubanillx/smartclass-backend/9-api-reference)。