2012-12-20 31 views
2

我们已经有了一个数据仓库的设计,四个维度表和一个事实表创建一个事实表:如何使用自然键

  • dimUser ID,电子邮件,名字,姓氏
  • dimAddress ID,城市
  • dimLanguage ID,语言
  • dimDate ID,的startDate,结束日期
  • factStatistic ID,dimUserId,dimAddressId,dimLanguageId,dimDate,loginCount,pageCalledCount

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

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

我认为一个自然的关键是userId,这在所有ETL作业中都是需要的,这些作业计算出尺寸数据。

但也有许多困难:

    在ETL作业负载(),我们做INSERT批量插入IGNORE INTO删除重复=>我们不知道产生该代理键
  • 如果我们创建元数据(包括一组DIMENSION_NAME,surrogate_key,natural_key的),这不会因为消除重复的工作

这个问题似乎是消除重复的策略。有更好的方法吗?

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

+1

什么是您的事实表追踪?按用户/地址/语言/“日期范围”登录?在我看来,地址和语言是用户的属性?而你的日期表有范围?为什么不只是在事实表中存储单个日期并汇总? –

+0

这是真实设计的简化模型。但它基本上是每个用户(具有地址和语言)的登录和页面调用。 loginCount和pageCalledCount按日期范围汇总。 –

+1

我真的不明白你的问题,但如果你正在寻找一种方法来生成和填充代理键,那么我提出了一个相当通用的方法,在[这个问题]中使用映射表(http:// stackoverflow。 COM /问题/ 12657674/SQL-datawarehousing-需要的帮助 - 填充 - 我维 - 使用 - TSQL - 选择 - 或-A-定)。报告数据库通常使用人造密钥,所以我不确定为什么要使用自然密钥;看起来你的问题主要是实现你的ETL过程,而不是你的设计,虽然我可能是错的。 – Pondlife

回答

1

如果事实表跟踪登录和每个用户的页面调用,那么你应该有跟踪这些事情的源表集合,这是您将从中加载事实表数据的位置。我可能会在每个用户/登录日期的一行中创建事实表 - 如果可能的话甚至更低以保持原子数据。

在这里,你将有一个事实表与两个维度 - 用户和日期。你可以坚持地址和语言作为事实的维度,但这些实际上只是用户的属性。

您的维度应该有代理键,但也应该有源“业务”或“自然”键可用 - 作为维度本身的属性,或者通过您的同事建议的映射表。使用映射表并非“错误” - 当存在多个源时,它确实使事情变得更加简单。

如果您将业务密钥存储在映射表中,或者将维存储为属性,那么对于事实中加载的每一行,这是对照暗淡或映射表的简单查找(通常是通过连接),以获取用户的代理键(然后从用户那里获得用户的“当前”地址/语言以坚持事实)。日期维通常使用以YYYYMMDD或其他“自然”格式存储的替代关键字 - 您可以根据要加载到事实中的源记录上的日期信息生成此日期维。

0

不要勉强单查询,尝试加载分离查询的数据和一些供应商的数据混合...

+0

我不明白。我们已经实现了填充维度表的ETL作业。但是我们不知道如何在事实表中将维度条目彼此连接起来。 –

相关问题