我正在维护一个数据仓库,其中包含关于必须合并的一类实体的多个数据源。每个源都有一个自然键,并且应该发生的是,始终为每个自然键创建一个且只有一个代理键。如果来自一个源系统的具有特定自然键的一条记录与来自具有不同自然键的另一个源系统的另一条记录表示相同的实体,则将为两者分配相同的代理键。
换句话说,如果源系统 A 具有与源系统 B 的自然键 DEF 表示相同实体的自然键 ABC,我们将为两者分配相同的代理键。该表如下所示:
SURROGATE_KEY SOURCE_A_NATURAL_KEY SOURCE_B_NATURAL_KEY
1 ABC DEF
这就是计划。但是,这个系统已经生产了一段时间,代理键分配是一团糟。在源系统 B 知道之前,源系统 A 会在某一天给出自然键 ABC。DW 为其分配了代理键 1。然后源系统 B 开始给出自然键 DEF,它表示与源系统 A 的自然键 ABC 相同的东西。DW 错误地给了这个组合代理键 2。该表如下所示:
SURROGATE_KEY SOURCE_A_NATURAL_KEY SOURCE_B_NATURAL_KEY
1 ABC NULL
2 ABC DEF
所以仓库乱七八糟。还有比这更复杂的情况。我有一个很短的清理时间表,需要找出一组干净的自然键映射的代理键。
一点谷歌搜索表明,这可以建模为非二分图中的匹配问题:
我需要 Edmond 的路径、树和花算法的易于理解的实现(不是最佳执行)。我没有正式的数学或计算机科学背景,我所拥有的是自学的,而且我今晚不在数学上。任何人都可以帮忙吗?一个指导我实现的写得很好的解释将不胜感激。
编辑:
数学方法是最优的,因为我们想要最大化全局适应度。贪婪的方法(首先获取 A 的所有实例,然后是 B,然后是 C...)会将您绘制到局部最大值角落。
无论如何,我把这个推回业务分析师手动完成(全部 2000 万)。我正在帮助他们评估全局匹配质量。这是理想的,因为无论如何他们都是签字的人,所以我的背面被遮住了。
不使用代理键不会改变匹配问题。仍然需要发现和维护 1:1 自然键映射。代理键是一个方便的锚,仅此而已。