路径列的思路
路径列把从根到当前节点的 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 的字符集,必要时统一编码,或改用固定长度分段的写法。
路径列要参与数据质量校验:每条路径的父前缀都必须能在表里找到对应节点,否则说明有节点未同步,子树查询会漏数据。