均衡与不规则层次
层次结构按深度是否一致分为两类。均衡层次每一条路径的深度相同,比如年、月、日三级时间层次;这类可以直接物化成固定层级列,查询时按列分组即可。不规则层次深度不一致,比如类目有的到三级有的到五级,用固定层级列会丢节点,需要路径列或桥接表来表达。判断方式不需要争论:先跑一次实际深度分布统计,用数据决定采用哪种表达。
基本信息
| 均衡层次 | 层级深度一致,可直接物化 l1/l2/l3 列 |
|---|---|
| 不规则层次 | 深度不一,需路径列或桥接表表达 |
| 判断方式 | 先跑深度分布统计,按实际数据决策 |
| 常见场景 | 时间层次属均衡,商品类目与组织多属不规则 |
典型使用场景
- 时间维度:年月日深度固定,直接物化列后按层聚合最简单
- 商品类目:深度因品类而异,用路径列支持任意层级汇总
- 组织架构:层级随合并拆分变化,需评估是物化还是递归
- 渠道体系:一级代理到三级代理深度不均,路径表达更稳妥
- 模型评审:用深度分布数据决定表达方式,避免凭印象下结论
路径列与聚合
路径列与聚合
-- 不规则层次用路径列表达,格式需先定规范
-- path = '1/12/103/1034',斜杠分隔且每层带层级标记
SELECT * FROM dim_cat
WHERE path LIKE '1/12/%'; -- 取某二级下全部子节点
-- 按深度过滤实现任意层级聚合
SELECT c.depth_level, sum(f.amt) AS amt
FROM fact_sale f
JOIN dim_cat c ON f.cat_id = c.cat_id
WHERE c.depth_level <= 2 -- 只聚合前两层,跳级成员需先约定归属
GROUP BY c.depth_level;
-- 深度分布统计(建模前必做)
-- SELECT depth_level, count(1) FROM dim_cat GROUP BY depth_level;表达方式对照
| 判断项 | 固定层级列 | 路径列或桥接表 |
|---|---|---|
| 深度一致性 | 所有路径深度相同 | 深度参差不齐 |
| 查询便利性 | 按列直接分组,最简 | 需前缀匹配或桥接关联 |
| 结构变更 | 深度变化要改表结构与回刷 | 路径重算或桥接重建 |
| 存储开销 | 较小 | 路径串较长,桥接表行数放大 |
用固定层级列硬套不规则树时,超出预设深度的节点会被归入空值或末级,汇总数字看起来正常但层级口径已经错了。
路径串格式必须先定规范:分隔符、是否首尾带分隔符、层级序号如何表达,都要写进文档,否则前缀匹配会出现跨层级误命中。