AGILE TEAM
Skip to content

03 — 数据库设计规范

📦 来源:wl-skills-design v0.11.1 · standards/03-database.md · 可判定条目由 verify([M] 机械项)自动执行。

v1.0 — 工具无关(MySQL / PostgreSQL / Oracle / 达梦 均适用) 维护者:@ChenyCHENYU


§零 本规范的定位

本文件是数据库设计的唯一权威来源,约定:设计 profile、库表命名、系统字段策略、主键与索引、文档结构、数据字典格式、变更设计、与需求说明书(spec)的字段联动、验证清单(34 项)与闭环修复协议。

配套技能:.github/skills/data-database-design/SKILL.md(操作流程) + .github/prompts/create-db-design.prompt.md(生成) + validate-db-design.prompt.md(验证)。 规范定义"做什么",Skill 定义"怎么做",两者不重复。

设计哲学(沿用复杂项目数据字典 10 列结构,叠加最佳实践):

匿名基线样例(保留)         本规范叠加(最佳实践)
──────────────────         ──────────────────────
ER 图 + DB 清单 + 数据字典    + 可配置系统字段 profile
逐表字段定义(10 列)         + 索引设计独立章节
模块分组(订单/计划…)        + 命名前缀强制约定
                            + 变更履历表设计规则
                            + 与 spec IPO 字段联动验证
                            + 34 项验证清单 + 闭环报告

0.1 设计 profile(生成前必填)

决策可选值未确认时处理
数据库方言/版本MySQL / PostgreSQL / Oracle / 达梦 / 其他必须追问,不静默默认
租户模式单租户 / 多租户标记 Pending
删除策略软删除 / 硬删除 / 归档标记 Pending
审计字段创建/更新人时 / 数据库审计 / 事件审计推荐创建/更新人时并标注假设
主键策略雪花 ID / UUID / 自增 / 其他必须说明选择理由
并发控制无 / 乐观锁 / 悲观锁按写冲突风险决定
命名与类型映射团队约定 / 本规范推荐未提供时使用推荐并显式记录

验证时先判断 profile 是否完整,再检查设计是否与 profile 一致。项目决策优先于本规范的推荐默认值。


§一 命名约定(默认推荐)

1.1 表命名

格式:[领域码][模块码]_[业务含义],全小写蛇形(snake_case)。

部位规则示例
领域码2 位小写,标识业务域pm(生产)、qm(品质)、wm(仓储)
模块码2 位小写,标识子模块om(订单)、pm(计划)
业务含义蛇形小写,名词,可多段order_mainplan_detail

示例:ordr_order_main(订单域-订单-订单主表)、plan_plan_detail(计划域-计划-计划明细表)。

1.2 表后缀语义(固定词表)

后缀含义使用场景
_main主档表一张单据的头信息
_detail / _dtl明细表主档下的行项目
_log操作/历程日志表记录状态流转历程
_resume变更履历表记录字段级变更(含版本号)
_rel关系/中间表多对多关联
_cfg / _dict配置表 / 字典表枚举、参数

1.3 字段命名

  • 全部使用 小驼峰英文名记录于数据字典(与接口字段英文名保持一致),物理 DDL 落库可按数据库习惯转蛇形(如 orderNoorder_no),但同一字段的英文名在 DB / 接口 / spec 三处必须可一一映射
  • 禁止使用数据库保留字(ordergroupleveldesctype 等)作裸字段名,须加业务前缀(orderTypesortLevel)。
  • 布尔/标志字段统一 xxxFlag(值 0/1);时间字段统一 xxxTime(datetime)或 xxxDate(date);金额统一 xxxAmt,数量 xxxQty,重量 xxxWt

1.4 索引命名

类型格式示例
普通索引idx_[表名去前缀]_[字段]idx_order_main_orderNo
唯一索引uk_[表名去前缀]_[字段]uk_order_main_orderNo
联合索引idx_[表名去前缀]_[字段1]_[字段2]idx_plan_dtl_planNo_seqNo
主键pk_[表名去前缀]pk_order_main

§二 系统字段 profile

