航空公司、业务类型和站点规则最早都维护在 Excel 里。有人删掉一行,通常表示这条配置以后不再使用。
最直接的同步方式,是让数据库也删除对应记录。但这些记录进入维度表后,已经可能被历史事实、价格结果和报表引用。物理删除不仅会破坏关联,也会让我说不清过去为什么曾经采用这条规则。
可如果什么都不做,旧配置仍会出现在当前选择列表里,新的业务又可能继续使用它。
后来同步时,我把源表里消失的记录标记为非活跃,而不是删除。
它的业务键和数据库键继续保留,历史事实仍然能找到原来的解释;当前查询则默认只读取活跃记录,避免新业务继续选中已经停用的配置。
这条边界很重要:事实表记录发生过什么,当前配置表决定现在允许什么。为了让当前列表干净,不能把历史证据一起清掉。
这里要区分两个身份。Excel 里的代码是业务键,用来判断这次同步看到的是谁;数据库里的维度键一旦被事实表引用,就承担了历史身份。业务键暂时消失,不能让维度键跟着消失,更不能在它回来时随意换一个新的维度键。
03 / 04
被重新填回 Excel 时,原记录可以恢复配置也可能是误删,或者停用一段时间后重新启用。同步过程再次看到相同业务键时,不应该再插入一个全新的身份,而是把原记录恢复为活跃,并更新时间。
这样历史和现在仍然指向同一个业务对象。否则同一家航空公司仅仅因为被删掉又加回来,就会在仓库里拥有两个互不相认的身份。
系统还要保护“未知”成员。它用于承接暂时无法映射的数据,不能因为源 Excel 里没有对应行就被一起停用。
批量停用前也需要留出审计信号。源文件读错 Sheet、表头变化或一次上传了空文件,都会让系统误以为所有配置同时消失。如果同步不检查数量突降和来源是否完整,一次输入故障就可能把整张维度表标成非活跃。
并不是所有表都适合软删除。临时缓存可以重建,错误导入的数据也可能需要物理清理。但只要一条记录已经成为历史事实的引用,删除动作就必须更谨慎。
我现在看到 Excel 里少了一行,不会马上问数据库该执行哪条 DELETE。先要问的是:它只是当前失效,还是历史也应该被否定?以后重新出现时,还是不是同一个对象?
这几个问题答清楚,才知道该删除、停用,还是保留一个新版本。