Node:稳定组织或分类节点
Edge:父子关系与有效期
Closure:祖先、后代与深度
Bridge:多归属与权重
View:当前与历史汇总
结论:层级深度不固定时不要硬塞固定列
集团 A 有总部—区域—门店,集团 B 还有事业群、公司和城市。固定 level1 到 level7 会出现大量空值,层级调整时还要重写多列,难以保留历史。
父子模型为每个节点保存 parent_key,并用 closure 表预计算所有祖先—后代路径和 depth。查询可以从任意节点向上汇总,不依赖统一深度。
节点使用稳定代理键
dim_node 保存 node_key、business_id、type、name 和有效期。名称、编码和父级会变化,不能把名称当键;同名部门也可能属于不同法人。
根节点、未知节点和已停用节点显式建模。删除组织不能让历史事实失去关联,除非法规要求物理删除。
父子边要有有效时间
edge 保存 child_key、parent_key、valid_from、valid_to、relationship_type 和 version。调岗或组织重组关闭旧边、创建新边,不覆盖历史。
一名节点是否允许多个父级由业务规则决定。法定组织、管理组织和商品分类可以是不同 hierarchy_id,不能混在一棵树。
闭包表加速祖先与后代查询
closure 保存 hierarchy、ancestor、descendant、depth、有效期或版本,包括节点到自身 depth=0。新增或移动边时重建受影响路径,并用事务或版本避免半成品。
闭包表是派生结构,父子边才是权威来源。必须能从边重新生成并对账,不能人工修改路径。
处理跳层与不平衡深度
不规则层级允许门店直接挂区域,也允许中间有城市公司。展示时可根据 node_type 生成路径,缺层不应复制父节点来填满。
固定层级报表若业务必须,可以生成投影视图,但注明折叠规则。复制节点填空会导致 distinct count 和汇总重复。
多归属需要桥与权重
矩阵组织中一个团队可能同时归属产品和区域。若同一 hierarchy 内允许多父级,汇总会重复事实;bridge 保存关系类型和 allocation_weight,或只允许一个主归属。
权重和应为 1 并版本化。管理查看可以重复展示,但财务汇总必须选择守恒口径,不能把展示关系当成本分摊。
区分当前层级与事件时层级
“按当前组织回看历史”与“按交易当时组织汇总”是不同问题。事实保存事件时 node_key;查询可关联历史 edge 或当前映射。
组织重组后默认切换到当前层级会重写趋势。语义层提供 as_was 和 current 两个明确维度,并显示 hierarchy_version。
防止环、孤儿和越权路径
边加载时检测 child 不得成为自己的祖先,父节点必须存在且类型允许。孤儿、循环、重复路径和有效期重叠进入质量队列。
权限沿层级继承时,错误边可能扩大访问。授权查询使用经批准层级版本,并对敏感节点设置显式阻断;报表层过滤不能替代权限。
验收清单
测试单节点、七层链、跳层、移动、拆分、合并、多父级、循环、迟到变更和停用。检查每个版本无环、根可达、闭包可重建、财务汇总守恒。
用已知组织图逐点核对祖先/后代结果,并比较调整前后 as_was/current。性能测试覆盖深树和宽树,不能只测三层样例。
重组事件需要拆分、合并和映射语义
部门移动只改变父边;拆分会创建多个新节点并维护 old_to_new 映射;合并则需要说明历史是否按新组织重述。员工、预算和交易事实的迁移规则可能不同,不能用一个组织映射覆盖所有主题。
重组批次保存 effective_at、announcement_at、loaded_at、审批和影响范围。迟到重组按双时间边界处理,旧发布与最新组织视图并存。映射权重只用于经批准重述,不自动成为成本或绩效分摊。
层级服务的发布应当原子化
先在 staging 版本加载节点和边,运行无环、根可达、类型、有效期和闭包守恒检查;全部通过后一次切换 hierarchy_version。不能先发布边、数分钟后再补 closure,否则用户会看到不完整祖先。
消费端缓存键包含 hierarchy_id 与 version,版本过期后清理。大型层级增量重建虽能降低成本,但需定期全量重算对账,防止长期累计路径遗漏。
事实汇总要防止路径重复
查询从后代事实经 closure 汇总祖先时,必须限定 hierarchy_id、version 和允许的 relationship_type。多父级展示若不使用权重,同一事实会在共同祖先重复;财务视图应在桥上先分配,再沿单一守恒路径聚合。
distinct 事实键可以掩盖重复数量,却会让可加金额和计数口径不一致,因此不是通用修复。正确做法是声明汇总语义并检查每个事实到目标祖先的有效路径数。
验收生成控制总额:叶子金额、根节点金额和桥接后金额在同一版本下守恒。对移动节点比较发布前后,历史 as_was 不变,current 视图按批准映射变化,并能列出差异节点。
展示路径与分析路径要分开
用户界面可能为了简洁隐藏中间法人或虚拟节点,但分析路径仍必须保留真实祖先。展示层用 display_parent 和排序配置,不修改权威 edge;否则同一组织在不同报表会产生不同汇总父级。
搜索与面包屑可以使用友好路径,导出和审计则附 node_key、hierarchy_version 与完整路径。节点改名只影响显示,不应触发事实重写。若业务确需别名,建立有效期和 locale,而不是复制新节点。
BuildTable.ai 边界
先选一个层级,冻结节点类型与多归属政策,加载父子边、生成闭包、回放重组历史,再发布当前/历史视图。监控孤儿、循环、路径增长和重复汇总。
BuildTable.ai 可作为父子维度、闭包和语义结果建模候选,但本文不证明当前版本自动维护闭包、检测全部环或执行层级权限。调度、版本和权限需实际验证。
