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

411 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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