datai/docs/archive/prompts/011-database-table-design-create.md

411 lines
13 KiB
Markdown
Raw Normal View History

# 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、单元测试 | 待使用 | 待反馈 |