| name | 44-database-design |
| description | BK-CI 数据库设计规范与表结构指南,涵盖命名规范、字段类型选择、索引设计、分表策略、数据归档。当用户设计数据库表、优化索引、规划分表策略或进行数据库架构设计时使用。 |
BK-CI 数据库设计规范与表结构指南
一、数据库架构概述
1.1 数据库分布
BK-CI 采用微服务架构,每个服务拥有独立的数据库:
| 数据库名 | 所属服务 | 说明 |
|---|---|---|
devops_ci_process |
Process | 流水线核心数据,表最多(89KB DDL) |
devops_ci_store |
Store | 研发商店数据(87KB DDL) |
devops_ci_auth |
Auth | 权限认证数据(33KB DDL) |
devops_ci_project |
Project | 项目管理数据(25KB DDL) |
devops_ci_quality |
Quality | 质量红线数据(25KB DDL) |
devops_ci_dispatch |
Dispatch | 构建调度数据(24KB DDL) |
devops_ci_repository |
Repository | 代码库数据(19KB DDL) |
devops_ci_metrics |
Metrics | 度量数据(20KB DDL) |
devops_ci_environment |
Environment | 构建机环境数据(14KB DDL) |
devops_ci_notify |
Notify | 通知服务数据(14KB DDL) |
devops_ci_ticket |
Ticket | 凭证管理数据(5KB DDL) |
devops_ci_artifactory |
Artifactory | 制品库数据(4KB DDL) |
devops_ci_openapi |
OpenAPI | 开放接口数据(3KB DDL) |
devops_ci_log |
Log | 日志服务数据(2KB DDL) |
1.2 SQL 脚本组织规范
support-files/sql/
├── 0001_ci_create-database_mysql.sql # 创建所有数据库
├── 1001_ci_*_ddl_mysql.sql # 各模块完整 DDL
├── 2001_v0.x/ # v0.x 版本增量更新
├── 2002_v1.x/ # v1.x 版本增量更新
├── 2003_v2.x/ # v2.x 版本增量更新
├── 2004_v3.x/ # v3.x 版本增量更新
├── 2025_v4.x/ # v4.x 版本增量更新
└── 5001_init_dml/ # 初始化数据
命名规范:
- 创建数据库:
0001_{系统}_create-database_{db类型}.sql - 完整 DDL:
1xxx_{系统}_{模块}_ddl_{db类型}.sql - 增量更新:
2xxx_{系统}_{模块}_update_{版本号}_{db类型}.sql - 初始化数据:
5001_{系统}_{模块}_dml_{db类型}.sql
二、核心表结构详解
2.1 Process 模块(流水线核心)
流水线信息表
-- T_PIPELINE_INFO:流水线基本信息
CREATE TABLE T_PIPELINE_INFO (
PIPELINE_ID varchar(34) PRIMARY KEY, -- 流水线ID(P-32位UUID)
PROJECT_ID varchar(64) NOT NULL, -- 项目ID
PIPELINE_NAME varchar(255) NOT NULL, -- 流水线名称
VERSION int(11) DEFAULT 1, -- 版本号
CHANNEL varchar(32), -- 渠道(BS/CODECC/AM等)
CREATOR varchar(64) NOT NULL, -- 创建者
CREATE_TIME timestamp NOT NULL, -- 创建时间
LAST_MODIFY_USER varchar(64) NOT NULL, -- 最近修改者
UPDATE_TIME timestamp, -- 更新时间
`DELETE` bit(1) DEFAULT b'0', -- 软删除标记
LOCKED bit(1) DEFAULT b'0', -- 锁定标记(PAC)
UNIQUE KEY (PROJECT_ID, PIPELINE_NAME)
);
-- T_PIPELINE_RESOURCE:流水线编排资源
CREATE TABLE T_PIPELINE_RESOURCE (
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(34) NOT NULL,
VERSION int(11) NOT NULL DEFAULT 1, -- 版本号
MODEL mediumtext, -- 流水线模型(JSON)
YAML mediumtext, -- YAML 编排
CREATOR varchar(64),
CREATE_TIME timestamp NOT NULL,
PRIMARY KEY (PIPELINE_ID, VERSION)
);
-- T_PIPELINE_SETTING:流水线配置
CREATE TABLE T_PIPELINE_SETTING (
PIPELINE_ID varchar(34) PRIMARY KEY,
PROJECT_ID varchar(64),
NAME varchar(255),
RUN_LOCK_TYPE int(11) DEFAULT 1, -- 运行锁类型
WAIT_QUEUE_TIME_SECOND int(11) DEFAULT 7200,-- 最大排队时长
MAX_QUEUE_SIZE int(11) DEFAULT 10, -- 最大排队数量
CONCURRENCY_GROUP varchar(255), -- 并发组
BUILD_NUM_RULE varchar(512), -- 构建号规则
SUCCESS_SUBSCRIPTION text, -- 成功订阅
FAILURE_SUBSCRIPTION text -- 失败订阅
);
构建历史表
-- T_PIPELINE_BUILD_HISTORY:构建历史(核心表)
CREATE TABLE T_PIPELINE_BUILD_HISTORY (
BUILD_ID varchar(34) PRIMARY KEY, -- 构建ID(b-32位UUID)
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(34) NOT NULL,
BUILD_NUM int(20) DEFAULT 0, -- 构建号
VERSION int(11), -- 编排版本号
STATUS int(11), -- 构建状态
START_USER varchar(64), -- 启动者
TRIGGER varchar(32) NOT NULL, -- 触发方式
TRIGGER_USER varchar(64), -- 触发者
START_TIME timestamp, -- 开始时间
END_TIME timestamp, -- 结束时间
EXECUTE_TIME bigint(20), -- 执行时长
MATERIAL mediumtext, -- 代码材料
BUILD_PARAMETERS mediumtext, -- 构建参数
ERROR_TYPE int(11), -- 错误类型
ERROR_CODE int(11), -- 错误码
ERROR_MSG text, -- 错误信息
-- 索引设计
KEY STATUS_KEY (PROJECT_ID, PIPELINE_ID, STATUS),
KEY INX_PROJECT_PIPELINE_NUM (PROJECT_ID, PIPELINE_ID, BUILD_NUM),
KEY INX_PROJECT_PIPELINE_START_TIME (PROJECT_ID, PIPELINE_ID, START_TIME),
KEY inx_status (STATUS),
KEY inx_start_time (START_TIME)
);
-- T_PIPELINE_BUILD_SUMMARY:构建摘要(聚合表)
CREATE TABLE T_PIPELINE_BUILD_SUMMARY (
PIPELINE_ID varchar(34) PRIMARY KEY,
PROJECT_ID varchar(64) NOT NULL,
BUILD_NUM int(11) DEFAULT 0, -- 当前构建号
FINISH_COUNT int(11) DEFAULT 0, -- 完成次数
RUNNING_COUNT int(11) DEFAULT 0, -- 运行中次数
QUEUE_COUNT int(11) DEFAULT 0, -- 排队次数
LATEST_BUILD_ID varchar(34), -- 最近构建ID
LATEST_STATUS int(11), -- 最近状态
LATEST_START_TIME timestamp, -- 最近开始时间
LATEST_END_TIME timestamp -- 最近结束时间
);
构建任务表
-- T_PIPELINE_BUILD_TASK:构建任务详情
CREATE TABLE T_PIPELINE_BUILD_TASK (
BUILD_ID varchar(34) NOT NULL,
TASK_ID varchar(34) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(34) NOT NULL,
STAGE_ID varchar(34) NOT NULL,
CONTAINER_ID varchar(34) NOT NULL,
TASK_NAME varchar(128),
TASK_TYPE varchar(64) NOT NULL, -- 任务类型
TASK_ATOM varchar(128), -- 插件标识
ATOM_CODE varchar(128), -- 插件代码
STATUS int(11), -- 任务状态
START_TIME timestamp,
END_TIME timestamp,
EXECUTE_COUNT int(11) DEFAULT 0, -- 执行次数
ERROR_TYPE int(11),
ERROR_CODE int(11),
ERROR_MSG text,
TASK_PARAMS mediumtext, -- 任务参数(JSON)
PRIMARY KEY (BUILD_ID, TASK_ID),
KEY PROJECT_PIPELINE (PROJECT_ID, PIPELINE_ID)
);
-- T_PIPELINE_BUILD_STAGE:构建阶段
CREATE TABLE T_PIPELINE_BUILD_STAGE (
BUILD_ID varchar(64) NOT NULL,
STAGE_ID varchar(64) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(64) NOT NULL,
SEQ int(11) NOT NULL, -- 阶段序号
STATUS int(11),
START_TIME timestamp,
END_TIME timestamp,
CHECK_IN mediumtext, -- 准入检查
CHECK_OUT mediumtext, -- 准出检查
PRIMARY KEY (BUILD_ID, STAGE_ID)
);
-- T_PIPELINE_BUILD_CONTAINER:构建容器
CREATE TABLE T_PIPELINE_BUILD_CONTAINER (
BUILD_ID varchar(64) NOT NULL,
STAGE_ID varchar(64) NOT NULL,
CONTAINER_ID varchar(64) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(64) NOT NULL,
CONTAINER_TYPE varchar(45), -- 容器类型
SEQ int(11) NOT NULL,
STATUS int(11),
MATRIX_GROUP_FLAG BIT(1), -- 是否矩阵构建
MATRIX_GROUP_ID varchar(64), -- 矩阵组ID
JOB_ID varchar(128),
PRIMARY KEY (BUILD_ID, STAGE_ID, CONTAINER_ID)
);
-- T_PIPELINE_BUILD_VAR:构建变量
CREATE TABLE T_PIPELINE_BUILD_VAR (
BUILD_ID varchar(34) NOT NULL,
`KEY` varchar(255) NOT NULL, -- 变量名
`VALUE` varchar(4000), -- 变量值
PROJECT_ID varchar(64),
PIPELINE_ID varchar(64),
VAR_TYPE VARCHAR(64), -- 变量类型
READ_ONLY bit(1), -- 是否只读
PRIMARY KEY (BUILD_ID, `KEY`)
);
构建执行记录表(RECORD 系列)
重要: BK-CI 有两套构建记录表,BUILD 系列用于引擎执行调度,RECORD 系列用于前端展示和历史查询。 RECORD 系列通过
EXECUTE_COUNT字段支持同一构建的多次重试记录。
-- T_PIPELINE_BUILD_RECORD_MODEL:构建模型记录(支持多次执行)
CREATE TABLE T_PIPELINE_BUILD_RECORD_MODEL (
BUILD_ID varchar(34) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(34) NOT NULL,
RESOURCE_VERSION int(11) NOT NULL, -- 编排版本
BUILD_NUM int(20) NOT NULL, -- 构建次数
EXECUTE_COUNT int(11) NOT NULL, -- 执行次数(重试时递增)
START_USER varchar(32) NOT NULL,
MODEL_VAR mediumtext NOT NULL, -- 模型级别变量(JSON)
START_TYPE varchar(32) NOT NULL, -- 触发方式
QUEUE_TIME datetime(3) NOT NULL,
START_TIME datetime(3) NULL,
END_TIME datetime(3) NULL,
STATUS varchar(32),
ERROR_INFO text, -- 错误信息
CANCEL_USER varchar(32),
TIMESTAMPS text, -- 时间戳集合
PRIMARY KEY (BUILD_ID, EXECUTE_COUNT)
);
-- T_PIPELINE_BUILD_RECORD_STAGE:阶段记录
CREATE TABLE T_PIPELINE_BUILD_RECORD_STAGE (
BUILD_ID varchar(64) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(64) NOT NULL,
RESOURCE_VERSION int(11),
STAGE_ID varchar(64) NOT NULL,
SEQ int(11) NOT NULL,
STAGE_VAR text NOT NULL, -- 阶段级别变量
STATUS varchar(32),
EXECUTE_COUNT int(11) NOT NULL DEFAULT 1,
START_TIME datetime(3) NULL,
END_TIME datetime(3) NULL,
TIMESTAMPS text,
PRIMARY KEY (BUILD_ID, STAGE_ID, EXECUTE_COUNT)
);
-- T_PIPELINE_BUILD_RECORD_CONTAINER:容器记录
CREATE TABLE T_PIPELINE_BUILD_RECORD_CONTAINER (
BUILD_ID varchar(64) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(64) NOT NULL,
RESOURCE_VERSION int(11) NOT NULL,
STAGE_ID varchar(64) NOT NULL,
CONTAINER_ID varchar(64) NOT NULL,
EXECUTE_COUNT int(11) NOT NULL DEFAULT 1,
STATUS varchar(32),
CONTAINER_VAR mediumtext NOT NULL, -- 容器级别变量
CONTAINER_TYPE varchar(45),
CONTAIN_POST_TASK bit(1), -- 包含POST插件标识
MATRIX_GROUP_FLAG bit(1), -- 矩阵标识
MATRIX_GROUP_ID varchar(64),
START_TIME datetime(3) NULL,
END_TIME datetime(3) NULL,
TIMESTAMPS text,
PRIMARY KEY (BUILD_ID, CONTAINER_ID, EXECUTE_COUNT)
);
-- T_PIPELINE_BUILD_RECORD_TASK:任务记录
CREATE TABLE T_PIPELINE_BUILD_RECORD_TASK (
BUILD_ID varchar(34) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
PIPELINE_ID varchar(34) NOT NULL,
RESOURCE_VERSION int(11) NOT NULL,
STAGE_ID varchar(34) NOT NULL,
CONTAINER_ID varchar(34) NOT NULL,
TASK_ID varchar(34) NOT NULL,
TASK_SEQ int(11) NOT NULL DEFAULT 1,
EXECUTE_COUNT int(11) NOT NULL DEFAULT 1,
STATUS varchar(32),
TASK_VAR mediumtext NOT NULL, -- 任务级别变量
POST_INFO text, -- POST插件关联信息
CLASS_TYPE varchar(64) NOT NULL,
ATOM_CODE varchar(128) NOT NULL,
ORIGIN_CLASS_TYPE varchar(64),
START_TIME datetime(3) NULL,
END_TIME datetime(3) NULL,
TIMESTAMPS text,
ASYNC_STATUS varchar(32), -- 异步执行状态
PRIMARY KEY (BUILD_ID, TASK_ID, EXECUTE_COUNT)
);
BUILD vs RECORD 表使用场景:
| 场景 | BUILD 表 | RECORD 表 |
|---|---|---|
| 引擎调度执行 | ✅ | ❌ |
| Worker 拉取任务 | ✅ | ❌ |
| 前端构建详情页 | ❌ | ✅ |
| 查看历史执行记录 | ❌ | ✅ |
| 重试时保留历史 | ❌ 覆盖 | ✅ 新增 |
模板相关表
-- T_TEMPLATE:流水线模板
CREATE TABLE T_TEMPLATE (
VERSION bigint(20) AUTO_INCREMENT, -- 模板版本
ID varchar(32) NOT NULL, -- 模板ID
TEMPLATE_NAME varchar(64) NOT NULL,
PROJECT_ID varchar(34) NOT NULL,
VERSION_NAME varchar(64) NOT NULL,
TEMPLATE mediumtext, -- 模板内容(JSON)
TYPE varchar(32) DEFAULT 'CUSTOMIZE', -- 类型
STORE_FLAG bit(1) DEFAULT b'0', -- 是否关联商店
PRIMARY KEY (VERSION),
KEY ID (ID)
);
-- T_TEMPLATE_PIPELINE:模板实例关联
CREATE TABLE T_TEMPLATE_PIPELINE (
PIPELINE_ID varchar(34) PRIMARY KEY,
PROJECT_ID varchar(64) NOT NULL,
TEMPLATE_ID varchar(32) NOT NULL,
VERSION bigint(20) NOT NULL,
INSTANCE_TYPE VARCHAR(32) DEFAULT 'CONSTRAINT', -- FREEDOM/CONSTRAINT
PARAM mediumtext, -- 实例参数
STATUS varchar(32) DEFAULT 'UPDATED'
);
2.2 Project 模块(项目管理)
-- T_PROJECT:项目信息(核心表)
CREATE TABLE T_PROJECT (
ID bigint(20) AUTO_INCREMENT,
PROJECT_ID varchar(32) NOT NULL, -- 项目ID(英文名)
project_name varchar(64) NOT NULL, -- 项目名称
english_name varchar(64) NOT NULL, -- 英文名称
creator varchar(32), -- 创建者
description text, -- 描述
is_offlined bit(1) DEFAULT b'0', -- 是否停用
bg_id bigint(20), -- 事业群ID
bg_name varchar(255), -- 事业群名称
dept_id bigint(20), -- 部门ID
dept_name varchar(255), -- 部门名称
center_id bigint(20), -- 中心ID
center_name varchar(255), -- 中心名称
approval_status int(10) DEFAULT 1, -- 审核状态
CHANNEL varchar(32) DEFAULT 'BS', -- 渠道
pipeline_limit int(10) DEFAULT 500, -- 流水线数量上限
router_tag varchar(32), -- 路由标签
properties text, -- 其他配置
PRIMARY KEY (ID),
UNIQUE KEY project_name (project_name),
UNIQUE KEY project_id (PROJECT_ID),
UNIQUE KEY english_name (english_name)
);
-- T_SERVICE:服务信息
CREATE TABLE T_SERVICE (
id bigint(20) AUTO_INCREMENT PRIMARY KEY,
name varchar(64), -- 服务名称
english_name varchar(64), -- 英文名称
service_type_id bigint(20), -- 服务类型
link varchar(255), -- 跳转链接
status varchar(64), -- 状态
UNIQUE KEY service_name (name)
);
-- T_SHARDING_ROUTING_RULE:分片路由规则
CREATE TABLE T_SHARDING_ROUTING_RULE (
ID varchar(32) PRIMARY KEY,
ROUTING_NAME varchar(128) NOT NULL, -- 路由名称
ROUTING_RULE varchar(256) NOT NULL, -- 路由规则
CLUSTER_NAME varchar(64) DEFAULT 'prod', -- 集群名称
MODULE_CODE varchar(64) DEFAULT 'PROCESS', -- 模块标识
TYPE varchar(32) DEFAULT 'DB', -- 路由类型
DATA_SOURCE_NAME varchar(128) DEFAULT 'ds_0'-- 数据源名称
);
2.3 Auth 模块(权限认证)
-- T_AUTH_RESOURCE:资源表
CREATE TABLE T_AUTH_RESOURCE (
ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_CODE varchar(32) NOT NULL,
RESOURCE_TYPE varchar(32) NOT NULL, -- 资源类型
RESOURCE_CODE varchar(255) NOT NULL, -- 资源ID
RESOURCE_NAME varchar(255) NOT NULL, -- 资源名
IAM_RESOURCE_CODE varchar(32) NOT NULL, -- IAM资源ID
ENABLE bit(1) DEFAULT b'0', -- 是否启用权限管理
RELATION_ID varchar(32) NOT NULL, -- IAM分级管理员ID
UNIQUE KEY IDX_PROJECT_RESOURCE (PROJECT_CODE, RESOURCE_TYPE, RESOURCE_CODE)
);
-- T_AUTH_RESOURCE_GROUP:资源用户组
CREATE TABLE T_AUTH_RESOURCE_GROUP (
ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_CODE varchar(32) NOT NULL,
RESOURCE_TYPE varchar(32) NOT NULL,
RESOURCE_CODE varchar(255) NOT NULL,
GROUP_CODE varchar(32) NOT NULL, -- 用户组标识
GROUP_NAME varchar(255) NOT NULL, -- 用户组名称
DEFAULT_GROUP bit(1) DEFAULT b'1', -- 是否默认组
RELATION_ID varchar(32) NOT NULL, -- IAM组ID
UNIQUE KEY (PROJECT_CODE, RESOURCE_TYPE, RESOURCE_CODE, GROUP_NAME)
);
-- T_AUTH_RESOURCE_GROUP_MEMBER:用户组成员
CREATE TABLE T_AUTH_RESOURCE_GROUP_MEMBER (
ID bigint AUTO_INCREMENT PRIMARY KEY,
PROJECT_CODE varchar(64) NOT NULL,
RESOURCE_TYPE varchar(32) NOT NULL,
RESOURCE_CODE varchar(255) NOT NULL,
GROUP_CODE varchar(32) NOT NULL,
IAM_GROUP_ID int(20) NOT NULL,
MEMBER_ID varchar(64) NOT NULL, -- 成员ID
MEMBER_NAME varchar(512) NOT NULL, -- 成员名
MEMBER_TYPE varchar(32) NOT NULL, -- 成员类型
EXPIRED_TIME datetime NOT NULL, -- 过期时间
UNIQUE KEY (PROJECT_CODE, IAM_GROUP_ID, MEMBER_ID)
);
-- T_AUTH_ACTION:权限操作表
CREATE TABLE T_AUTH_ACTION (
ACTION varchar(64) PRIMARY KEY, -- 操作ID
RESOURCE_TYPE varchar(64) NOT NULL, -- 关联资源类型
ACTION_NAME varchar(64) NOT NULL, -- 操作名称
ACTION_TYPE varchar(32) -- 操作类型
);
2.4 Store 模块(研发商店)
-- T_ATOM:插件信息
CREATE TABLE T_ATOM (
ID varchar(32) PRIMARY KEY,
NAME varchar(64) NOT NULL, -- 插件名称
ATOM_CODE varchar(64) NOT NULL, -- 插件唯一标识
CLASS_TYPE varchar(64) NOT NULL, -- 插件大类
VERSION varchar(30) NOT NULL, -- 版本号
ATOM_STATUS tinyint(4) NOT NULL, -- 插件状态
ATOM_TYPE tinyint(4) DEFAULT 1, -- 插件类型
OS varchar(100) NOT NULL, -- 支持的操作系统
CLASSIFY_ID varchar(32) NOT NULL, -- 分类ID
LATEST_FLAG bit(1) NOT NULL, -- 是否最新版本
DEFAULT_FLAG bit(1) DEFAULT b'0', -- 是否默认插件
PUBLISHER varchar(50) DEFAULT 'system', -- 发布者
PROPS text, -- 插件属性(JSON)
UNIQUE KEY (ATOM_CODE, VERSION),
KEY inx_atom_status (ATOM_STATUS),
KEY inx_latest_flag (LATEST_FLAG)
);
-- T_ATOM_ENV_INFO:插件执行环境
CREATE TABLE T_ATOM_ENV_INFO (
ID varchar(32) PRIMARY KEY,
ATOM_ID varchar(32) NOT NULL,
PKG_PATH varchar(1024) NOT NULL, -- 安装包路径
LANGUAGE varchar(64), -- 开发语言
TARGET varchar(256) NOT NULL, -- 执行入口
OS_NAME varchar(128), -- 操作系统
OS_ARCH varchar(128), -- 系统架构
RUNTIME_VERSION varchar(128), -- 运行时版本
DEFAULT_FLAG bit(1) DEFAULT b'1', -- 是否默认环境
UNIQUE KEY (ATOM_ID, OS_NAME, OS_ARCH)
);
-- T_STORE_PROJECT_REL:商店组件与项目关联
CREATE TABLE T_STORE_PROJECT_REL (
ID varchar(32) PRIMARY KEY,
STORE_CODE varchar(64) NOT NULL, -- 组件编码
PROJECT_CODE varchar(64) NOT NULL, -- 项目ID
TYPE tinyint(4) NOT NULL, -- 关联类型
STORE_TYPE tinyint(4) DEFAULT 0, -- 组件类型
UNIQUE KEY (STORE_CODE, STORE_TYPE, PROJECT_CODE, TYPE, INSTANCE_ID, CREATOR)
);
-- T_STORE_STATISTICS_TOTAL:统计信息
CREATE TABLE T_STORE_STATISTICS_TOTAL (
ID varchar(32) PRIMARY KEY,
STORE_CODE varchar(64) NOT NULL,
STORE_TYPE tinyint(4) DEFAULT 0,
DOWNLOADS int(11) DEFAULT 0, -- 下载量
COMMITS int(11) DEFAULT 0, -- 评论数
SCORE int(11) DEFAULT 0, -- 评分
SCORE_AVERAGE decimal(3,1) DEFAULT 0.0, -- 平均分
PIPELINE_NUM INT(11) DEFAULT 0, -- 流水线数
UNIQUE KEY (STORE_CODE, STORE_TYPE)
);
2.5 Repository 模块(代码库)
-- T_REPOSITORY:代码库信息
CREATE TABLE T_REPOSITORY (
REPOSITORY_ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_ID varchar(32) NOT NULL,
USER_ID varchar(64) NOT NULL,
ALIAS_NAME varchar(255) NOT NULL, -- 别名
URL varchar(255) NOT NULL, -- 仓库URL
TYPE varchar(20) NOT NULL, -- 类型(SVN/GIT/GITHUB等)
REPOSITORY_HASH_ID varchar(64), -- 哈希ID
IS_DELETED bit(1) NOT NULL, -- 是否删除
ENABLE_PAC bit(1) DEFAULT false, -- 是否开启PAC
KEY PROJECT_ID (PROJECT_ID),
KEY inx_alias_name (ALIAS_NAME)
);
-- T_REPOSITORY_CODE_GIT:Git代码库详情
CREATE TABLE T_REPOSITORY_CODE_GIT (
REPOSITORY_ID bigint(20) PRIMARY KEY,
PROJECT_NAME varchar(255) NOT NULL, -- 项目名称
USER_NAME varchar(64) NOT NULL, -- 用户名
CREDENTIAL_ID varchar(64) NOT NULL, -- 凭据ID
AUTH_TYPE varchar(8), -- 认证方式
GIT_PROJECT_ID bigint(20) DEFAULT 0 -- Git项目ID
);
-- T_REPOSITORY_COMMIT:提交记录
CREATE TABLE T_REPOSITORY_COMMIT (
ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
BUILD_ID varchar(34),
PIPELINE_ID varchar(34),
REPO_ID bigint(20),
TYPE smallint(6), -- 1-svn, 2-git, 3-gitlab
COMMIT varchar(64), -- 提交ID
COMMITTER varchar(32), -- 提交者
COMMIT_TIME datetime, -- 提交时间
COMMENT longtext, -- 提交信息
KEY IDX_BUILD_ID_TIME (BUILD_ID, COMMIT_TIME)
);
2.6 Dispatch 模块(构建调度)
-- T_DISPATCH_THIRDPARTY_AGENT_BUILD:第三方构建机任务
CREATE TABLE T_DISPATCH_THIRDPARTY_AGENT_BUILD (
ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_ID varchar(64) NOT NULL,
AGENT_ID varchar(32) NOT NULL, -- 构建机ID
PIPELINE_ID varchar(34) NOT NULL,
BUILD_ID varchar(34) NOT NULL,
VM_SEQ_ID varchar(34) NOT NULL, -- 构建序列号
STATUS int(11) NOT NULL, -- 状态
WORKSPACE varchar(4096), -- 工作空间
NODE_ID bigint(20) DEFAULT 0, -- 节点ID
DOCKER_INFO json, -- Docker构建信息
UNIQUE KEY (BUILD_ID, VM_SEQ_ID),
KEY idx_agent_id (AGENT_ID),
KEY idx_status (STATUS)
);
-- T_DISPATCH_RUNNING_JOBS:运行中的任务
CREATE TABLE T_DISPATCH_RUNNING_JOBS (
ID int(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_ID varchar(128) NOT NULL,
VM_TYPE varchar(128) NOT NULL, -- 构建机类型
CHANNEL_CODE varchar(128) DEFAULT 'BS', -- 构建来源
BUILD_ID varchar(128) NOT NULL,
VM_SEQ_ID varchar(128) NOT NULL,
EXECUTE_COUNT int(11) NOT NULL, -- 执行次数
CREATED_TIME datetime NOT NULL,
AGENT_START_TIME datetime, -- 构建机启动时间
KEY inx_project_id (PROJECT_ID, VM_TYPE, CHANNEL_CODE),
KEY inx_build_id (BUILD_ID)
);
-- T_DISPATCH_QUOTA_PROJECT:项目配额
CREATE TABLE T_DISPATCH_QUOTA_PROJECT (
PROJECT_ID varchar(128) NOT NULL,
VM_TYPE varchar(128) NOT NULL,
CHANNEL_CODE varchar(128) DEFAULT 'BS',
RUNNING_JOBS_MAX int(10) NOT NULL, -- 最大并发JOB数
RUNNING_TIME_JOB_MAX int(10) NOT NULL, -- 单JOB最大执行时间
RUNNING_TIME_PROJECT_MAX int(10) NOT NULL, -- 项目最大执行时间
PRIMARY KEY (PROJECT_ID, VM_TYPE, CHANNEL_CODE)
);
2.7 Environment 模块(构建机环境)
-- T_NODE:节点信息
CREATE TABLE T_NODE (
NODE_ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_ID varchar(64) NOT NULL,
NODE_IP varchar(64) NOT NULL, -- 节点IP
NODE_NAME varchar(64) NOT NULL, -- 节点名称
NODE_STATUS varchar(64) NOT NULL, -- 节点状态
NODE_TYPE varchar(64) NOT NULL, -- 节点类型
OS_NAME varchar(128), -- 操作系统
DISPLAY_NAME varchar(128) DEFAULT '', -- 别名
PIPELINE_REF_COUNT int(11) DEFAULT 0, -- 流水线引用数
LAST_BUILD_TIME datetime, -- 最近构建时间
KEY PROJECT_ID (PROJECT_ID),
KEY NODE_IP (NODE_IP)
);
-- T_ENVIRONMENT_THIRDPARTY_AGENT:第三方构建机
CREATE TABLE T_ENVIRONMENT_THIRDPARTY_AGENT (
ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
NODE_ID bigint(20), -- 节点ID
PROJECT_ID varchar(64) NOT NULL,
HOSTNAME varchar(128) DEFAULT '', -- 主机名
IP varchar(64) DEFAULT '', -- IP地址
OS varchar(16) NOT NULL, -- 操作系统
STATUS int(11) NOT NULL, -- 状态
SECRET_KEY varchar(256) NOT NULL, -- 密钥
VERSION varchar(128), -- Agent版本
PARALLEL_TASK_COUNT int(11), -- 并行任务数
DOCKER_PARALLEL_TASK_COUNT int(11), -- Docker并行任务数
KEY idx_agent_node (NODE_ID),
KEY idx_agent_project (PROJECT_ID)
);
-- T_ENV:环境信息
CREATE TABLE T_ENV (
ENV_ID bigint(20) AUTO_INCREMENT PRIMARY KEY,
PROJECT_ID varchar(64) NOT NULL,
ENV_NAME varchar(128) NOT NULL, -- 环境名称
ENV_TYPE varchar(128) NOT NULL, -- 环境类型(DEV/TEST/BUILD)
ENV_VARS text NOT NULL, -- 环境变量
IS_DELETED bit(1) NOT NULL,
KEY PROJECT_ID (PROJECT_ID)
);
-- T_ENV_NODE:环境-节点关联
CREATE TABLE T_ENV_NODE (
ENV_ID bigint(20) NOT NULL,
NODE_ID bigint(20) NOT NULL,
PROJECT_ID varchar(64) NOT NULL,
ENABLE_NODE bit(1) DEFAULT 1, -- 是否启用
PRIMARY KEY (ENV_ID, NODE_ID)
);
三、表设计规范
3.1 命名规范
| 类型 | 规范 | 示例 |
|---|---|---|
| 表名 | T_ 前缀 + 大写下划线 |
T_PIPELINE_BUILD_HISTORY |
| 主键 | ID 或 {表名}_ID |
PIPELINE_ID, BUILD_ID |
| 外键 | {关联表}_ID |
PROJECT_ID, NODE_ID |
| 索引 | idx_ 或 inx_ 前缀 |
idx_project_id, inx_status |
| 唯一索引 | uni_inx_ 或 UNI_ 前缀 |
uni_inx_code_version |
| 时间字段 | *_TIME 后缀 |
CREATE_TIME, UPDATE_TIME |
| 标记字段 | *_FLAG 后缀 |
LATEST_FLAG, DELETE_FLAG |
3.2 ID 设计规范
项目ID: 英文名称(如 demo_project)
流水线ID: p-{32位UUID} = 34位
构建ID: b-{32位UUID} = 34位
任务ID: t-{32位UUID} = 34位
阶段ID: s-{32位UUID} = 34位
容器ID: c-{32位UUID} = 34位
插件ID: 32位UUID
用户组ID: 32位UUID
3.3 状态字段设计
-- 构建状态(int 类型)
-- 参考 BuildStatus 枚举
0: QUEUE -- 排队中
1: RUNNING -- 运行中
2: SUCCEED -- 成功
3: FAILED -- 失败
4: CANCELED -- 取消
5: TERMINATE -- 终止
...
-- 插件状态(tinyint 类型)
0: 初始化
1: 提交中
2: 验证中
3: 验证失败
4: 测试中
5: 审核中
6: 审核驳回
7: 已发布
8: 上架中止
9: 下架中
10: 已下架
3.4 字段类型规范
| 场景 | 类型 | 说明 |
|---|---|---|
| 主键ID | varchar(32) 或 bigint(20) |
UUID 用 varchar,自增用 bigint |
| 项目/流水线ID | varchar(64) |
预留足够长度 |
| 名称 | varchar(64) ~ varchar(255) |
根据业务需求 |
| 描述 | varchar(1024) 或 text |
短描述用 varchar |
| JSON 数据 | mediumtext 或 json |
大 JSON 用 mediumtext |
| 时间 | datetime 或 timestamp |
需要自动更新用 timestamp |
| 布尔 | bit(1) |
默认 b'0' |
| 状态 | int(11) 或 tinyint(4) |
枚举值用 tinyint |
3.5 索引设计规范
-- 1. 主键索引
PRIMARY KEY (`ID`)
-- 2. 唯一索引(业务唯一约束)
UNIQUE KEY `uni_inx_code_version` (`ATOM_CODE`, `VERSION`)
-- 3. 普通索引(查询优化)
KEY `idx_project_pipeline` (`PROJECT_ID`, `PIPELINE_ID`)
-- 4. 复合索引(遵循最左前缀原则)
KEY `STATUS_KEY` (`PROJECT_ID`, `PIPELINE_ID`, `STATUS`)
-- 5. 时间索引(范围查询)
KEY `inx_start_time` (`START_TIME`)
KEY `inx_create_time` (`CREATE_TIME`)
四、SQL 脚本编写规范
4.1 幂等性要求
-- 1. 建表必须使用 IF NOT EXISTS
CREATE TABLE IF NOT EXISTS `T_EXAMPLE` (...);
-- 2. 插入数据使用 INSERT IGNORE 防止覆盖
INSERT IGNORE INTO T_EXAMPLE (ID, NAME) VALUES (1, 'test');
-- 3. 需要强制刷新的系统数据使用 ON DUPLICATE KEY UPDATE
INSERT INTO T_EXAMPLE (ID, NAME) VALUES (1, 'test')
ON DUPLICATE KEY UPDATE NAME = 'test';
-- 4. 禁止直接删除表后重建
-- 错误:DROP TABLE IF EXISTS T_EXAMPLE; CREATE TABLE T_EXAMPLE...
-- 正确:CREATE TABLE IF NOT EXISTS T_EXAMPLE...
4.2 字段变更规范
-- 1. 新增字段必须有默认值或允许 NULL
ALTER TABLE T_EXAMPLE ADD COLUMN NEW_FIELD varchar(64) DEFAULT '';
ALTER TABLE T_EXAMPLE ADD COLUMN NEW_FIELD varchar(64) NULL;
-- 2. 禁止改名字段(会导致数据丢失)
-- 错误:ALTER TABLE T_EXAMPLE CHANGE OLD_NAME NEW_NAME varchar(64);
-- 3. 使用存储过程判断字段是否存在
DELIMITER $$
CREATE PROCEDURE IF NOT EXISTS add_column_if_not_exists()
BEGIN
IF NOT EXISTS (
SELECT * FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'T_EXAMPLE'
AND column_name = 'NEW_FIELD'
) THEN
ALTER TABLE T_EXAMPLE ADD COLUMN NEW_FIELD varchar(64) DEFAULT '';
END IF;
END$$
DELIMITER ;
CALL add_column_if_not_exists();
DROP PROCEDURE IF EXISTS add_column_if_not_exists;
4.3 索引变更规范
-- 添加索引(使用存储过程判断)
DELIMITER $$
CREATE PROCEDURE IF NOT EXISTS add_index_if_not_exists()
BEGIN
IF NOT EXISTS (
SELECT * FROM information_schema.statistics
WHERE table_schema = DATABASE()
AND table_name = 'T_EXAMPLE'
AND index_name = 'idx_name'
) THEN
ALTER TABLE T_EXAMPLE ADD INDEX idx_name (NAME);
END IF;
END$$
DELIMITER ;
CALL add_index_if_not_exists();
DROP PROCEDURE IF EXISTS add_index_if_not_exists;
五、分库分表设计
5.1 分片策略
BK-CI 支持数据库分片,通过 T_SHARDING_ROUTING_RULE 表配置路由规则:
-- 分片路由规则
CREATE TABLE T_SHARDING_ROUTING_RULE (
ID varchar(32) PRIMARY KEY,
ROUTING_NAME varchar(128) NOT NULL, -- 路由名称(项目ID)
ROUTING_RULE varchar(256) NOT NULL, -- 路由规则
CLUSTER_NAME varchar(64) DEFAULT 'prod', -- 集群名称
MODULE_CODE varchar(64) DEFAULT 'PROCESS', -- 模块标识
TYPE varchar(32) DEFAULT 'DB', -- 路由类型(DB/TABLE)
DATA_SOURCE_NAME varchar(128) DEFAULT 'ds_0'-- 数据源名称
);
5.2 数据源配置
-- 数据源配置
CREATE TABLE T_DATA_SOURCE (
ID varchar(32) PRIMARY KEY,
CLUSTER_NAME varchar(64) NOT NULL,
MODULE_CODE varchar(64) NOT NULL,
DATA_SOURCE_NAME varchar(128) NOT NULL,
FULL_FLAG bit(1) DEFAULT b'0', -- 容量是否满
DS_URL varchar(1024), -- 数据源URL
TAG varchar(128), -- 数据源标签
TYPE varchar(32) DEFAULT 'DB' -- DB/ARCHIVE_DB
);
六、常用查询模式
6.1 流水线查询
-- 查询项目下的流水线列表
SELECT * FROM T_PIPELINE_INFO
WHERE PROJECT_ID = ? AND `DELETE` = 0
ORDER BY CREATE_TIME DESC;
-- 查询流水线最新版本编排
SELECT * FROM T_PIPELINE_RESOURCE
WHERE PIPELINE_ID = ?
ORDER BY VERSION DESC LIMIT 1;
-- 查询流水线构建历史
SELECT * FROM T_PIPELINE_BUILD_HISTORY
WHERE PROJECT_ID = ? AND PIPELINE_ID = ?
ORDER BY BUILD_NUM DESC
LIMIT ?, ?;
6.2 构建查询
-- 查询构建详情
SELECT h.*, d.MODEL
FROM T_PIPELINE_BUILD_HISTORY h
LEFT JOIN T_PIPELINE_BUILD_DETAIL d ON h.BUILD_ID = d.BUILD_ID
WHERE h.BUILD_ID = ?;
-- 查询构建任务列表
SELECT * FROM T_PIPELINE_BUILD_TASK
WHERE BUILD_ID = ?
ORDER BY STAGE_ID, CONTAINER_ID, TASK_SEQ;
-- 查询构建变量
SELECT * FROM T_PIPELINE_BUILD_VAR
WHERE BUILD_ID = ?;
6.3 统计查询
-- 项目流水线数量统计
SELECT PROJECT_ID, COUNT(*) as count
FROM T_PIPELINE_INFO
WHERE `DELETE` = 0
GROUP BY PROJECT_ID;
-- 构建状态统计
SELECT STATUS, COUNT(*) as count
FROM T_PIPELINE_BUILD_HISTORY
WHERE PROJECT_ID = ? AND PIPELINE_ID = ?
GROUP BY STATUS;
七、性能优化建议
7.1 索引优化
- 复合索引遵循最左前缀原则
- 高频查询字段建立索引
- 避免在索引列上使用函数
- 定期分析慢查询日志
7.2 查询优化
- 使用 LIMIT 限制返回行数
- **避免 SELECT ***
- 使用覆盖索引
- 大表分页使用游标分页
7.3 表设计优化
- 大字段(TEXT/BLOB)拆分到独立表
- 历史数据定期归档
- 热点数据使用缓存
- 考虑读写分离