树节点移动的影响
在层级维度(组织树、类目树、区域树)里把节点挂到新的父节点下,会连带改变整棵子树成员的上级归属。如果历史口径要求「按当时归属统计」,就必须为整个子树生成新版本,而不是只更新被移动的那一个节点。此外移动操作要在同一个批次里完成,否则中间态会被下游任务读到。
基本信息
| 影响面 | 被移动的节点 + 其整棵子树 |
|---|---|
| 版本处理 | 子树范围内成员统一关闭旧版本并插入新版本 |
| 子树定位 | 用路径列前缀匹配(如 path LIKE '/1/12/%') |
| 校验要求 | 更新后做路径与层级的一致性校验 |
| 环检测 | 禁止把节点移动到自身或自身子树之下 |
| 执行要求 | 子树批量变更放在同一事务或同一批次 |
典型使用场景
- 组织调整:部门从一个大区划到另一个大区,下属团队归属整体变化
- 类目重构:把二级类目整体移到新的一级类目下
- 区域重划:门店所属片区调整,需要重建区域-门店关系
- 权限影响评估:移动前后各层级的负责人能看到的数据范围变化
- 历史归因:考核历史业绩时判断按当时组织还是当前组织统计
子树版本化与环检测
子树版本化与环检测
-- 1) 先锁定子树范围,确认影响面
SELECT org_id FROM dim_org WHERE path LIKE '/1/12/%' AND is_current = 1; -- 前缀匹配整棵子树
-- 2) 环检测:目标父节点不能在待移动子树内
SELECT count(1) AS risk FROM dim_org
WHERE org_id = :new_parent AND path LIKE :moved_node_path || '%'; -- 返回大于 0 就必须拒绝本次移动
-- 3) 子树批量版本化:关闭旧版本并插入新版本,路径列级联重写
UPDATE dim_org SET end_date = :dt, is_current = 0
WHERE path LIKE :moved_node_path || '%' AND is_current = 1;移动操作检查项
| 检查项 | 方法 | 不做的后果 |
|---|---|---|
| 子树完整 | 按路径前缀统计成员数 | 只改父节点,子节点路径悬空 |
| 环检测 | 目标父节点是否在子树内 | 形成环,层级遍历死循环 |
| 路径重写 | 批量替换路径前缀 | 层级与路径不一致,下钻结果错 |
| 批次原子性 | 单事务或单批次提交 | 下游读到中间态,报表数抖动 |
移动操作要放在维度加工的同一个事务或批次内,避免中间态被下游读到;如果引擎不支持事务,应通过临时表整体替换的方式发布新版本。
扁平化路径列(如 /1/12/1203)让子树定位变得简单,但路径必须随移动同步重写;使用 parent_id 递归查询虽然灵活,却难以在一个批次内确定影响范围。