# 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 - **【强制】** 禁止更新分片键值