如何创建历史事实表?

时间:2011-05-21 07:54:08

标签: sql data-warehouse fact-table datahistory

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

  1. - 具有属性personId,dateFrom,dateTo等可以更改的属性,例如姓氏,出生日期等 - 慢慢变化的维度

  2. 文档 - documentId,number,type

  3. 地址 - addressId,city,street,house,flat

  4. (人与文件)之间的关系是一对多,(人与地址)是多对多的。

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

    1. 哪些人在规定的日期住在指定地址?
    2. 2,居民的定义地址在规定的时间间隔内有什么历史记录?

      这不仅适用于DW的设计,但我认为这是DW设计中最难的事情。

      例如,布朗小姐的personId = 1,自01/01/2005至02/02/2010以来,documentId = 1且documentId = 2的文件已经居住在addressId = 1的地址,然后转移到addressId = 2从2010年2月2日开始到现在的日期(NULL?)。但她自2006年5月4日起将姓氏改为格林夫人,自2007年7月6日起,她的第一份文件记录为documentId = 1至documentId = 3。带有personId = 2的Bl​​ack先生,自2010年2月2日至今日,documentId = 4一直居住在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)创建事实表,但我不知道如何加载此表,然后使用此结构获得预期结果。

      我很乐意为您提供帮助!

1 个答案:

答案 0 :(得分:3)

有趣的问题@Argnist!

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

  • DimPerson(PK = kcPerson,独特人物的关键词= kPerson,2型昏暗)
  • DimDocument(PK = kcDocument,uniquegorate key for unique Documents = kDocument,type 2 dim)
  • DimAddress(PK = kcAddress,唯一地址的suggorate键= kAddress,类型2昏暗)

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

我会一直补充 DyDate与PK形式为yyyymmdd 到任何具有额外属性列的数据仓库。

然后你会把你的事实表作为

  • FactHistory(FKs = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDate) 加上任何附加措施。

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

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

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

或者,您可以将事实表格作为

  • FactHistory(FKs = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDateFrom,kDateTo) 加上任何附加措施。

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

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

希望有所帮助。