【问题标题】:How to create history fact table?如何创建历史事实表?
【发布时间】:2011-08-30 03:21:34
【问题描述】:

我的数据仓库中有一些实体:

  1. Person - 具有 personId、dateFrom、dateTo 和其他可以更改的属性,例如姓氏、出生日期等 - 渐变维度

  2. 文档 - documentId、编号、类型

  3. 地址 - addressId、城市、街道、房屋、公寓

(Person and Document) 之间的关系是一对多的,(Person and Address) 是多对多的。

我的目标是创建可以回答我们以下问题的历史事实表:

  1. 哪些人在指定日期居住在指定地址?

2、指定地址在指定时间间隔内有哪些居民历史?

这不仅是针对DW设计的,而且我认为这是DW设计中最难的事情。

例如,personId=1 的 Brown 小姐、documentId=1 和 documentId=2 的文档从 2005 年 1 月 1 日到 2010 年 2 月 2 日一直居住在 addressId=1 的地址,然后移动到 addressId=2从 2010 年 2 月 3 日到当前日期(NULL?),一直住在哪里。但她自 2006 年 4 月 5 日起将姓氏更改为格林夫人,并且自 2007 年 6 月 7 日以来,她的第一个 documentId=1 文档更改为 documentId=3。自 2010 年 2 月 3 日至今,personId=2、documentId=4 的 Black 先生一直居住在 addressId=1。

我们查询问题 2(其中 addressId=1,时间间隔是从 01/01/2000 到现在)的预期结果必须是:

行:

last_name="Brown", documentId=1, dateFrom=01/01/2005, dateTo=04/04/2006

last_name="Brown", documentId=2, dateFrom=01/01/2005, dateTo=04/04/2006

last_name="Green", documentId=1, dateFrom=04/05/2006, dateTo=06/06/2007

last_name="Green", documentId=2, dateFrom=04/05/2006, dateTo=06/06/2007

last_name="Green", documentId=2, dateFrom=06/07/2007, dateTo=02/01/2010

last_name="Green", documentId=3, dateFrom=06/07/2007, dateTo=02/01/2010

last_name="Black", documentId=4, dateFrom=02/03/2010, dateTo=NULL

我想用复合键(personId、documentId、addressId、dateFrom)创建事实表,但我不知道如何加载此表,然后使用此结构获得预期结果。

我会很高兴得到任何帮助!

【问题讨论】:

    标签: sql data-warehouse fact-table datahistory


    【解决方案1】:

    有趣的问题@Argnist!

    所以要为我的示例创建一些通用语言,你需要一个

    • DimPerson(PK=kcPerson,为唯一的 Persons=kPerson 推荐密钥,类型 2 昏暗)
    • DimDocument(PK=kcDocument,唯一 Documents=kDocument 的建议键,类型 2 dim)
    • DimAddress(PK=kcAddress,唯一地址的推荐键=kAddress,类型 2 暗淡)

    一位同事写了一篇关于使用两个代理键的简短博客来解释上述暗淡'Using Two Surrogate Keys on Dimensions'。

    我总是会添加 PK 格式为 yyyymmdd 的 DimDate 到任何具有额外属性列的数据仓库。

    那么你的事实表就是

    • FactHistory(FKs=kcPerson、kPerson、kcDocument、kDocument、kcPerson、kPerson、kDate) 加上任何其他措施。

    然后加入“kc”,您可以显示当前的人员/文档/地址维度信息。 如果您加入了“k”,则可以显示历史的人员/文档/地址维度信息。

    这样做的缺点是该事实表需要为每个人/文档/地址/日期组合提供一行。但它确实是一个非常窄的表,因为该表只有一些外键。

    这样做的好处是很容易查询您提出的各种问题。

    或者,您可以将事实表设置为

    • FactHistory(FKs=kcPerson、kPerson、kcDocument、kDocument、kcPerson、kPerson、kDateFrom、kDateTo) 加上任何其他措施。

    这显然更加紧凑,但查询变得更加复杂。您还可以在 Fact 表上放置一个视图,以便于查询!

    解决方案的选择取决于数据的变化频率。我怀疑它不会很快改变,所以事实表的替代设计可能会更好。

    希望对您有所帮助。

    【讨论】:

    • @Marcus D 谢谢。我认为类似,但在事实表中没有“k”键(我理解你的名字对吗?kcPerson - 用于识别一行的代理键,而 kPerson - 用于识别一个人的自然键?)。
    • 但是 FactHistory (FKs=kcPerson, kPerson, kcDocument, kDocument, kcAddress, kAddress, kDateFrom, kDateTo) 导致我们必须更新旧事实的 kDateTo - 我认为这不好。拥有一个 kDateFrom 可能会更好......还有一个问题。在 DimDocument 或 DimAddress 中键入 2 scd - 用于一个人的一组文档/地址或什么?
    • @Argnist。我们将使用两个整数代理键 kcPerson 和 kPerson。 kperson 将是指向唯一个人的代理键(无论名称更改/性别更改等),kcperson 将是指向该人的特定实例(他们的特定名称/性别等)的代理键。检查我包含的链接。我们不在事实表上保留自然键。总是代理键 - 更快,当您的业务用户想要更改自然键名称时也可以解决问题,但保留指向历史记录的链接(是的,我们已经发生了!)
    • @Argnist。关于您的第二条评论......更新事实表上的记录的问题令人恼火,但我看不出解决办法。使用我的任何一个事实表模型。
    • @Argnist。关于您第二条评论中的问题...为所有暗淡设置类型 2 可能没有意义,但从您的示例看来,您的文档可能会“更改”,因此您希望将更改存储在类型 2 暗淡中(也许文档的版本号?),同样适用于您的个人信息的更改。显然,如果我的理解不正确,则制作单独的暗淡(或暗淡类型 1 上的特定列)
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2016-12-30
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多