feat: add China Telecom R&D project template

This commit is contained in:
v6ole
2026-07-28 22:30:20 +08:00
commit b6a1fd85d8
51 changed files with 11196 additions and 0 deletions
@@ -0,0 +1,144 @@
# 04-数据库设计规范
> 涵盖通用规范及 MySQL、PostgreSQL、TiDB、UDAL 四种主流数据库
---
## 一、通用设计规范
### 命名规范
| 对象 | 规则 |
|------|------|
| **库名** | 【强制】仅字母/数字/下划线,全小写,≤32字符,禁止关键字 |
| **表名** | 【强制】仅字母/数字/下划线,全小写,`t_` 开头,≤32字符 |
| **字段名** | 【强制】全小写,下划线分隔,≤32字符,禁止关键字 |
| **索引** | 【推荐】非唯一=`idx_字段1_字段2`,唯一=`uidx_字段1_字段2`,全小写 |
| **用户名** | 【推荐】`库名_app`(生产)、`库名_read`(只读)、`库名_monitor`(监控) |
| **临时表** | 【强制】`tmp` 开头 + 日期后缀 |
| **备份表** | 【强制】`bak` 开头 + 日期后缀 |
### SQL 设计规范
- **【强制】** 创建表时所有表和字段必须添加注释
- **【强制】** 禁止使用外键(业务端实现)
- **【强制】** SELECT/UPDATE/DELETE 的 WHERE 条件列必须添加索引(低基数列除外)
- **【强制】** WHERE 条件索引列禁止数学运算和函数运算
- **【强制】** 禁止 LIKE `%xxx` 前缀模糊匹配
- **【强制】** 禁止在开发代码中使用 TRUNCATE TABLE
- **【强制】** DELETE/UPDATE 必须带 WHERE 条件
- **【强制】** SELECT 语句必须指定具体字段,禁止 `SELECT *`
- **【强制】** SQL 语句禁止隐式转换
- **【推荐】** 事务要简单,多事务小事务原则
- **【推荐】** 避免超过 3 张表关联
- **【推荐】** IN 操作集合元素控制在 500 个以内
### 流程规范
- **【强制】** DDL 操作至少提前 1 天向 DBA 申请
- **【强制】** 批量读写超过 5 万条记录必须通知 DBA
- **【强制】** 业务高峰期禁止大批量更新(超 10 万条)/ALTER 表/创建索引
- **【强制】** 禁止从开发/测试环境直连生产数据库
- **【强制】** 严禁在从库执行 SELECT 以外的语句
- **【强制】** 禁止在主库执行导出操作
- **【强制】** 生产数据导出到非生产环境需脱敏处理
- **【强制】** 创建用户时限制登录主机(IP/网段),禁止 `%`
- **【强制】** 密码复杂度 ≥ 16 位,包含大小写+特殊字符
- **【推荐】** 生产表结构应设有主键
- **【推荐】** 对超 100 万行大表修改结构须 DBA 审核,低峰期执行
### 设计范式
- 逻辑模型满足第三范式即可
- 物理模型可适当增加数据冗余以提高查询性能
---
## 二、PostgreSQL 开发规范
### 对象命名
- **【强制】** DB name 与 table name ≤ 64 位
- **【强制】** 对象名仅小写字母、数字、下划线
- **【推荐】** 主键索引 `pk_` 开头,唯一索引 `uidx_` 开头,普通索引 `idx_` 开头
- **【推荐】** 不同业务用不同 database 区分,默认使用 public schema
### 设计规范
- **【强制】** 创建表结构时需考虑对应索引
- **【强制】** 多表 join 列需保证列名和数据类型一致
- **【强制】** 表结构类型与应用程序定义一致
- **【推荐】** 字符编码 UTF-8,时间使用 UTC
- **【强制】** 避免使用触发器
- **【强制】** 大表(>10GB 或 >1000 万行)考虑分区
- **【强制】** 频繁使用的大对象需定时删除
### 查询规范
- **【强制】** 禁止 `SELECT *`
- **【强制】** 使用 `count(*)` 而非 `count(col)``count(1)`
- **【强制】** 避免向客户端返回大量数据
### 稳定性
- **【强制】** 避免长事务(会造成垃圾膨胀)
- **【强制】** 程序必须有重连机制
- **【强制】** 使用合理的隔离级别
- **【强制】** 高并发下务必使用连接池
- **【强制】** OLTP 高峰期拒绝长 SQL、大事务、大批量
---
## 三、MySQL 开发规范
### 对象设计
- **【强制】** INT 不使用 unsigned 无符号属性
- **【强制】** 自增用 8 字节 BIGINT
- **【强制】** 字符集使用 UTF8MB4
- **【强制】** 日期使用 DATETIME 类型
- **【强制】** 敏感字段需加密(动态盐 + 非固定加密算法 + 多轮加密)
### 数据操作
- **【强制】** 禁用 `UPDATE/DELETE ... LIMIT`
- **【强制】** 禁用关联子查询
- **【强制】** 禁用 `INSERT ... ON DUPLICATE KEY UPDATE`
- **【强制】** 禁用联表更新
- **【强制】** 生产环境禁止使用 hint
### 查询优化
- **【推荐】** SELECT 建议 UNION ALL(不超过 5 个子句)
- **【强制】** DML 语句必须有 WHERE 条件,且使用索引查找
- **【推荐】** order by/group by/distinct 尽量利用索引
---
## 四、TiDB (HTAP) 开发规范
### 核心约束
- **【强制】** 单行数据 ≤ 6 MB,单表字段 ≤ 60 个
- **【强制】** 单个事务默认 ≤ 100 MB,大事务需拆分(每 100~500 行一批)
- **【强制】** 建表使用 utf8mb4 编码
- **【强制】** 禁止 `SELECT *`
- **【强制】** 高并发交易场景,单语句关联表 ≤ 2 张;分析场景 ≤ 10 张
- **【强制】** 自增列仅保证唯一,不保证连续/有序
### 分区表
- **【强制】** 查询条件必须包含分区字段
- **【推荐】** 分区记录数控制在十亿级别
---
## 五、UDAL 开发规范
### 核心约束
- **【强制】** 对象名仅小写字母、数字、下划线,≤ 32 位
- **【强制】** 表必须设置主键
- **【强制】** 禁止使用外键、分区表、存储过程、函数、触发器、视图
- **【强制】** 字符集仅 utf8/utf8mb4
- **【强制】** 存储引擎必须为 InnoDB
### 查询规范
- **【强制】** 查询必须带 WHERE 条件,尽量使用分片键
- **【推荐】** 避免跨分片 Join/Union
- **【强制】** 关联表分片算法和拆分节点必须一致
### 数据操作
- **【强制】** 禁止不带 WHERE 的 Update/Delete
- **【强制】** 禁止 Truncate table
- **【强制】** 禁止 Update/Delete 带 LIMIT 或 ORDER BY
- **【强制】** 禁止更新分片键值