我们的组织目前正在构建一个新的数据仓库。我们实际上能够使用从 DW 社区借用的一些技术,例如 ETL 处理以符合数据、“kimbal”样式中的非规范化维度等。总的来说,数据仓库对我们的组织来说仍然是相当新的,但我们正在学习概念。
问题:我们有多种数据来源,事实来源经常相互冲突。比如我们有一个Master Person Index,我们在ETL的时候用一个score-based matching algorithm来匹配一个inbound person和一个existing person,所以即使inbound record不完全匹配,我们也可以根据其他东西打分像邮政编码半径。
问题来了:处理来自两个或多个来源的事实的多个版本的标准方法是什么?
我理解数据仓库的主要思想之一是保留我们正在做的任何事实的运行历史。当记录由一个入站源维护时,这一切都很好,花花公子,我们会随着时间的推移保留该事实的历史记录。当可能每天更新的两个不同来源有两个不同的事实时,就会出现问题,例如来源 A 说名字是 Mary Smith,来源 B 说名字是 Mary Jane 每天都在改变这个值!基于匹配算法,我们确信这是同一个人,但由于我们的历史样式表,它基本上每天都在两个名字之间来回切换,因为它从每个数据源读取名字作为“更改”。
示例表:
first_name last_name source last_updated
Mary Smith A 5/2/12 1:00am
Mary Jane B 5/2/12 2:00am
Mary Smith A 5/3/12 1:00am
Mary Jane B 5/3/12 2:00am
Mary Smith A 5/4/12 1:00am
Mary Jane B 5/4/12 2:00am
...
最佳答案
有一个表来存储您的外部数据:
id | first_name | last_name | source | external_unique_id | import_date
----+------------+-----------+--------+--------------------+-------------
1 | Mary | Smith | A | abcdefg123 | 5/2/12 1:00am
2 | Mary | Jane | B | 1234567abc | 5/2/12 2:00am
然后有第二个表包含您清理过的数据:
id | first_name | last_name
----+------------+-----------
1 | Mary | Jane-Smith (or whatever)
然后就有了两者的映射表。
local_person_id | foreign_person_id
-----------------+-------------------
1 | 1
1 | 2
或大致相似的内容。
目标是从您的源加载事实一次,并保留它们。
然后使用您的模糊逻辑将它们与某处的主记录相关联。您只需要在加载新事实或更改旧事实时执行此操作。
不过,您仍然可以选择使用什么 last_name
。但在没有确定数据的情况下,这几乎是任意的。例如:从最近加载的事实中选择姓氏。
您仍然可以快速而简单地将主事实与子事实、它们的来源以及它们的相应数据相关联。但是您的仓库中有一个统一的实体来存放这些外部事实。
关于sql - 数据库/数据仓库中的多个相互矛盾的事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12781215/