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

13 KiB
Raw Permalink Blame History

Prompt - 数据库表结构设计和创建

输入引用

引用相关的 docs 文档链接:

Context Maps

强制列出本次 Prompt 依赖的 Canvas 文件:

目标

本提示词的目标是生成完整的数据库表结构设计和创建代码,包括:

  1. 数据库表结构: 根据 ADR 决策生成 6 个核心表的完整 SQL 创建语句
  2. 实体类代码: 使用 MyBatis Plus 规范生成对应的 Java 实体类
  3. Mapper 接口: 使用 MyBatis Plus 规范生成对应的 Mapper 接口
  4. Flyway 迁移脚本: 生成数据库版本迁移脚本
  5. 单元测试: 生成完整的单元测试代码

输出格式

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