1. 为什么命名规范是数据仓库的第一道生命线如果你在数据仓库团队待过超过半年大概率见过这样的场景新来的同事接手一张表表名叫t_usr_info_2_final注释里写着“用户信息最终版”结果跑出来的数据跟上游对不上排查半天才发现真正的“最终版”其实是dim_user_info_v3。这种命名混乱带来的沟通成本几乎每个数据团队都交过学费。数据仓库的命名规范本质上解决的是三件事可发现性、可理解性、可维护性。可发现性指的是别人能不能在成百上千张表里快速找到他要的那张可理解性指的是看到表名就知道里面装的是什么、粒度是什么、更新频率如何可维护性指的是当业务逻辑变更时你能准确判断哪些表需要跟着改而不是靠人肉记忆。我见过太多团队在项目初期不重视命名等到表数量突破五百张之后才开始“补规范”结果就是存量表改不动、增量表管不住最后规范文档变成一纸空文。所以我的核心观点很明确命名规范必须在数仓建设的第一天就落地而且要用工具强制约束而不是靠自觉。这篇文章会从分层命名、字段命名、版本管理、工具落地四个维度把数据仓库命名规范这件事讲透。无论你是刚接手数仓的新人还是正在推动团队规范化的负责人都能从中找到可以直接抄作业的方案。2. 分层命名让每张表的“户口所在地”一目了然2.1 数仓分层的本质与命名映射数据仓库分层不是为了好看而是为了隔离变化。ODS 层直接对接业务系统源系统改字段你就得跟着改DWD 层做清洗和规范化屏蔽源系统的脏数据DWS 层做轻度汇总面向分析场景ADS 层直接服务报表和接口。每一层的职责不同命名策略也必须不同。我推荐的分层前缀方案是这样的分层前缀示例说明ODSods_ods_mysql_order贴源保留原始字段名DWDdwd_dwd_trade_order_di清洗后明细统一字段命名DWSdws_dws_user_action_1d轻度汇总按主题域划分ADSads_ads_sales_report_1d应用层面向具体报表这个前缀方案看起来简单但执行起来有个关键点ODS 层的表名必须包含源系统标识。比如ods_mysql_、ods_pg_、ods_kafka_这样当你有多个数据源时一眼就能看出数据来源。我见过有团队用ods_统一前缀结果 MySQL 和 PostgreSQL 的同名表混在一起排查问题时苦不堪言。2.2 主题域划分别让“用户”和“会员”打架分层之后第二层是主题域。主题域划分没有绝对标准但有一条铁律同一业务概念只能有一个主题域归属。比如“用户”和“会员”在很多公司是两套体系那就要明确区分user和member不能今天叫user明天叫member。常见的主题域划分方式有三种按业务过程交易、支付、物流、按部门市场、销售、财务、按数据域用户、商品、订单。我个人的经验是中小团队按业务过程划分最实用因为业务过程是客观存在的不会因为组织架构调整而频繁变动。具体到命名上主题域放在分层前缀之后、表名主体之前。比如dwd_trade_order_di中trade就是主题域order是表名主体di是增量标识。这样命名之后你可以在数据库里用show tables like dwd_trade%快速列出交易域的所有明细表。2.3 更新频率标识全量还是增量别让人猜更新频率标识是很多团队容易忽略的一环。我见过一张表叫dwd_user_info有人以为是全量快照结果跑出来发现是增量流水白白浪费了半天时间排查。我的建议是强制在表名末尾加频率标识didaily incremental日增量dfdaily full日全量hihourly incremental小时增量hfhourly full小时全量miminute incremental分钟增量这个标识看起来不起眼但在实际排查问题时能救命。比如你发现一张dws_sales_1d的表数据没更新第一反应是调度挂了但看到1d就知道这是天级任务不用去查小时调度。再比如dwd_order_di和dwd_order_df同时存在时你知道前者是增量流水后者是全量快照用哪个取决于你的分析场景。注意频率标识必须和实际调度周期严格一致。我见过有团队把小时表标成1d结果下游按天调度数据永远对不上。这种低级错误一旦发生排查成本极高。3. 字段命名从“天书”到“自解释”的进化3.1 字段命名的三原则见名知意、统一后缀、避免歧义字段命名比表命名更容易失控因为表是有限的字段是无限的。我总结的三原则是见名知意、统一后缀、避免歧义。见名知意指的是user_name就是用户名不要用uname或者name1。统一后缀指的是布尔字段用_flag结尾时间字段用_time结尾金额字段用_amt结尾。避免歧义指的是status这种字段必须加前缀比如order_status、payment_status否则多表关联时根本分不清是哪个状态。我见过最离谱的字段命名是flag1、flag2、flag3注释里写着“标志位1、标志位2、标志位3”。这种命名方式等于没命名三个月后连作者自己都忘了每个 flag 是什么意思。3.2 布尔字段与枚举字段的处理技巧布尔字段的命名有个坑不要用is_开头。为什么因为is_delete和delete_flag混用时你很难判断is_delete 0到底代表“未删除”还是“删除”。我的建议是统一用_flag后缀并且明确 1 和 0 的含义。枚举字段更麻烦。比如订单状态有“待支付、已支付、已发货、已完成、已取消”五种如果你直接存 1、2、3、4、5那字段名必须叫order_status并且要在数据字典里写清楚每个值的含义。更好的做法是在 DWD 层就把枚举值转成可读字符串比如order_status存pending_payment、paid、shipped等。这样虽然存储空间大一点但可读性提升巨大。字段类型推荐命名不推荐命名原因布尔delete_flagis_delete避免 0/1 含义混淆时间create_timectime统一后缀见名知意金额order_amtamount加业务前缀避免歧义枚举order_statusstatus加业务前缀明确范围3.3 字段命名中的“历史遗留”处理策略几乎每个数仓都有历史遗留的烂字段名比如col1、col2、data、info。我的策略是新表新规范老表逐步迁移。具体做法是在 DWD 层做清洗时把老字段名映射成新字段名下游全部用新字段。这样老表不动新表规范过渡期结束后再下线老表。这个过程中有个关键点字段映射关系必须文档化。我见过有团队做了映射但没记录结果新人接手时完全看不懂col1对应的是user_id还是order_id。建议在数据字典里维护一张映射表包含源表、源字段、目标表、目标字段、映射逻辑。4. 版本管理与变更命名规范如何应对业务迭代4.1 表版本号的正确使用姿势业务逻辑变更时表结构往往需要调整。这时候有两种选择改原表或者建新表。我的建议是大变更建新表小变更改原表。大变更指的是字段含义变了、粒度变了、计算逻辑变了小变更指的是加字段、改字段类型、加索引。建新表时版本号怎么加我推荐用_v2、_v3这种后缀而不是_new、_final、_final2。为什么因为_new会变旧_final永远不是最终版。版本号是客观的_v2就是第二版不会产生歧义。但版本号不能滥用。我见过有团队每改一次就加一个版本号结果dwd_order_v1到dwd_order_v15同时存在根本不知道用哪个。我的建议是版本号只在大变更时使用并且要明确废弃旧版本的时间点。4.2 字段变更的兼容性处理字段变更比表变更更频繁。加字段是安全的改字段名是危险的删字段是灾难性的。我的处理原则是加字段直接在原表加但必须给默认值并且通知下游改字段名建新字段旧字段保留一个周期下游迁移完成后删除旧字段删字段先标记废弃观察一个周期确认无下游依赖后再删除这个过程中命名规范的作用是让变更影响面可评估。比如你要改dwd_order_di的order_status字段通过命名规范你知道所有dwd_order_开头的表都可能受影响所有dws_order_和ads_order_开头的表也可能受影响。如果没有命名规范你只能靠人肉搜索。4.3 废弃表的标记与下线流程废弃表不下线是数仓的“肥胖症”。我见过一个数仓有 30% 的表是废弃的但没人敢删因为不知道谁在用。解决这个问题的关键是建立废弃标记和下线流程。我的做法是在表名后加_deprecated后缀同时在表注释里写明废弃日期和替代表。然后设置一个观察期比如 30 天期间如果没有人反馈就正式下线。这个流程必须自动化靠人工跟踪根本不可行。提示下线前一定要检查调度依赖和下游任务。我见过有团队删了一张“废弃表”结果导致核心报表挂掉因为那张表被一个隐藏的下游任务引用了。5. 工具落地让规范从文档变成代码5.1 命名规范的自动化检查方案规范写在文档里没人看写在代码里才能强制执行。我推荐的做法是在数据开发平台里嵌入命名检查比如在提交 SQL 时自动校验表名和字段名是否符合规范。具体实现方式有两种一种是正则校验比如表名必须匹配^(ods|dwd|dws|ads)_[a-z]_[a-z_](_di|_df|_hi|_hf)?$另一种是元数据校验比如检查表是否有注释、字段是否有注释、是否有主题域标签。正则校验的优点是简单直接缺点是容易误杀。比如dwd_trade_order_di符合规范但dwd_trade_order_detail_di可能因为长度超限被拒绝。所以正则要留足余地并且要提供白名单机制。5.2 元数据管理中的命名约束元数据管理工具如 DataHub、Atlas可以配置命名约束。比如你可以设置“所有 DWD 层表的表名必须包含主题域前缀”或者“所有字段必须有注释”。这些约束在表创建时自动检查不符合就拒绝创建。我特别推荐字段注释的强制检查。我见过太多表有表注释但字段没注释结果新人看到status字段完全不知道是什么状态。强制注释之后至少能保证每个字段都有说明哪怕说明写得不好也比没有强。5.3 从规范到习惯团队推广的实操经验工具能解决 80% 的问题剩下的 20% 靠团队习惯。我的推广经验是新人入职第一周必须通过命名规范考试考试内容就是给几张表命名看是否符合规范每周数据质量报告里包含命名规范符合率让团队看到进步命名规范文档放在 Wiki 首页并且每季度更新一次设立“命名规范大使”由团队里最资深的同学担任负责答疑和仲裁这些做法看起来有点“形式主义”但实际效果很好。因为命名规范的本质是团队共识共识需要仪式感来强化。6. 实战中的命名规范避坑指南6.1 那些年我们踩过的命名坑坑一表名大小写混用。Hive 默认不区分大小写但 MySQL 区分。我见过有团队在 Hive 里建了dwd_order在 MySQL 里建了DWD_ORDER结果数据同步时找不到表。坑二中英文混用。比如dwd_user_用户信息这种命名在 SQL 里需要加反引号写起来麻烦看起来也别扭。坑三缩写不一致。比如user缩写成usrorder缩写成ord但payment又缩写成pay。缩写规则不统一等于没有规则。坑四数字后缀滥用。dwd_order_1、dwd_order_2、dwd_order_3这种命名完全看不出区别只能靠注释。6.2 跨团队协作时的命名对齐跨团队协作时命名规范最容易出问题。比如 A 团队用dwd_trade_orderB 团队用dwd_order_trade虽然意思一样但看起来就是两张表。我的建议是建立跨团队的命名委员会由各团队代表组成统一制定和仲裁命名规范。委员会不需要频繁开会但要有明确的决策流程。比如新主题域命名需要委员会审批避免各团队各自为政。6.3 命名规范与数据安全的平衡命名规范有时会和数据安全冲突。比如dwd_user_phone这种表名直接暴露了敏感信息虽然规范上没问题但安全上不合适。我的做法是敏感字段用通用命名比如dwd_user_contact然后在字段级别做脱敏。这个平衡点需要根据公司的安全要求来定。如果安全要求高表名就不应该包含敏感信息如果安全要求低表名可以更具体一些。但无论如何字段级别的脱敏是必须的不能因为表名规范就忽略字段安全。7. 从命名规范看数据仓库的成熟度命名规范看起来是小事但它反映的是一个团队的数据仓库成熟度。成熟度低的团队表名混乱、字段随意、版本失控成熟度高的团队表名自解释、字段有注释、版本可追溯。我个人的体会是命名规范不是一次性工作而是持续迭代的过程。业务在变规范也要跟着变。但核心原则不变见名知意、统一后缀、避免歧义。只要守住这三条命名规范就不会跑偏。最后分享一个小技巧如果你不确定一个表名是否合适试着把它读出来。如果读出来像一句人话比如“DWD层交易域订单日增量表”那大概率是合适的如果读出来像一串乱码比如“t_ord_2_f”那就需要重新命名。这个技巧虽然简单但很实用。
阅读完成 · 觉得有帮助?