以下是推荐字段集合,不是跨项目无条件强制项。根据 §零 profile 启用;启用的字段统一置于字段清单末尾审计区,并在分册中记录适用范围。

序号字段英文名字段中文名类型说明
S1id主键bigint / varchar(32)业务表通常必备;策略见 §三
S2createdBy创建人varchar(32)启用“创建/更新人时”审计时使用
S3createdTime创建时间datetime启用审计时使用
S4updatedBy更新人varchar(32)启用审计时使用
S5updatedTime更新时间datetime启用审计时使用
S6deletedFlag删除标志tinyint仅软删除 profile 使用
S7tenantId租户号varchar(32)仅多租户 profile 使用

删除和租户策略必须成对落地:软删除查询才附加 deletedFlag = 0;多租户查询才附加租户条件。单租户或硬删除项目不得为凑字段而保留无语义列。

可选系统字段

序号字段英文名字段中文名类型说明
S8version乐观锁版本int并发控制;高并发可被并发修改的表建议补充,默认 0,每次更新 +1

version(S8 乐观锁)与 revNo(§六 业务履历版本号)职责不同,勿混用

  • version并发控制字段,更新时 WHERE version = ? 防止覆盖,应用层自增,业务无感知。
  • revNo业务履历版本号,与 _resume 变更履历表对应,业务可见、可追溯。 一张表可同时有两者(一个防并发、一个记履历),不冲突。

§三 主键与索引设计

3.1 主键选型

方案适用类型
雪花 ID(推荐)高并发、分布式bigint
UUID跨系统数据交换、对外暴露varchar(32)
自增单库单表、内部字典bigint auto_increment

禁止使用业务字段(订单号等)作物理主键;业务唯一键用唯一索引(uk_*)保证。

3.2 索引设计原则

  • 外键字段、高频 WHERE/JOIN/ORDER BY 字段建索引。
  • 区分度低的字段(性别、状态等)不单独建索引,可作联合索引的次列。
  • 联合索引遵循最左前缀:把等值查询字段放左、范围字段放右。
  • 单表索引数量建议 ≤ 5,避免写放大。
  • 业务唯一性必须由 uk_* 唯一索引保证,不依赖应用层判重。

3.3 索引清单(每张表必须列出)

每张表的设计需含一张索引清单:

索引名类型字段用途
pk_order_main主键id主键
uk_order_main_orderNo唯一orderNo订单号业务唯一
idx_order_main_custId普通custId按客户查询

§四 文档结构(每个模块固定 4 节)

沿用复杂项目结构:一个数据库分册按模块组织,每个模块固定输出以下 4 节,顺序不可变。

[模块名] 数据库设计
├── (1) ER 图          ← 实体关系图(占位 + 实体清单)
├── (2) DB 清单        ← 本模块所有表的一览表(表名/中文名/说明/记录量级)
├── (3) 数据字典       ← 逐表字段定义(10 列标准表,见 §五)
└── (4) DDL 脚本       ← 建表语句(含注释、索引、系统字段)

4.1 ER 图(节 1)

  • 图片占位:【此处插入 [模块名] ER 图】
  • 附实体清单表:实体名 / 对应物理表 / 与其他实体的关系(1:1 / 1:N / M:N)。
  • 实体应来源于 spec 的 IPO 输出对象,做到可追溯。

4.2 DB 清单(节 2)

序号表名中文名称表类型说明预估量级
1ordr_order_main订单主表主档订单头信息万级
2ordr_order_dtl订单明细表明细订单行项目十万级

4.3 数据字典(节 3)→ 见 §五

4.4 DDL 脚本(节 4)

  • 每张表一段 CREATE TABLE,字段顺序 = 数据字典顺序(业务字段在前、7 个系统字段在末)。
  • 每个字段带 COMMENT(= 字段中文名);表带 COMMENT(= 表中文名)。
  • 含索引定义(§3.3 的索引清单逐条落地)。

§五 数据字典格式(10 列标准表 · 唯一权威格式)

直接采用复杂项目数据字典的 10 列结构,不得增删列。每张表一张表格。

