This commit is contained in:
2025-12-05 18:30:31 +08:00
parent 4d5013486c
commit 8d00d67540
12 changed files with 2785 additions and 107 deletions

View File

@@ -0,0 +1,320 @@
# 表结构修改说明
本文档说明系统重构需要的所有表结构修改,包括:
1. UUID迁移将所有bigint类型的ID改为CHAR(36)类型的UUID
2. 用户系统重构删除UserTemp表优化UserAuth表
## 一、UUID迁移
### 1.1 概述
将所有表的主键ID从`bigint`类型改为`CHAR(36)`类型的UUID同时将所有外键关联字段也改为UUID类型。
**注意**:开发环境使用简化版脚本(`uuid_migration_simple.sql`),直接修改表结构,不保留旧数据。
### 1.2 涉及的表
**核心业务表**
- `user` - 用户表
- `agent` - 代理表
- `product` - 产品表
- `order` - 订单表
- `query` - 查询报告表
- `user_auth` - 用户认证表
**代理相关表**
- `agent_commission` - 代理佣金表
- `agent_invite_code` - 代理邀请码表
- `agent_link` - 代理链接表
- `agent_order` - 代理订单表
- `agent_wallet` - 代理钱包表
- `agent_withdrawal` - 代理提现表
- `agent_withdrawal_tax` - 代理提现税费表
- `agent_rebate` - 代理返利表
- `agent_relation` - 代理关系表
- `agent_upgrade` - 代理升级表
- `agent_real_name` - 代理实名表
- `agent_config` - 代理配置表
- `agent_product_config` - 代理产品配置表
- `agent_short_link` - 代理短链表
- `agent_invite_code_usage` - 邀请码使用记录表
- `agent_freeze_task` - 代理冻结任务表
**订单相关表**
- `order_refund` - 订单退款表
**查询相关表**
- `query_cleanup_log` - 查询清理日志表
- `query_cleanup_detail` - 查询清理详情表
- `query_cleanup_config` - 查询清理配置表
**产品相关表**
- `product_feature` - 产品功能表
- `feature` - 功能表
**其他表**
- `authorization_document` - 授权书表
- `global_notifications` - 全局通知表
**管理后台表**
- `admin_user` - 管理员用户表
- `admin_role` - 管理员角色表
- `admin_menu` - 管理员菜单表
- `admin_api` - 管理员API表
- `admin_dict_type` - 字典类型表
- `admin_dict_data` - 字典数据表
- `admin_user_role` - 管理员用户角色关联表
- `admin_role_menu` - 管理员角色菜单关联表
- `admin_role_api` - 管理员角色API关联表
### 1.3 修改内容
**主键字段**
- 所有表的`id`字段:`bigint``CHAR(36)`
- 移除`AUTO_INCREMENT`属性
- 插入时使用`UUID()`函数或应用层生成UUID
**外键字段**(软关联):
- `user_id``bigint``CHAR(36)`
- `agent_id``bigint``CHAR(36)`
- `order_id``bigint``CHAR(36)`
- `product_id``bigint``CHAR(36)`
- `invite_code_id``bigint``CHAR(36)`
- `link_id``bigint``CHAR(36)`
- `commission_id``bigint``CHAR(36)`
- `wallet_id``bigint``CHAR(36)`
- `withdrawal_id``bigint``CHAR(36)`
- `parent_agent_id``bigint``CHAR(36)`
- `team_leader_id``bigint``CHAR(36)`
- `cleanup_log_id``bigint``CHAR(36)`
- `query_id``bigint``CHAR(36)`
- `feature_id``bigint``CHAR(36)`
- `parent_id`(菜单):`bigint``CHAR(36)`
- `dict_type_id``bigint``CHAR(36)`
- `role_id``bigint``CHAR(36)`
- `menu_id``bigint``CHAR(36)`
- `api_id``bigint``CHAR(36)`
- `used_user_id``bigint``CHAR(36)`
- `used_agent_id``bigint``CHAR(36)`
### 1.4 执行脚本
**开发环境**:执行文件 `uuid_migration_simple.sql`
- 直接修改表结构,不保留旧数据
- 适用于开发环境,没有重要数据
**生产环境**:执行文件 `uuid_migration.sql`
- 完整的迁移流程,保留旧数据以便回滚
- 需要分阶段执行,包含数据迁移和验证
**开发环境执行步骤**
1. 直接执行 `uuid_migration_simple.sql`
2. 所有表的主键和外键字段直接改为CHAR(36)
3. 插入新记录时在应用层生成UUID
**注意事项**
- 开发环境脚本直接修改表结构,不保留旧数据
- 如果表中有数据需要先清空数据或手动填充UUID
- 代码层面需要同步修改所有ID字段类型int64 → string
## 二、用户系统重构
### 2.1 概述
删除`UserTemp`表,统一使用`User`表(通过`mobile`字段是否为空区分临时用户和正式用户),优化`UserAuth`表结构。
### 2.2 涉及的表
**需要修改的表**
- `user` - 用户表无需修改结构只需确保mobile可为空
- `user_auth` - 用户认证表(添加唯一索引)
- `user_temp` - 临时用户表(**删除**
**需要迁移数据的表**
- `order` - 订单表更新user_id
- `query` - 查询报告表更新user_id
### 2.3 修改内容
#### 2.3.1 UserAuth表
**添加唯一索引**
```sql
ALTER TABLE `user_auth`
ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`);
```
**作用**
- 确保同一个认证方式auth_type + auth_key只能绑定一个用户
- 防止重复绑定
#### 2.3.2 UserTemp表
**删除原因**
- 临时用户可以直接创建User表记录mobile为空
- 临时用户的认证信息存储在UserAuth表
- 通过User.mobile是否为空来区分临时用户和正式用户
- 统一使用User表逻辑更清晰
**删除步骤**
1. 迁移UserTemp数据到User和UserAuth表
2. 更新关联的订单和报告的user_id
3. 验证数据完整性
4. 删除UserTemp表
### 2.4 执行脚本
**开发环境**:执行文件 `user_system_refactor.sql`(已简化)
- 直接删除UserTemp表
- 添加UserAuth唯一索引
**生产环境**:如需数据迁移,请参考完整版脚本
**开发环境执行步骤**
1. 添加UserAuth唯一索引
2. 直接删除UserTemp表
**注意事项**
- 开发环境脚本直接删除UserTemp表不进行数据迁移
- 删除UserTemp表前确保代码中已移除所有对UserTemp表的引用
## 三、执行顺序
### 3.1 推荐执行顺序
**开发环境**
1. **先执行用户系统重构**`user_system_refactor.sql`
- 添加UserAuth唯一索引
- 删除UserTemp表
2. **再执行UUID迁移**`uuid_migration_simple.sql`
- 直接修改所有表结构
- 需要同步修改代码
**生产环境**
1. 先执行用户系统重构(完整版,包含数据迁移)
2. 再执行UUID迁移完整版包含数据迁移和验证
### 3.2 如果先执行UUID迁移
如果先执行UUID迁移需要注意
- UserTemp表的ID也会改为UUID
- 迁移UserTemp数据时需要使用UUID映射
- 用户系统重构脚本需要相应调整
## 四、代码修改清单
### 4.1 UUID迁移需要的代码修改
**Model层**
- 所有Model的ID字段类型`int64``string`
- 所有外键字段类型:`int64``string`
- 移除`AUTO_INCREMENT`相关逻辑
- 插入时生成UUID使用`uuid.NewString()`
**Service层**
- 所有使用ID的地方改为UUID
- 查询条件改为UUID
- 关联查询改为UUID
**API层**
- 请求参数中的ID改为UUID
- 响应数据中的ID改为UUID
**数据库操作**
- 插入操作:使用`uuid.NewString()`生成UUID
- 查询操作使用UUID字符串查询
- 更新操作使用UUID字符串更新
### 4.2 用户系统重构需要的代码修改
**删除UserTemp相关代码**
- 删除`UserTempModel`
- 删除所有使用`UserTemp`的代码
- 删除临时用户创建逻辑中的UserTemp相关代码
**修改用户创建逻辑**
- 临时用户直接创建User记录mobile为空
- 创建UserAuth记录auth_type + auth_key
**修改用户查询逻辑**
- 通过UserAuth表查询用户
- 通过User.mobile是否为空判断用户类型
**修改账号合并逻辑**
- 绑定手机号时,检查手机号是否已存在
- 如果存在,合并账号(迁移数据)
- 如果不存在更新User.mobile
## 五、验证清单
### 5.1 UUID迁移验证
- [ ] 所有表的主键已改为CHAR(36)
- [ ] 所有外键字段已改为CHAR(36)
- [ ] 插入新记录时自动生成UUID
- [ ] 查询操作使用UUID正常
- [ ] 关联查询使用UUID正常
- [ ] 索引和约束已更新
- [ ] 数据完整性验证通过
### 5.2 用户系统重构验证
- [ ] UserAuth表有唯一索引`uk_auth_type_key`
- [ ] UserTemp表数据已迁移如果存在
- [ ] 订单和报告的user_id已更新
- [ ] UserTemp表已删除如果存在
- [ ] 临时用户创建逻辑使用User表
- [ ] 账号合并逻辑正常工作
- [ ] 数据完整性验证通过
## 六、回滚方案
### 6.1 UUID迁移回滚
如果UUID迁移出现问题可以
1. 保留原ID字段迁移脚本中已保留
2. 恢复主键为原ID字段
3. 删除UUID字段
4. 恢复代码使用int64类型
### 6.2 用户系统重构回滚
如果用户系统重构出现问题,可以:
1. 恢复UserTemp表从备份
2. 恢复订单和报告的user_id
3. 恢复代码使用UserTemp表
## 七、常见问题
### 7.1 UUID性能问题
**问题**UUID作为主键可能影响性能
**解答**
- UUID是字符串类型索引效率略低于bigint
- 但UUID的优势是全局唯一适合分布式系统
- 如果性能问题严重可以考虑使用BINARY(16)存储UUID需要转换
### 7.2 UUID长度问题
**问题**CHAR(36)占用空间较大
**解答**
- UUID标准格式是36字符包含连字符
- 如果空间敏感可以使用BINARY(16)存储(需要转换函数)
- 当前使用CHAR(36)便于调试和查看
### 7.3 UserTemp数据迁移问题
**问题**如何确保UserTemp数据正确迁移
**解答**
- 通过auth_type和auth_key匹配UserAuth记录
- 建立UserTemp.id到User.id的映射关系
- 迁移后验证数据完整性
- 保留UserTemp表一段时间确认无误后再删除
## 八、联系信息
如有问题,请联系开发团队。