# 表结构修改说明 本文档说明系统重构需要的所有表结构修改,包括: 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表一段时间,确认无误后再删除 ## 八、联系信息 如有问题,请联系开发团队。