首页/数据/数仓建模速查/路径列:层级查询的物化方案
维度与事实设计149 条

路径列:层级查询的物化方案

把从根到当前节点的 ID 路径物化成字符串列(如 /1/12/103/),用 LIKE 前缀或拆分即可完成子树查询与层级聚合。

数仓建模速查数据更新于 2026-10-13

路径列的思路

路径列把从根到当前节点的 ID 串物化成字符串,例如 /1/12/103/:子树查询用 LIKE 前缀匹配即可完成,层级深度也能由分隔符个数算出。它牺牲的是写成本——节点移动之后必须级联重写整棵子树的路径。

基本信息

存储形态根到当前节点的 ID 串,用固定分隔符连接
子树查询LIKE 前缀匹配,例如 /1/12/%
层级计算分隔符个数减一即层级深度
维护成本节点移动后必须级联重写子树路径
适用场景层级相对稳定、查询频繁的维度

典型使用场景

  • 组织子树统计:按前缀过滤一次拿到某部门及其下属
  • 类目下钻:报表按路径前缀筛选类目分支
  • 账户层级:主账户下所有子账户的明细查询
  • 层级深度分析:由路径派生层级用于报表分组
  • 权限数据准备:按路径批量给某棵子树授权

子树查询与层级派生

子树查询与层级派生
-- 子树查询:前缀匹配即可,不必递归
SELECT org_id, name, path
FROM dim_org
WHERE path LIKE '/1/12/%';

-- 层级深度等于路径中分隔符个数减一
SELECT org_id,
       length(path) - length(replace(path, '/', '')) - 1 AS depth
FROM dim_org;

操作与代价

操作代价说明
子树查询低前缀匹配,可走索引
节点移动高需要级联重写整棵子树
层级派生低字符串函数即可计算
新增叶子低按父路径拼接即可
节点移动是路径列的主要成本:一次移动要更新该节点及其所有后代的路径,事务或分区覆盖策略要提前设计,否则会出现半更新的子树。
ID 中若包含分隔符会让拆分失真:选分隔符前先确认 ID 的字符集,必要时统一编码,或改用固定长度分段的写法。
路径列要参与数据质量校验:每条路径的父前缀都必须能在表里找到对应节点,否则说明有节点未同步,子树查询会漏数据。

易错点

  • 节点移动后未级联重写:路径与实际父子关系不一致,子树查询漏数据
  • ID 中含分隔符:路径拆分与层级计算失真
  • 路径不带首尾分隔符:前缀匹配把 /1/12 与 /1/120 混在一起
  • 路径列长度不设上限:深层层级被截断,查询结果不完整
  • 路径格式变更(换分隔符)不重建历史:新旧格式混存

数据来源与参考

  • 数仓建模实践:层级路径物化
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