序号字段英文名字段中文名主/外键是否索引类型长度空否缺省备注
1id主键PKbigint-N-雪花 ID
2orderNo订单号-是(UK)varchar40N-业务唯一
3custId客户 IDFKvarchar32N-关联客户表
4targetQuantity目标件重-decimal10,2Y-精度,小数
..............................
createdBy创建人-varchar32N-系统字段

列填写规则

规则
序号从 1 连续递增
字段英文名小驼峰,与接口/spec 一致
字段中文名业务术语,与 spec IPO 字段名一致
主/外键PK / FK / 空
是否索引 / 是(UK) /
类型逻辑类型:varchar / decimal / int / bigint / datetime / date / tinyint / text
长度varchar 写长度;decimal 写 精度,小数(如 10,2);无长度写 -
空否N(NOT NULL)/ Y(可空)
缺省默认值,无则 -
备注取值范围 / 枚举 / 关联表 / 业务说明

关键业务字段(主键、业务唯一键、外键)建议加粗或标色,便于评审快速定位。


§五·补 字段类型与工程约定

5b.1 逻辑类型 → 物理类型映射

数据字典用逻辑类型(工具无关);落 DDL 时按目标数据库映射。

逻辑类型MySQLPostgreSQLOracle达梦 DM
varchar(n)varchar(n)varchar(n)varchar2(n)varchar(n)
texttexttextclobtext / clob
intintintegernumber(10)int
bigintbigintbigintnumber(19)bigint
tinyinttinyintsmallintnumber(3)tinyint
decimal(p,s)decimal(p,s)numeric(p,s)number(p,s)decimal(p,s)
datetimedatetimetimestampdate / timestampdatetime / timestamp
datedatedatedatedate

PostgreSQL 无 tinyint,用 smallint;Oracle 无 datetime/tinyint,分别用 date/timestampnumber

5b.2 长度、精度与字符集约定

约定
字符集统一 utf8mb4(MySQL)/ UTF8,支持 emoji 与多语言
排序规则MySQL 统一 utf8mb4_general_ci(或团队统一一种,全库一致)
变长文本上限varchar ≤ 2000;超过改 text(避免行溢出)
金额统一 decimal(18,2)(金额);单价等高精度用 decimal(18,4),全库口径一致
数量 / 重量统一 decimal(18,3)(按业务最小计量精度统一)
主键 bigint雪花 ID 用 bigint;UUID 用 varchar(32)

同一类业务字段(金额/数量/重量)的精度必须全库统一,禁止 10,212,2 混用。

5b.3 冗余字段标注

工业系统允许适度反范式(如下单时快照客户名)。冗余字段必须在数据字典「备注」列显式标注来源:

备注:[冗余:base_customer.custName],下单时快照,不随客户主数据变更

规则:冗余仅用于快照/性能两类场景;标注来源表.字段;说明是否随源更新。

5b.4 外键约束策略

策略说明
逻辑外键(推荐)字段命名体现关联(custId)+ 建索引,不建物理 FOREIGN KEY,由应用层保证完整性
物理外键仅在强一致、低并发的内部配置库可用;高并发业务库禁止(影响分库分表与写性能)

默认采用逻辑外键;数据字典「主/外键」列标 FK 表示逻辑外键关系,不代表物理约束。


§六 变更与历史设计

凡涉及状态流转字段级留痕的单据,必须配套设计历史表:

需求表设计关键字段
记录状态变更历程[主表]_logbizId(关联主表)、fromStatustoStatusoperatoropTime
记录字段级修改履历[主表]_resumebizIdrevNo(版本号)、fieldNameoldValuenewValuechangedTime
需要版本号的主表主表加 revNo 字段每次修改 +1,与 _resume 表对应

选择规则:单据有审批/作废/完工等状态机 → 必建 _log;单据关键字段(金额、数量、交期)可被修改且需追溯 → 必建 _resume。 ⚠️ revNo(业务履历版本号,业务可见)≠ version(§二 S8 乐观锁,并发控制,业务无感知)。两者职责不同,需要并发控制时另加 version


§七 与需求说明书(spec)的字段联动

数据库不是孤立设计,必须与 spec 的 IPO 表对齐,形成 spec → DB 可追溯链路。

7.1 联动规则

