# Prompt - 数据库表结构设计和创建 ## 输入引用 引用相关的 docs 文档链接: - [REQ-010-1.md](../requirements/REQ-010-1.md) - 数据库表结构设计和创建需求文档 - [0010-database-table-design.md](../decisions/adr/0010-database-table-design.md) - 数据库表结构设计和创建架构决策 - [REQ-010.md](../requirements/REQ-010.md) - Salesforce元数据拉取和部署主需求文档 - [datai_table.sql](../sql/datai_table.sql) - 现有数据库表结构参考 ## Context Maps 强制列出本次 Prompt 依赖的 Canvas 文件: - [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示 - **相关节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式 - **相关节点**: [SessionManager](node_session_manager_detail) - 会话管理,提供登录服务 ## 目标 本提示词的目标是生成完整的数据库表结构设计和创建代码,包括: 1. **数据库表结构**: 根据 ADR 决策生成 6 个核心表的完整 SQL 创建语句 2. **实体类代码**: 使用 MyBatis Plus 规范生成对应的 Java 实体类 3. **Mapper 接口**: 使用 MyBatis Plus 规范生成对应的 Mapper 接口 4. **Flyway 迁移脚本**: 生成数据库版本迁移脚本 5. **单元测试**: 生成完整的单元测试代码 ## 输出格式 ### 1. SQL 脚本格式 ```sql -- Flyway 迁移脚本: V1.0.0__create_metadata_tables.sql -- 描述: 创建元数据管理相关的6个核心表 DROP TABLE IF EXISTS `datai_meta_job_log`; DROP TABLE IF EXISTS `datai_meta_deploy_history`; DROP TABLE IF EXISTS `datai_meta_component`; DROP TABLE IF EXISTS `datai_meta_job_execution`; DROP TABLE IF EXISTS `datai_meta_task`; DROP TABLE IF EXISTS `datai_meta_org_config`; -- 表 1: datai_meta_org_config CREATE TABLE `datai_meta_org_config` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'Salesforce组织配置表' ROW_FORMAT = DYNAMIC; -- 表 2: datai_meta_task CREATE TABLE `datai_meta_task` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据任务定义表' ROW_FORMAT = DYNAMIC; -- 表 3: datai_meta_job_execution CREATE TABLE `datai_meta_job_execution` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '作业执行记录表' ROW_FORMAT = DYNAMIC; -- 表 4: datai_meta_component CREATE TABLE `datai_meta_component` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '元数据组件表' ROW_FORMAT = DYNAMIC; -- 表 5: datai_meta_deploy_history CREATE TABLE `datai_meta_deploy_history` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部署历史表' ROW_FORMAT = DYNAMIC; -- 表 6: datai_meta_job_log CREATE TABLE `datai_meta_job_log` ( -- 表结构定义 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '作业日志表' ROW_FORMAT = DYNAMIC; ``` ### 2. Java 实体类格式 ```java package com.datai.salesforce.metadata.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; /** * Salesforce组织配置实体类 */ @Data @TableName("datai_meta_org_config") public class DataiMetaOrgConfig { @TableId(value = "id", type = IdType.AUTO) private Long id; @TableField("org_name") private String orgName; @TableField("org_type") private String orgType; @TableField("instance_url") private String instanceUrl; @TableField("auth_type") private String authType; @TableField("client_id") private String clientId; @TableField("client_secret") private String clientSecret; @TableField("username") private String username; @TableField("password") private String password; @TableField("security_token") private String securityToken; @TableField("access_token") private String accessToken; @TableField("refresh_token") private String refreshToken; @TableField("token_expires_at") private LocalDateTime tokenExpiresAt; @TableField("api_version") private String apiVersion; @TableField("is_active") private Integer isActive; @TableField("dept_id") private Long deptId; @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField("remark") private String remark; } ``` ### 3. Mapper 接口格式 ```java package com.datai.salesforce.metadata.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.datai.salesforce.metadata.entity.DataiMetaOrgConfig; import org.apache.ibatis.annotations.Mapper; /** * Salesforce组织配置Mapper接口 */ @Mapper public interface DataiMetaOrgConfigMapper extends BaseMapper { } ``` ### 4. 单元测试格式 ```java package com.datai.salesforce.metadata.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.datai.salesforce.metadata.entity.DataiMetaOrgConfig; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.time.LocalDateTime; import java.util.List; import static org.junit.jupiter.api.Assertions.*; /** * Salesforce组织配置Mapper单元测试 */ @SpringBootTest public class DataiMetaOrgConfigMapperTest { @Autowired private DataiMetaOrgConfigMapper mapper; @Test public void testInsert() { // 测试插入 } @Test public void testSelectById() { // 测试根据ID查询 } @Test public void testUpdateById() { // 测试根据ID更新 } @Test public void testDeleteById() { // 测试根据ID删除 } @Test public void testSelectList() { // 测试查询列表 } } ``` ## 约束 ### 1. 技术栈限制 - **持久层框架**: 必须使用 MyBatis Plus 3.x - **数据库**: 必须使用 MySQL 8.0+ - **Java 版本**: 必须使用 Java 17+ - **Spring Boot 版本**: 必须使用 Spring Boot 3.x - **ORM 框架**: 必须使用 MyBatis Plus,不能使用 JPA/Hibernate - **代码生成**: 必须使用 MyBatis Plus 的注解方式,不能使用 XML 映射文件 ### 2. 命名规范 - **表名**: 必须使用 `datai_meta_` 前缀,使用小写字母和下划线 - **实体类名**: 必须使用 `DataiMeta` 前缀,使用大驼峰命名 - **Mapper 接口名**: 必须使用 `DataiMeta` 前缀,以 `Mapper` 结尾 - **字段名**: 数据库字段使用小写字母和下划线,Java 字段使用小驼峰命名 - **包名**: 必须使用 `com.datai.salesforce.metadata` 作为基础包名 ### 3. 基础字段规范 所有实体类必须包含以下基础字段: ```java @TableField("dept_id") private Long deptId; @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField("remark") private String remark; ``` ### 4. MyBatis Plus 注解规范 - **@TableName**: 指定表名,必须与数据库表名一致 - **@TableId**: 指定主键,必须使用 `IdType.AUTO` - **@TableField**: 指定字段映射,必须指定数据库字段名 - **@TableField(fill)**: 必须使用 `FieldFill.INSERT` 和 `FieldFill.INSERT_UPDATE` 自动填充 - **@Mapper**: 必须在 Mapper 接口上添加 `@Mapper` 注解 ### 5. 性能要求 - **查询性能**: 单表查询响应时间 < 100ms - **批量操作**: 批量插入 1000 条数据 < 1s - **并发支持**: 支持并发查询,不出现死锁 - **索引优化**: 必须为常用查询字段创建索引,避免冗余索引 ### 6. 安全性要求 - **敏感字段**: 密码、令牌等敏感字段必须加密存储 - **SQL 注入**: 必须使用 MyBatis Plus 的参数化查询,防止 SQL 注入 - **数据验证**: 必须在实体类中添加数据验证注解(@NotNull, @Size, @Pattern 等) ### 7. 兼容性要求 - **字符集**: 必须使用 `utf8mb4` 字符集和 `utf8mb4_general_ci` 排序规则 - **存储引擎**: 必须使用 `InnoDB` 存储引擎 - **行格式**: 必须使用 `DYNAMIC` 行格式 - **索引类型**: 必须使用 `BTREE` 索引类型 ## Rule Set "请严格参考 @Authentication.canvas 中的状态机转移逻辑,不要自行发挥。" **具体规则**: - 必须使用 Canvas 中定义的类名和方法名 - 必须遵循 Canvas 中定义的调用关系 - 必须参考 Canvas 中的流程图逻辑 - 必须使用 SessionManager 进行会话管理和自动重新登录 - 必须使用现有的认证模块进行 OAuth 认证 - 必须使用现有的集成核心功能进行 API 调用 - 必须遵循现有的异常处理机制 - 必须遵循现有的日志记录规范 **MyBatis Plus 规则**: - 必须使用 MyBatis Plus 的注解方式,不能使用 XML 映射文件 - 必须使用 MyBatis Plus 的 BaseMapper,不能自定义 SQL - 必须使用 MyBatis Plus 的自动填充功能 - 必须使用 MyBatis Plus 的分页插件 - 必须使用 MyBatis Plus 的代码生成器规范 **Flyway 规则**: - 迁移脚本命名必须遵循 `V{version}__{description}.sql` 格式 - 迁移脚本必须包含 `DROP TABLE IF EXISTS` 语句 - 迁移脚本必须按依赖顺序执行(先删除依赖表,再创建表) - 迁移脚本必须记录在 Flyway 历史表中 ## 验收标准 ### 1. 功能完整性 - ✅ 所有 6 个数据库表的 SQL 创建语句完整正确 - ✅ 所有实体类包含所有字段,字段映射正确 - ✅ 所有 Mapper 接口继承 BaseMapper - ✅ 所有 Flyway 迁移脚本可执行 - ✅ 所有单元测试覆盖主要功能 ### 2. 代码正确性 - ✅ SQL 语法正确,可以在 MySQL 中执行 - ✅ Java 代码编译通过,无语法错误 - ✅ MyBatis Plus 注解使用正确 - ✅ 单元测试可以执行,测试通过 ### 3. 文档准确性 - ✅ 代码注释完整,符合 JavaDoc 规范 - ✅ 字段注释与数据库表注释一致 - ✅ 类注释清晰描述类的用途 ### 4. 性能指标 - ✅ 单表查询响应时间 < 100ms - ✅ 批量插入 1000 条数据 < 1s - ✅ 支持并发查询,不出现死锁 ### 5. 代码规范性 - ✅ 代码符合阿里巴巴 Java 开发规范 - ✅ 代码符合 MyBatis Plus 最佳实践 - ✅ 代码符合项目编码规范 - ✅ 代码格式化正确,缩进一致 ## 风险 ### 1. 输出质量风险 - **SQL 语法错误**: 可能导致数据库创建失败 - **Java 代码错误**: 可能导致编译失败 - **注解使用错误**: 可能导致 MyBatis Plus 映射失败 - **单元测试不完整**: 可能导致代码质量无法保证 **缓解措施**: - 在生成代码后进行代码审查 - 在测试环境中执行 SQL 脚本 - 运行单元测试验证代码正确性 ### 2. 技术实现风险 - **MyBatis Plus 版本兼容**: 可能存在版本兼容性问题 - **MySQL 版本兼容**: 可能存在 MySQL 版本兼容性问题 - **Flyway 迁移失败**: 可能导致数据库版本管理失败 **缓解措施**: - 使用稳定版本的 MyBatis Plus - 在测试环境中验证 MySQL 兼容性 - 准备 Flyway 迁移回滚脚本 ### 3. 时间成本风险 - **代码生成时间**: 生成 6 个表的完整代码可能需要较长时间 - **测试时间**: 编写和运行单元测试可能需要较长时间 **缓解措施**: - 使用代码生成器提高效率 - 并行执行单元测试 - 使用 Mock 数据减少测试时间 ### 4. 其他潜在风险 - **数据一致性风险**: 应用层需要保证数据一致性 - **性能风险**: 大量数据查询可能影响性能 - **安全风险**: 敏感字段需要加密存储 **缓解措施**: - 在 Service 层添加事务管理 - 为常用查询字段创建索引 - 使用加密算法加密敏感字段 ## 使用记录 | 日期 | 使用场景 | 输入参数 | 输出结果 | 反馈 | 改进措施 | |------|---------|---------|---------|------|----------| | 2026-01-17 | 初始创建数据库表结构 | REQ-010-1, 0010-database-table-design | 6个表的SQL、实体类、Mapper、单元测试 | 待使用 | 待反馈 |