Sql 数据库/数据仓库中的多个冲突事实

Sql 数据库/数据仓库中的多个冲突事实,sql,data-warehouse,business-intelligence,Sql,Data Warehouse,Business Intelligence,我们的组织目前正在建设一个新的数据仓库。实际上,我们能够使用从DW社区借用的一些技术,如ETL处理来整合数据,“kimbal”风格的非规范化维度等。总体而言,数据仓库对我们的组织来说还是相当新的,但我们正在学习这些概念 问题是:我们有多种数据来源,而事实来源往往相互冲突。例如,我们有一个主人员索引,其中我们在ETL期间使用基于分数的匹配算法将入站人员与现有人员进行匹配,因此即使入站记录不完全匹配,我们也可以基于其他内容(如邮政编码半径)进行评分 问题是:处理来自两个或多个来源的事实的多个版本的标

我们的组织目前正在建设一个新的数据仓库。实际上,我们能够使用从DW社区借用的一些技术,如ETL处理来整合数据,“kimbal”风格的非规范化维度等。总体而言,数据仓库对我们的组织来说还是相当新的,但我们正在学习这些概念

问题是:我们有多种数据来源,而事实来源往往相互冲突。例如,我们有一个主人员索引,其中我们在ETL期间使用基于分数的匹配算法将入站人员与现有人员进行匹配,因此即使入站记录不完全匹配,我们也可以基于其他内容(如邮政编码半径)进行评分

问题是:处理来自两个或多个来源的事实的多个版本的标准方法是什么

我知道数据仓库的一个主要思想是保存我们正在做的任何事实的运行历史。当一个记录由一个入站源维护时,这一切都是好的,我们会随着时间的推移保留该事实的历史记录。当两个不同的源(可能每天更新)具有两个不同的事实时,就会出现问题,例如,源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
或者类似的东西


目标是从你的来源加载一次事实,并保存它们

然后使用模糊逻辑将它们与某个地方的主记录关联起来。您只需要在加载新事实或更改旧事实时执行此操作

尽管如此,您仍然可以选择使用什么
。但在缺乏确定数据的情况下,这几乎是任意的。例如:从最近加载的事实中选择姓氏


您仍然可以快速简单地将主数据与子事实、它们的来源以及它们对应的数据关联起来。但是,您的仓库中有一个统一的实体来挂起这些外部事实。

术语中有一点——您列出的是“属性”,而不是“事实”。事实是对一组维度属性的度量。(例如,该“人员”下的订单,或该客户最近订单的美元价值等)。在本例中,您有多个维度属性源,每个源都被视为“相同”

@Dems方法是将清理后的数据与暂存/操作数据集分开的一种方法(也是一种很好的方法)

另一种方法是,如果您需要在报告中访问这两个数据集,同时仍保持“干净”版本,则将所有属性放在person/customer维度上:

   FIRST_NAME
   LAST_NAME
   SOURCE1_FIRST_NAME
   SOURCE1_LAST_NAME
   SOURCE2_FIRST_NAME
   SOURCE2_LAST_NAME

对于用户社区希望看到来自源2的名称的度量报告,可以使用source2属性。对于期望源1的人,使用它。对于寻找“符合”名称的处理结果的人,使用主属性。

你认为这两个来源中哪一个更可靠,为什么?当您找到这两个问题的答案后,您应该能够实现在数据仓库应用程序中遵循的相同推理。当您确信Mary Jane和Mary Smith是同一个人,但不同的数据库可能在其中一个名称下引用她时,您可以将一个名称存储为另一个名称的别名,这样您就可以在两个名称下找到同一个人。当Jane Smith成为James Smith,然后与Jones女士结婚并使用她的姓氏时,这个别名功能也会变得很方便。