规则说明
L1 — 输出对象覆盖spec IPO 表 Output 列涉及的每个持久化数据对象,DB 中必须有对应表
L2 — 输入字段落库spec IPO 表 Input/字段信息行中需持久化的字段,DB 对应表必须有对应列
L3 — 中文名一致同一业务字段,DB 数据字典「字段中文名」与 spec IPO「字段名」一致
L4 — 英文名一致同一业务字段,DB「字段英文名」与接口报文「英文字段」一致(见 04 规范)

7.2 联动矩阵(设计产物,置于数据库分册末尾)

spec 功能编码IPO 字段(中文)DB 表DB 字段(英文)状态
PLAN007订单号ordr_order_mainorderNo✅ 已覆盖
PLAN007目标件重ordr_order_maintargetQuantity✅ 已覆盖

§八 验证清单(34 项)

生成或审查数据库设计时,按组逐项检查。DB-X 组(与 spec 联动)对所有数据库设计强制执行。

执行方式标记:[M] 机械可判、[J] 语义判断。四域 [M] 项均由 wl-skills-design verify 执行(未覆盖时输出 skip);Agent 先取机械结论,再判 [J] 项,合并为同一编号的报告。

DB-A 命名规范(8 项)

  • [ ] A01 [M] — 表名符合 [领域码][模块码]_[业务含义] 格式,全小写蛇形
  • [ ] A02 [M] — 表后缀使用固定词表(_main/_dtl/_log/_resume/_rel/_cfg
  • [ ] A03 [M] — 字段英文名为小驼峰,且与接口/spec 可一一映射
  • [ ] A04 [M] — 无数据库保留字裸用作字段名
  • [ ] A05 [M] — 布尔/时间/金额/数量/重量字段遵循 xxxFlag/xxxTime/xxxAmt/xxxQty/xxxWt 后缀约定
  • [ ] A06 [M] — 普通索引命名符合 idx_[表名去前缀]_[字段]
  • [ ] A07 [M] — 唯一索引命名符合 uk_[表名去前缀]_[字段]
  • [ ] A08 [M] — 主键命名符合 pk_[表名去前缀]

DB-B 系统字段与 profile(7 项)

  • [ ] B01 [J] — 分册声明方言、租户、删除、审计、主键和并发控制 profile
  • [ ] B02 [M] — 每张业务表有明确主键,策略与 profile 一致
  • [ ] B03 [J] — 启用审计时包含约定的创建/更新字段;未启用时给出替代审计方式
  • [ ] B04 [J] — 软删除 profile 含 deletedFlag;硬删除/归档 profile 明确约束与审计
  • [ ] B05 [J] — 多租户 profile 含 tenantId 和隔离索引;单租户不保留无语义租户列
  • [ ] B06 [M] — 已启用系统字段名称、类型、默认值和位置保持一致
  • [ ] B07 [J] — 查询、唯一索引和删除操作与删除/租户 profile 一致

DB-C 主键与索引(5 项)

  • [ ] C01 [J] — 主键选型明确(雪花/UUID/自增),未用业务字段作物理主键
  • [ ] C02 [M] — 每张表有索引清单,列出索引名/类型/字段/用途
  • [ ] C03 [M] — 业务唯一键由 uk_* 唯一索引保证
  • [ ] C04 [J] — 外键字段、高频查询字段已建索引
  • [ ] C05 [J] — 联合索引遵循最左前缀,单表索引数 ≤ 5

DB-D 文档完整性(5 项)

  • [ ] D01 [M] — 每个模块含固定 4 节:ER 图 / DB 清单 / 数据字典 / DDL
  • [ ] D02 [M] — ER 图含图片占位 + 实体清单(实体名/物理表/关系)
  • [ ] D03 [M] — 数据字典严格使用 10 列标准格式,列无增删
  • [ ] D04 [M] — DDL 字段带 COMMENT、表带 COMMENT,含索引定义
  • [ ] D05 [J] — 有状态流转/字段留痕需求的单据,配套设计 _log/_resume

DB-E 字段类型与工程约定(4 项)

  • [ ] E01 [M] — 逻辑类型在目标数据库有明确物理映射(§5b.1),DDL 类型与之一致
  • [ ] E02 [M] — 同类业务字段精度全库统一(金额/数量/重量口径一致,无 10,212,2 混用);变长文本 > 2000 改 text
  • [ ] E03 [J] — 冗余字段在备注列标注 [冗余:来源表.字段] 及是否随源更新
  • [ ] E04 [J] — 外键策略明确(默认逻辑外键,不建物理 FK;FK 列仅表关联关系)

DB-X 与 spec 联动(5 项)⬅ 闭环核心

  • [ ] X01 [M] — 输出对象覆盖:spec IPO Output 涉及的每个持久化对象在 DB 中有对应表
  • [ ] X02 [M] — 输入字段落库:spec IPO 需持久化字段在 DB 对应表有对应列
  • [ ] X03 [M] — 中文名一致:DB「字段中文名」与 spec IPO「字段名」一致
  • [ ] X04 [M] — 英文名一致:DB「字段英文名」与接口报文「英文字段」一致
  • [ ] X05 [M] — 联动矩阵存在:数据库分册末尾有 spec 功能编码 → DB 表/字段 的联动矩阵,无遗漏

§九 跨文档一致性规则(集合比对算法)

DB-X 组验证时,构建集合并比对,任一不满足即为失败项:

SET_SPEC_OUT  = { spec 各 IPO 表 Output 列涉及的持久化数据对象 }
SET_DB_TABLE  = { 数据库分册中所有业务表的业务实体 }
SET_SPEC_FLD  = { spec IPO 需持久化字段(功能编码 + 字段中文名)}
SET_DB_FLD    = { DB 数据字典所有字段(表名 + 字段中文名 + 字段英文名)}
SET_API_FLD   = { 接口报文所有字段英文名(见 04 规范)}

X01:SET_SPEC_OUT ⊆ {SET_DB_TABLE 的业务实体}(每个输出对象有落库表)
X02:SET_SPEC_FLD 中每个字段 ∈ SET_DB_FLD(按中文名匹配)
X03:对 X02 匹配上的字段,中文名一一对应
X04:SET_DB_FLD 的英文名 ⊇ SET_API_FLD ∩ 本模块(接口字段英文名都能在 DB 找到)
X05:联动矩阵行数 == |SET_SPEC_FLD|(无遗漏)

若 spec 或接口文档不在当前工作区,标注对应 X 项为「跨文件暂挂」,提示合并后整卷复验。


§十 闭环修复协议(生成 → 验证 → 修复 → 复验)

[阶段1] 生成(按模块逐节:ER → DB清单 → 数据字典 → DDL)

[阶段2] 验证(执行 34 项检查清单)
      ↓ 有失败项?
[阶段3] 修复(按下表优先级)

[阶段4] 复验(全部 34 项通过)→ ✅ DONE

修复优先级

优先级理由
1DB-X 与 spec 联动字段不一致会击穿整个设计链路
2DB-B 系统字段缺系统字段无法上线,影响所有表
3DB-C 主键索引影响性能与数据完整性
4DB-A 命名影响可维护性
5DB-E 字段类型与工程约定影响落库正确性与全库口径一致
6DB-D 文档完整性影响交付质量

暂挂项规则

缺少调研数据无法填写时,写 【待补充:{描述}】,标注「Pending」,不算失败项。跨文件比对缺对端文档时,标注「跨文件暂挂」。

验证报告格式(每次验证后必须输出)

数据库设计验证报告 — [模块名]
验证时间:[时间]
覆盖表数:N
总项数:34 | 通过:N | 失败:M | 暂挂:K
[✅ 全部通过 / ❌ 存在失败项 / ⚠️ 含暂挂项]

失败项:
  [B04] ordr_order_main 缺少 deletedFlag 字段
  [X03] orderNo 在 DB 中文名"订单编号"与 spec IPO"订单号"不一致
修复动作:
  [B04] 已在 ordr_order_main 审计区补 deletedFlag tinyint default 0
  [X03] 已统一为"订单号"
复验:34/34 通过 → ✅ DONE

You may not distribute, modify, or sell this software without permission.