如何使用自然键创建事实表

时间:2012-12-20 14:11:29

标签: data-warehouse etl fact surrogate-key natural-key

我们有一个包含四个维度表和一个事实表的数据仓库设计:

  • dimUser id,email,firstName,lastName
  • dimAddress id,city
  • dimLanguage id,language
  • dimDate id,startDate,endDate
  • factStatistic id,dimUserId,dimAddressId,dimLanguageId,dimDate,loginCount,pageCalledCount

我们的问题是:我们想要构建事实表,其中包括计算统计信息(取决于userId,日期范围)和填充外键。

但是我们不知道如何,因为我们不了解如何使用自然键(根据我们阅读的文献,它似乎是我们问题的解决方案)。

我相信一个自然键是userId,这是计算维度数据的所有ETL作业所需要的。

但是有很多困难:

  • 在ETL作业load()中,我们使用INSERT IGNORE INTO进行批量插入以删除重复项=>我们不知道生成的代理键
  • 如果我们创建元数据(包括一组dimension_name,surrogate_key,natural_key),由于重复删除,这将无效

问题似乎是重复淘汰策略。有更好的方法吗?

我们正在使用MySQL 5.1,如果它有任何区别。

2 个答案:

答案 0 :(得分:1)

如果您的事实表是跟踪每个用户的登录和页面调用,那么您应该有一组源表来跟踪这些事情,这是您从中加载事实表数据的地方。我可能会在每个用户/登录日期的一行中构建事实表 - 或者甚至更低,以便在可能的情况下保持原子数据。

然后,您将拥有一个包含两个维度的事实表 - 用户和日期。您可以将地址和语言作为维度保留在事实上,但这些只是用户的属性。

您的维度应具有代理键,但也应具有源“业务”或“自然”密钥 - 可以作为维度本身的属性,也可以通过您的同事建议的映射表。使用映射表并不“错误” - 当有多个源时,它确实使事情变得更容易。

如果您将业务键存储在映射表中,或者将维度存储为属性,那么对于要加载的每一行,它都是针对dim或映射表的简单查找(通常通过连接)来获取用户的代理键(然后从用户获取用户的“当前”地址/语言以坚持事实)。日期维度通常具有以YYYYMMDD或其他“自然”格式存储的代理键 - 您可以从源记录中的日期信息中生成此信息,然后将其加载到事实中。

答案 1 :(得分:0)

不要强制单个查询,尝试在分离的查询中加载数据并在某些提供程序中混合数据...