# 表名统一修改说明

## 修改时间
2026-03-10

## 修改目的
将数据库表名从复数形式改为单数形式，使其与 ORM 实体类名保持一致（除了下划线和驼峰的区别）。

## 修改内容

### 1. Flyway 迁移脚本
创建了新的 Flyway 迁移脚本：
- 文件：`reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql`
- 功能：将所有数据库表名从复数改为单数

### 2. 实体类 @TableName 注解更新
更新了 36 个实体类的 `@TableName` 注解：

| 序号 | 原表名（复数） | 新表名（单数） | 实体类名 |
|-----|---------------|---------------|---------|
| 1 | `admin_users` | `admin_user` | `AdminUser` |
| 2 | `tenants` | `tenant` | `Tenant` |
| 3 | `teachers` | `teacher` | `Teacher` |
| 4 | `students` | `student` | `Student` |
| 5 | `parents` | `parent` | `Parent` |
| 6 | `parent_students` | `parent_student` | `ParentStudent` |
| 7 | `classes` | `clazz` | `Clazz` |
| 8 | `class_teachers` | `class_teacher` | `ClassTeacher` |
| 9 | `student_class_history` | `student_class_history` | `StudentClassHistory` (无需修改) |
| 10 | `courses` | `course` | `Course` |
| 11 | `course_versions` | `course_version` | `CourseVersion` |
| 12 | `course_resources` | `course_resource` | `CourseResource` |
| 13 | `course_scripts` | `course_script` | `CourseScript` |
| 14 | `course_script_pages` | `course_script_page` | `CourseScriptPage` |
| 15 | `course_activities` | `course_activity` | `CourseActivity` |
| 16 | `course_packages` | `course_package` | `CoursePackage` |
| 17 | `school_courses` | `school_course` | `SchoolCourse` |
| 18 | `tenant_courses` | `tenant_course` | `TenantCourse` |
| 19 | `lessons` | `lesson` | `Lesson` |
| 20 | `lesson_feedbacks` | `lesson_feedback` | `LessonFeedback` |
| 21 | `student_records` | `student_record` | `StudentRecord` |
| 22 | `tasks` | `task` | `Task` |
| 23 | `task_targets` | `task_target` | `TaskTarget` |
| 24 | `task_completions` | `task_completion` | `TaskCompletion` |
| 25 | `task_templates` | `task_template` | `TaskTemplate` |
| 26 | `growth_records` | `growth_record` | `GrowthRecord` |
| 27 | `resource_libraries` | `resource_library` | `ResourceLibrary` |
| 28 | `resource_items` | `resource_item` | `ResourceItem` |
| 29 | `schedule_plans` | `schedule_plan` | `SchedulePlan` |
| 30 | `schedule_templates` | `schedule_template` | `ScheduleTemplate` |
| 31 | `system_settings` | `system_setting` | `SystemSetting` |
| 32 | `themes` | `theme` | `Theme` |
| 33 | `tags` | `tag` | `Tag` |
| 34 | `notifications` | `notification` | `Notification` |
| 35 | `operation_logs` | `operation_log` | `OperationLog` |

### 3. Mapper 接口 SQL 更新
更新了以下 Mapper 接口中的硬编码 SQL 表名：

| 文件 | 修改内容 |
|-----|---------|
| `ThemeMapper.java` | `DELETE FROM themes` → `DELETE FROM theme` |
| `ParentMapper.java` | `DELETE FROM parents` → `DELETE FROM parent` |
| `TenantMapper.java` | `DELETE FROM tenants` → `DELETE FROM tenant` (2 处) |
| `TeacherMapper.java` | `DELETE FROM teachers` → `DELETE FROM teacher` |
| `StudentMapper.java` | `DELETE FROM students` → `DELETE FROM student` |

## 部署步骤

### 步骤 1：备份数据库
在执行迁移前，务必备份开发/生产数据库：
```bash
mysqldump -u root -p reading_platform > backup_$(date +%Y%m%d).sql
```

### 步骤 2：执行 Flyway 迁移
启动后端服务，Flyway 会自动执行 `V22__rename_tables_to_singular.sql` 迁移脚本。

或者手动执行：
```bash
mysql -u root -p reading_platform < reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql
```

### 步骤 3：验证迁移结果
在 MySQL 中执行：
```sql
-- 查看所有表名
SHOW TABLES;

-- 验证特定表是否存在
SHOW TABLES LIKE 'student';
SHOW TABLES LIKE 'student_record';
SHOW TABLES LIKE 'lesson_feedback';
```

### 步骤 4：测试功能
启动后端服务后，测试以下功能：
1. 用户管理（管理员、教师、学生、家长）
2. 班级管理
3. 课程管理
4. 课时管理
5. 任务管理
6. 成长记录
7. 资源管理
8. 日程管理

## 注意事项

1. **外键处理**：迁移脚本中先禁用外键检查（`SET FOREIGN_KEY_CHECKS = 0`），执行完后再启用
2. **Flyway 历史**：确保 `flyway_schema_history` 表正确记录迁移历史
3. **生产环境**：在生产环境执行前，务必在开发/测试环境充分测试
4. **回滚方案**：如需回滚，可以准备反向迁移脚本（将单数表名改回复数）

## 相关文件清单

### 新增文件
- `reading-platform-java/src/main/resources/db/migration/V22__rename_tables_to_singular.sql`

### 修改的文件
- 所有 Entity 类（36 个文件）
- 5 个 Mapper 接口

## 验证清单

- [x] 所有 Entity 类的 `@TableName` 注解已更新
- [x] 所有 Mapper 接口的 SQL 已更新
- [x] Controller 中无硬编码表名引用
- [x] Service 中无硬编码表名引用
- [x] Flyway 迁移脚本已创建

## 后续工作

1. 在开发环境执行迁移并验证
2. 更新 API 文档中的表名引用（如有）
3. 更新项目文档中的表名引用（如有）
