3. Schema命名规范:表名、字段名、索引名的命名规则与最佳实践

命名这件事,说实话,在很多人眼里就是个「起名字」的活儿。但我在数据治理这行干了十几年,见过太多因为命名混乱导致的灾难——数据对不上、ETL跑崩、新人接手想骂娘。一个好的命名规范,能让你的数据资产价值翻倍;一个烂的命名规范,能让整个数仓变成垃圾场。

今天我就把这些年踩过的坑、总结的经验,一次性说清楚。

3.1 表名命名规则:从业务域到技术属性的完整映射

表名是数据资产的身份证。我个人习惯,表名必须包含三个要素:业务域 + 数据主题 + 技术属性。缺一个,后面都会出问题。

核心公式:

[业务域缩写]_[数据主题]_[技术后缀]

举个例子,我在某电商平台做治理时,订单域的表名是这样设计的:

业务域 数据主题 技术后缀 完整表名 说明
ord order_info _df ord_order_info_df 订单明细事实表
ord order_status _ds ord_order_status_ds 订单状态维度表
usr user_profile _ds usr_user_profile_ds 用户画像维度表
fin payment_flow _df fin_payment_flow_df 支付流水事实表

技术后缀这块,我建议统一用以下约定:

  • _df:事实表(Data Fact)
  • _ds:维度表(Data Dimension)
  • _stg:临时/贴源层(Staging)
  • _mid:中间表(Intermediate)
  • _agg:汇总表(Aggregation)
  • _log:日志表(Log)

避坑指南:我曾经见过一个项目,表名里既没有业务域也没有技术后缀,全是「t1」「t2」「tmp_xxx」这种名字。半年后,连写这些表的人都不知道它们干嘛用的。最后不得不花两个月做数据血缘回溯,才把表用途搞清楚。所以,表名里一定要带上业务域和技术属性,这是底线。

3.2 字段名命名规则:清晰、一致、可自解释

字段名是数据的最小单元,命名质量直接影响数据理解成本。我总结了一个「三要三不要」原则:

3.2.1 三要原则

  • 要全小写+下划线:user_id 而不是 userId 或 USER_ID
  • 要语义完整:order_create_time 而不是 create_time(谁知道是哪个对象的创建时间?)
  • 要类型暗示:布尔字段用 is_、has_ 开头,时间字段用 _time、_date 结尾

3.2.2 三不要原则

  • 不要用保留字:比如 order、group、select 这些,SQL里会出大问题
  • 不要用缩写:除非是团队公认的缩写(如 id、cnt),否则一律写全称
  • 不要用无意义前缀:比如 f_、col_,纯属浪费字符

我的个人习惯:字段名长度控制在 20 个字符以内。太长了,写SQL时手累;太短了,语义表达不清。如果实在需要长字段名,优先考虑用业务缩写,比如 cust_risk_score 代替 customer_risk_score。

来看一个实际对比:

❌ 反面案例 ✅ 正面案例 问题说明
create_time order_create_time 缺少对象归属,容易混淆
flag is_active flag含义模糊,不知道是啥标志
dt order_date dt太通用,无法区分日期还是时间
user_name_first user_first_name 命名顺序混乱,不符合阅读习惯

3.3 索引名命名规则:一眼看懂索引用途

索引命名,很多人觉得无所谓。但我在一次数据库性能优化中,因为索引名全是 idx_1、idx_2 这种,排查问题时差点崩溃。后来我定了一个规则:索引名必须包含表名、字段名和索引类型。

标准格式:

[索引类型]_[表名]_[字段名1]_[字段名2]

其中索引类型缩写:

  • idx:普通索引(Index)
  • uniq:唯一索引(Unique)
  • pk:主键索引(Primary Key)
  • ft:全文索引(Full Text)
  • com:复合索引(Composite)

举个例子:

-- 普通索引
idx_ord_order_info_order_status

-- 唯一索引
uniq_usr_user_profile_email

-- 复合索引
com_ord_order_info_user_id_order_create_time

-- 主键
pk_ord_order_info_order_id

避坑指南:我曾经接手过一个系统,索引名全是 index_1 到 index_50。有一次要删一个冗余索引,DBA 对着列表看了半天,根本不知道哪个对应哪个字段。最后只能一个个查 SHOW INDEX 来确认。所以,索引名一定要自描述,别偷懒。

3.4 命名规范落地:从制度到工具

光有规范没用,得落地。我建议分三步走:

  1. 制定规范文档:把表名、字段名、索引名的规则写清楚,附上正反案例,全员评审通过
  2. 嵌入开发流程:在代码审查(Code Review)中增加命名规范检查项,不通过不能合并
  3. 自动化检查:用工具(如 SQLFluff、自研脚本)自动扫描DDL,不符合规范的直接报错

我的经验:自动化检查是最有效的。人眼审查总有漏网之鱼,但脚本不会。我在一个项目中写了200行Python脚本,每天凌晨扫描所有新建表,把不符合规范的DDL发到群里@责任人。一个月后,命名规范遵守率从60%提升到了95%。

3.5 命名规范全景图

下面这张图,是我总结的命名规范知识体系。你可以把它当成团队培训的入门材料:

Schema命名规范全景图 表名命名规范 字段名命名规范 索引名命名规范 业务域缩写 数据主题 技术后缀 全小写+下划线 语义完整 类型暗示 索引类型 表名+字段名 自描述 落地措施:规范文档 → Code Review → 自动化检查 核心原则 1. 一致性:同一类对象使用相同的命名模式 2. 可读性:命名要让人一眼看懂,不需要查文档 3. 可扩展性:预留业务域扩展空间,避免命名冲突 4. 自动化:规范要能被工具检查,不能只靠人肉

嗯,这张图基本把命名规范的核心内容都涵盖了。你想想看,如果团队里每个人都能按这个规范来命名,数据资产的管理成本至少降低一半。

最后说一句:命名规范不是束缚,而是解放。好的规范让你不用每次写SQL时都去猜「这个字段到底是什么意思」。我见过太多团队在命名上「自由发挥」,结果就是数据沼泽。所以,从今天开始,给你的Schema定个规矩吧。