Files
ycc-proxy-server/deploy/sql/README_表结构修改说明.md
2025-12-05 18:30:31 +08:00

9.5 KiB
Raw Blame History

表结构修改说明

本文档说明系统重构需要的所有表结构修改,包括:

  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字段:bigintCHAR(36)
  • 移除AUTO_INCREMENT属性
  • 插入时使用UUID()函数或应用层生成UUID

外键字段(软关联):

  • user_idbigintCHAR(36)
  • agent_idbigintCHAR(36)
  • order_idbigintCHAR(36)
  • product_idbigintCHAR(36)
  • invite_code_idbigintCHAR(36)
  • link_idbigintCHAR(36)
  • commission_idbigintCHAR(36)
  • wallet_idbigintCHAR(36)
  • withdrawal_idbigintCHAR(36)
  • parent_agent_idbigintCHAR(36)
  • team_leader_idbigintCHAR(36)
  • cleanup_log_idbigintCHAR(36)
  • query_idbigintCHAR(36)
  • feature_idbigintCHAR(36)
  • parent_id(菜单):bigintCHAR(36)
  • dict_type_idbigintCHAR(36)
  • role_idbigintCHAR(36)
  • menu_idbigintCHAR(36)
  • api_idbigintCHAR(36)
  • used_user_idbigintCHAR(36)
  • used_agent_idbigintCHAR(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表

添加唯一索引

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字段类型int64string
  • 所有外键字段类型:int64string
  • 移除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表一段时间确认无误后再删除

八、联系信息

如有问题,请联系开发团队。