411 lines
13 KiB
Markdown
411 lines
13 KiB
Markdown
# 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<DataiMetaOrgConfig> {
|
||
}
|
||
```
|
||
|
||
### 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、单元测试 | 待使用 | 待反馈 |
|