gpt4 book ai didi

sql - 如何创建历史事实表?

转载 作者:行者123 更新时间:2023-12-04 02:23:43 24 4
gpt4 key购买 nike

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

  • - 具有 personId、dateFrom、dateTo 和其他可以更改的属性,例如姓氏,出生日期等-缓慢变化的维度
  • 文档 - 文档 ID、编号、类型
  • 地址 - addressId, city, street, house, flat

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

    我的目标是创建可以回答我们以下问题的历史事实表:
  • 哪些人在规定的日期住在规定的地址?

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

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

    例如,personId=1 的布朗小姐,documentId=1 和 documentId=2 的文档从 01/01/2005 到 02/02/2010 一直住在 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)创建事实表,但我不知道如何加载这个表,然后用这个结构得到预期的结果。

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

    最佳答案

    有趣的问题@Argnist!

    因此,要为我的示例创建一些通用语言,您需要一个

  • DimPerson(PK=kcPerson,唯一人员的支持键=kPerson,类型 2 暗)
  • DimDocument(PK=kcDocument,唯一文档的支持键=kDocument,类型 2 dim)
  • DimAddress(PK=kcAddress,唯一地址的支持键=kAddress,类型 2 dim)

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

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

    然后你就会有你的事实表
  • FactHistory (FKs=kcPerson, kPerson, kcDocument, kDocument, kcPerson, kPerson, kDate)
    加上任何额外的措施。

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

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

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

    或者,您可以将事实表作为
  • FactHistory (FKs=kcPerson, kPerson, kcDocument, kDocument, kcPerson, kPerson, kDateFrom, kDateTo)
    加上任何额外的措施。

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

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

    希望有帮助。

    关于sql - 如何创建历史事实表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6080409/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com