指针:计划记录版本而非最新
哈希:发现同号定义被覆盖
解析:缺失版本则失败
迁移:只有等价变更可自动改指针
并存:新旧版本同时可执行
已保存计划要钉住语义版本,而不是跟随最新
语义模型热更新之后,已保存的问数会变数,通常是因为执行时重新绑定了当前最新定义,而不只是因为业务数据变了。已保存查询应在查询计划里钉住指标、维度、过滤和粒度的语义版本。新版本可以发布,旧计划继续解析到被钉住的版本;只有经过明确迁移,计划才改指向新版本。同一份已保存问数,在定义未迁移、数据快照也未变时,应得到同一个计划哈希。
哪些下游会受影响,以及字段契约如何弃用,是另外的治理问题。本文只处理一件事:已保存计划如何钉住当时的语义,以及这个指针在什么条件下允许改。探索中的未保存查询可以显式选择最新版,但一旦保存,就不能继续留着一个会移动的最新指针。
版本号和定义哈希要一起钉住
计划里至少记录指标标识和版本、引用的维度与实体版本、定义级过滤、聚合方式、事实粒度和逻辑定义的哈希。只保存自然语言或指标名称不够,名称会在热更新后指向新公式。只保存某次编译出的物理语句,又会在表结构修复后失效,并且看不出语义是否改变。粒度也要钉住。同一指标名称从订单行改成订单头,版本若不变,合计会在问题文本没改的情况下变化。
哈希用来发现版本号没变、定义却被原地覆盖。版本号用来阅读和迁移。两者不一致时,执行应失败,而不是在同号下选用仓库里的新内容。数据截止时间是另一条轴:同一语义版本配上新数据,数字可以合法变化。语义钉住不能解释数据刷新,也不应把数据变化误判为口径漂移。
找不到被钉住的版本时,查询失败
解析顺序固定。已保存计划带版本时,只取该版本。该版本缺失、哈希不符或声明的粒度对不上,查询失败并标明版本不可用。不得自动改绑最新版。交互式探索可以显式请求最新版,但保存动作必须把当时解析到的版本写进计划。失败信息至少包含被请求的版本、实际哈希和缺失原因,便于和迁移记录对照,而不是只返回一个空结果。
热更新的含义是发布一个新版本,并让新的探索查询看到它,不是覆盖旧版本的内容。旧版本在迁移完成前保持可读、可执行。若部署流程只能保留一份定义,就做不到钉住,下一次发布会改写已保存结果。指标、维度和过滤应作为一组快照发布,避免指标已是新过滤、维度仍是旧键。快照标识要同时出现在执行记录和结果说明里,使用者能据此复述当时的定义,而不必翻仓库历史。
只有可证明等价的变更才自动迁移
允许自动迁移的,是可证明等价的变更:别名、注释、不改变逻辑哈希的物化方式,以及在固定数据快照上逐格相等的重写。相等指旧版本与新版本结果一致,并且声明的粒度、聚合和过滤没有变化。相等不等于新数字更正确。修正重复计算会改变结果,它不是等价补丁。样例至少覆盖原来的分组键、过滤边界和空成员。只比较一个总计,可能把分组错误掩盖掉。
改变粒度、聚合、定义级过滤、默认日期角色或维度键,都必须走显式迁移。迁移记录写明来源版本、目标版本、原因、验收样例和批准者,然后才更新计划中的版本指针。未迁移的保存查询继续跑旧版本。纠正错误口径不会自动惠及旧报表,必须有人批准,或让旧版本继续被引用。
绑定最新,或保存不可变指针
路径一是保存指标名,每次执行绑定最新定义。修复可以立刻到达所有报表,探索也简单。代价是已保存问数会在没有迁移记录的情况下改变数字,使用者无法区分经营变化、数据刷新和口径热更新。这条路径只适合明确标记为始终跟随最新的探索,不能当作已保存报表的默认。
路径二是保存不可变版本指针和定义哈希,并附一张迁移账。执行只解析指针;迁移是单独写入的动作。热更新与已保存结果因此隔离。另一条常见做法是冻结编译后的物理语句。它在短期内数字稳定,却脱离语义模型,后续即使是等价的物理重建也无法纳入同一套版本检查。已保存问数应使用路径二。冻结物理语句还会把当时的查询级过滤写死。下次改变切片时,旧语句和新的语义过滤不再是同一套规则。
发布和回滚都要让旧指针仍然可解析
发布新版本时,旧版本对象保持可解析。计划钉住的是这一组快照的版本,而不是仓库的浮动分支名。删除仍被引用的版本应当被拒绝。回滚是再发布一个指针可以指向的版本,或把迁移记录撤回到原版本,不是静默删除新版本后指望旧计划自己愈合。
NIST 的人工智能风险管理框架强调测量和变更要可追溯。落到语义层,就是每个已保存结果能指出自己使用的定义版本。框架本身不规定版本号格式,也不代替粒度、过滤和聚合的声明。dbt 的指标与语义模型是这些被钉住对象的一种组织方式:指标引用度量,语义模型描述实体、维度和度量;组织方式变了,计划仍要钉住当时那一组定义。
反例与验收
反例一:版本号仍是原来的号,过滤语句已被原地修改,哈希变了,执行继续给出新数字。反例二:钉住失败后自动回退最新,热更新当天所有保存问数改口。反例三:把会改变结果的修复当作等价补丁自动迁移,报表在无人批准时变数。反例四:只钉住模型包版本,包内某个指标仍被单独覆盖。反例五:数据刷新后认定语义钉住失效,于是每次装载都重新绑定最新语义。
验收要求:不迁移时重跑,计划哈希不变;在固定数据快照上结果不变。发布新版本后,旧计划结果不变。哈希不符或版本缺失时失败,不回退。等价重写只有在样例逐格一致时才自动改指针。非等价变更保留旧指针,并留下待迁移状态。计划中能读出指标版本、维度版本、过滤和粒度。待迁移状态仍然执行旧版本,并在结果中标明有新版本待批准。等待期间不能改用新版本。
BuildTable.ai 边界
先选一个已保存问数,冻结数据快照,发布一个只改别名的版本和一个改过滤的版本,确认前者才允许自动迁移、后者仍钉在旧版本。再核对版本缺失或哈希不符时不会改绑最新。数据刷新应改变数据截止标记,而不是语义指针。
BuildTable.ai 可作为语义建模入口候选。本文不证明当前版本已经把已保存查询钉在语义版本上,也不证明已经实现跨事实先聚合对齐或过滤层级的优先级。要检查实际保存的查询计划里有没有版本指针和定义哈希,并用不迁移、等价迁移和非等价变更三类样例核验。
