REQ-010-1 完成内容: - 创建 6 个数据库表设计(datai_meta_org_config、datai_meta_task、datai_meta_job_execution、datai_meta_component、datai_meta_deploy_history、datai_meta_job_log) - 设计了合理的索引策略 - 对敏感字段进行了加密存储设计 - 表名前缀统一为 datai_meta_ - 所有表包含标准基础字段 REQ-010-2 完成内容: - 补充用户故事和细化验收标准 - 创建架构决策记录(MyBatis Plus 注解 + XML 映射文件混合方案) - 对比了 3 种备选方案 - 分析了决策对系统架构、开发流程、运维管理的影响 - 识别了技术风险、业务风险和实施风险 - 定义了回滚策略和验收标准 文档更新: - 创建 0010-database-table-design.md 架构决策记录 - 创建 0011-entity-mapper-create.md 架构决策记录 - 创建 0020-database-table-design-create.md 变更记录 - 创建 20260117-database-table-design-create.md 会话记录 - 创建 20260117-database-table-design-create-retro.md 复盘报告 - 创建 011-database-table-design-create.md 提示词文档 - 更新 REQ-010-2.md 需求文档 - 更新 docs/index.md 和 CHANGELOG.md
13 KiB
13 KiB
Prompt - 数据库表结构设计和创建
输入引用
引用相关的 docs 文档链接:
- REQ-010-1.md - 数据库表结构设计和创建需求文档
- 0010-database-table-design.md - 数据库表结构设计和创建架构决策
- REQ-010.md - Salesforce元数据拉取和部署主需求文档
- datai_table.sql - 现有数据库表结构参考
Context Maps
强制列出本次 Prompt 依赖的 Canvas 文件:
- Authentication.canvas - 项目架构视觉化展示
- 相关节点: 集成核心 - 提供与Salesforce的各种连接方式
- 相关节点: SessionManager - 会话管理,提供登录服务
目标
本提示词的目标是生成完整的数据库表结构设计和创建代码,包括:
- 数据库表结构: 根据 ADR 决策生成 6 个核心表的完整 SQL 创建语句
- 实体类代码: 使用 MyBatis Plus 规范生成对应的 Java 实体类
- Mapper 接口: 使用 MyBatis Plus 规范生成对应的 Mapper 接口
- Flyway 迁移脚本: 生成数据库版本迁移脚本
- 单元测试: 生成完整的单元测试代码
输出格式
1. 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 实体类格式
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 接口格式
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<DataiMetaOrgConfig> {
}
4. 单元测试格式
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. 基础字段规范
所有实体类必须包含以下基础字段:
@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、单元测试 | 待使用 | 待反馈 |