Files
happy-life-star/backend/数据库雪花算法主键实施总结.md
T

6.1 KiB
Raw Blame History

情绪博物馆数据库雪花算法主键实施总结

📋 任务完成情况

已完成任务

  1. 收集和分析数据库相关文件

    • 扫描了项目中所有的数据库变更语句、实体类和相关配置文件
    • 分析了当前数据库结构和实体类继承关系
  2. 生成终版数据库初始化脚本

    • 更新了 backend/mysql_emotion_museum_final.sql 为 v3.0 版本
    • 所有主键使用 VARCHAR(36) 类型,支持雪花算法生成的字符串ID
    • 添加了缺失的 guest_user
    • 完善了所有表的索引配置
  3. 实现雪花算法工具类

    • 创建了 SnowflakeIdGenerator 类,支持高性能ID生成
    • 创建了 SnowflakeConfig 配置类,支持自动机器ID分配
    • 实现了完整的测试用例,验证了并发安全性和唯一性
  4. 更新EmotionMetaObjectHandler

    • 增加了主键自动填充逻辑
    • 当ID为空时自动使用雪花算法生成ID
    • 保持了异常安全性,不影响业务逻辑
  5. 更新BaseEntity和所有实体类

    • 更新了 BaseEntity 使用 IdType.INPUT 配置
    • 修复了 GuestUser 实体类,使其继承 BaseEntity
    • 为所有模块创建了完整的实体类
  6. 验证和测试

    • 项目编译成功,无语法错误
    • 雪花算法测试全部通过
    • 验证了ID生成的唯一性和并发安全性

🏗️ 架构改进

主键策略

  • 类型: VARCHAR(36) → 避免前端JavaScript精度丢失
  • 生成: 雪花算法 → 保证全局唯一性和高性能
  • 配置: 自动机器ID分配 → 支持分布式部署

关联策略

  • 无外键约束: 不使用数据库外键,避免复杂的约束管理
  • 代码关联: 通过业务代码中的ID字段维护表间关联关系
  • 性能优化: 减少数据库约束检查,提高插入和更新性能
  • 灵活性: 便于数据迁移和表结构调整

数据库表结构

  • 15个核心表: 覆盖用户、对话、情绪、成长、探索、奖励、统计等功能
  • 统一字段: 所有表继承公共字段(id, create_by, create_time, update_by, update_time, is_deleted, remarks
  • 完整索引: 针对查询场景优化的索引配置

实体类设计

  • 继承体系: 所有实体类继承 BaseEntity
  • 字段映射: 使用 @TableField 注解明确字段映射
  • 类型处理: JSON字段使用 JacksonTypeHandler

📁 文件清单

新增文件

backend/emotion-common/src/main/java/com/emotionmuseum/common/util/SnowflakeIdGenerator.java
backend/emotion-common/src/main/java/com/emotionmuseum/common/config/SnowflakeConfig.java
backend/emotion-common/src/test/java/com/emotionmuseum/common/util/SnowflakeIdGeneratorTest.java
backend/emotion-record/src/main/java/com/emotionmuseum/record/entity/EmotionRecord.java
backend/emotion-growth/src/main/java/com/emotionmuseum/growth/entity/GrowthTopic.java
backend/emotion-growth/src/main/java/com/emotionmuseum/growth/entity/TopicInteraction.java
backend/emotion-explore/src/main/java/com/emotionmuseum/explore/entity/LocationPin.java
backend/emotion-explore/src/main/java/com/emotionmuseum/explore/entity/CommunityPost.java
backend/emotion-explore/src/main/java/com/emotionmuseum/explore/entity/Comment.java
backend/emotion-reward/src/main/java/com/emotionmuseum/reward/entity/Achievement.java
backend/emotion-reward/src/main/java/com/emotionmuseum/reward/entity/Reward.java
backend/emotion-stats/src/main/java/com/emotionmuseum/stats/entity/UserStats.java

修改文件

backend/mysql_emotion_museum_final.sql (v2.1 → v3.0)
backend/emotion-common/src/main/java/com/emotionmuseum/common/entity/BaseEntity.java
backend/emotion-common/src/main/java/com/emotionmuseum/common/handler/EmotionMetaObjectHandler.java
backend/emotion-ai/src/main/java/com/emotionmuseum/ai/entity/GuestUser.java

🔧 技术特性

雪花算法特性

  • 高性能: 单机每毫秒可生成4096个ID
  • 全局唯一: 64位长整型,转换为字符串避免精度丢失
  • 时间有序: ID包含时间戳信息,天然有序
  • 分布式友好: 支持1024个机器节点

自动填充特性

  • 主键自动生成: ID为空时自动生成雪花算法ID
  • 时间自动填充: 自动填充创建时间和更新时间
  • 用户信息填充: 支持创建人和更新人信息
  • 逻辑删除: 自动设置删除标记默认值

配置灵活性

  • 机器ID配置: 支持配置文件指定或自动分配
  • 异常安全: 自动填充失败不影响业务逻辑
  • 扩展性: 支持批量ID生成和解析功能

🚀 使用方式

1. 数据库初始化

mysql -u root -p < backend/mysql_emotion_museum_final.sql

2. 配置机器ID(可选)

# application.yml
snowflake:
  machine-id: 1  # 可选,不配置则自动分配

3. 实体类使用

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("your_table")
public class YourEntity extends BaseEntity {
    // 业务字段
    @TableField("your_field")
    private String yourField;
}

4. 手动生成ID

@Autowired
private SnowflakeIdGenerator snowflakeIdGenerator;

public void generateId() {
    String id = snowflakeIdGenerator.nextIdAsString();
    // 使用生成的ID
}

验证结果

  • 项目编译成功
  • 雪花算法测试通过(唯一性、并发安全性)
  • 数据库脚本语法正确
  • 实体类继承关系正确
  • 自动填充逻辑完整

📝 注意事项

  1. 时钟回退: 雪花算法依赖系统时钟,需要确保服务器时钟同步
  2. 机器ID: 分布式部署时需要确保不同节点使用不同的机器ID
  3. ID长度: 生成的ID为19位数字字符串,前端需要使用字符串类型处理
  4. 数据库兼容: 脚本针对MySQL 8.0+优化,其他版本可能需要调整

🎯 后续建议

  1. 监控: 建议添加ID生成性能监控
  2. 配置中心: 考虑使用配置中心管理机器ID
  3. 测试: 建议在生产环境前进行压力测试
  4. 文档: 为开发团队提供使用指南

实施完成时间: 2025-07-13
版本: v3.0 Final (雪花算法主键版本)
状态: 全部完成