2011-05-21 56 views
9

我有一些实体在我的数据仓库:如何创建历史事实表?

  1. - 带有属性PERSONID,dateFrom,dateTo,和其他那些可以改变的,例如最后的姓名,出生日期等等 - 渐变维度

  2. 文档 - documentId,数量,类型

  3. 地址 - addressId,城市,街道,房屋,平

(人与文档)之间的关系是一对多和(人与地址)是多对多关系。

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

  1. 什么人用什么证件住在上定义的日期定义的地址?

2,什么历史的居民确定的地址定义了时间间隔?

这不仅是为了什么DW设计,但我认为这是在数据仓库的设计最难的事情。

例如,personId = 1的布朗小姐,documentId = 1和documentId = 2的文档自2005年1月1日至2010年2月2日期间住址为addressId = 1,然后移至addressId = 2自02/03/2010至今的日期(NULL?)。但她自2006年5月5日起将姓氏改为格林太太,并自2007年7月6日起将她的第一份文件与documentId = 1改为documentId = 3。 BlackId的personId = 2,documentId = 4自从02/03/2010至当前日期以来一直住在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),但我不知道如何加载此表,然后得到这个结构预期的结果。

我会很乐意为您提供帮助!

回答

3

有趣的问题@Argnist!

所以要创造一些共同语言为我的例子,你想有一个

  • DimPerson(独特的人PK = kcPerson,suggorate键= kPerson,2型DIM)
  • DimDocument(PK = kcDocument,为唯一的文档suggorate键= kDocument,2型暗淡)
  • DimAddress(PK = kcAddress,用于唯一地址suggorate键= kAddress,2型暗淡)

甲同事已经写在吨短博客他使用两个代理键来解释上述dims'Using Two Surrogate Keys on Dimensions'。

我总是将 DimDate添加到带有额外属性列的任何数据仓库中,格式为yyyymmdd 。

那么你将有你的事实表作为

  • FactHistory(FKS = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDate) 加任何aditional的措施。

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

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

这样做的好处是它很容易查询的种种你问的问题。

或者,你可以有你的事实表作为

  • FactHistory(FKS = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDateFrom,kDateTo) 加任何aditional的措施。

这显然是更紧凑,但查询变得更加复杂。您还可以在Fact表上查看,以便查询!

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

希望有所帮助。

+0

@Marcus d谢谢。我认为类似但实际上没有“k”键(我是否理解你的名字是否正确?kcPerson - 用于识别行的替代键,kPerson - 识别一个人的自然键?)。我们必须更新旧事实kDateTo – Argnist 2011-05-29 10:20:06

+0

但FactHistory(FKS = kcPerson,kPerson,kcDocument,kDocument,kcAddress,kAddress,kDateFrom,kDateTo)收益率 - 这是不好的我想。可能会更好有一个kDateFrom ...还有一个问题。在DimDocument或DimAddress中键入2 scd - 用于设置一个人的文档/地址或什么? – Argnist 2011-05-29 10:32:47

+0

@设计师。我们将使用两个整数替代键kcPerson和kPerson。kperson将是一个指向独特个体的代理键(不管姓名变化/性别变化等),kcperson将是代表该人的具体实例(他们的具体姓名/性别等)的代理键。检查我包括的链接。我们不保留事实表上的自然键。总是用代理键 - 快得多,当你的商业用户想要改变自然键名,但保留一个链接到历史记录(是的,我们已经发生了!),也解决了这个问题 – 2011-05-31 09:43:03