【发布时间】:2012-12-20 14:11:29
【问题描述】:
我们有一个包含四个维度表和一个事实表的数据仓库设计:
- dimUser id、电子邮件、名字、姓氏
- dimAddress id, 城市
- dimLanguage id,语言
- dimDate id、startDate、endDate
- factStatistic id、dimUserId、dimAddressId、dimLanguageId、dimDate、loginCount、pageCalledCount
我们的问题是:我们要构建包含计算统计信息(取决于 userId、日期范围)和填充外键的事实表。
但我们不知道如何使用,因为我们不了解如何使用自然键(根据我们阅读的文献,这似乎是我们问题的解决方案)。
我相信一个自然键是 userId,所有计算维度数据的 ETL 作业都需要它。
但是有很多困难:
- 在 ETL 作业 load() 中,我们使用 INSERT IGNORE INTO 进行批量插入以删除重复项 => 我们不知道生成的代理键
- 如果我们创建元数据(包括一组维度名称、代理键、自然键),由于重复消除,这将不起作用
问题似乎是重复消除策略。有更好的方法吗?
我们使用的是 MySQL 5.1,如果它有什么不同的话。
【问题讨论】:
-
您的事实表跟踪是什么?按用户/地址/语言/“日期范围”登录?在我看来,地址和语言是用户的属性?你的日期表有范围吗?为什么不将单个日期存储在事实表中并汇总?
-
这是真实设计的简化模型。但它基本上是每个用户的登录和页面调用(具有地址和语言)。 loginCount 和 pageCalledCount 按日期范围聚合。
-
我不太了解您的问题,但如果您正在寻找一种生成和填充代理键的方法,那么我建议使用映射表来回答this question 的一种相当通用的方法。报告数据库通常使用人工键,所以我不确定您为什么要使用自然键;看来您的问题主要是实现您的 ETL 流程,而不是您的设计,尽管我可能错了。
-
我想我混淆了自然键和业务键这两个术语。
-
我正在寻找的是一种算法,我可以用它来填充我的事实表。我有一种方法,我将使用一个单独的映射表,如下所示:mappingTable - dimensionId - dimensionName - businessKeyValue 该数据将从计算维度数据的 ETL 作业创建并用于填充事实表( s)。但是我的同事说,这是 Inmon 和 Kimball 策略的混合(因为我们部分使用单值业务键和串联的多值业务键),在可扩展性方面对我们没有好处。
标签: data-warehouse etl fact surrogate-key natural-key