6.1 KiB
6.1 KiB
情绪博物馆数据库雪花算法主键实施总结
📋 任务完成情况
✅ 已完成任务
-
收集和分析数据库相关文件 ✅
- 扫描了项目中所有的数据库变更语句、实体类和相关配置文件
- 分析了当前数据库结构和实体类继承关系
-
生成终版数据库初始化脚本 ✅
- 更新了
backend/mysql_emotion_museum_final.sql为 v3.0 版本 - 所有主键使用 VARCHAR(36) 类型,支持雪花算法生成的字符串ID
- 添加了缺失的
guest_user表 - 完善了所有表的索引配置
- 更新了
-
实现雪花算法工具类 ✅
- 创建了
SnowflakeIdGenerator类,支持高性能ID生成 - 创建了
SnowflakeConfig配置类,支持自动机器ID分配 - 实现了完整的测试用例,验证了并发安全性和唯一性
- 创建了
-
更新EmotionMetaObjectHandler ✅
- 增加了主键自动填充逻辑
- 当ID为空时自动使用雪花算法生成ID
- 保持了异常安全性,不影响业务逻辑
-
更新BaseEntity和所有实体类 ✅
- 更新了
BaseEntity使用IdType.INPUT配置 - 修复了
GuestUser实体类,使其继承BaseEntity - 为所有模块创建了完整的实体类
- 更新了
-
验证和测试 ✅
- 项目编译成功,无语法错误
- 雪花算法测试全部通过
- 验证了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
}
✅ 验证结果
- ✅ 项目编译成功
- ✅ 雪花算法测试通过(唯一性、并发安全性)
- ✅ 数据库脚本语法正确
- ✅ 实体类继承关系正确
- ✅ 自动填充逻辑完整
📝 注意事项
- 时钟回退: 雪花算法依赖系统时钟,需要确保服务器时钟同步
- 机器ID: 分布式部署时需要确保不同节点使用不同的机器ID
- ID长度: 生成的ID为19位数字字符串,前端需要使用字符串类型处理
- 数据库兼容: 脚本针对MySQL 8.0+优化,其他版本可能需要调整
🎯 后续建议
- 监控: 建议添加ID生成性能监控
- 配置中心: 考虑使用配置中心管理机器ID
- 测试: 建议在生产环境前进行压力测试
- 文档: 为开发团队提供使用指南
实施完成时间: 2025-07-13
版本: v3.0 Final (雪花算法主键版本)
状态: ✅ 全部完成