如何创建历史事实表?

12

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

  1. 人员 - 具有属性personId、dateFrom、dateTo和其他可变属性,例如姓氏、出生日期等 - 慢变维度

  2. 文档 - documentId、number、type

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

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

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

  1. 在指定日期,哪些人(带着哪些文档)住在指定的地址上?

2.在指定时间区间内,指定地址的居民历史记录如何呢?

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

例如,布朗小姐(personId = 1),携带documentId = 1和documentId = 2的文件,自2005年1月1日至2010年2月2日一直住在addressId = 1处,然后搬到了addressId = 2,自2010年2月3日起一直住在那里(NULL?)。但是自2006年4月5日以来,她已经改变了姓氏为格林夫人,并且她的第一个文档从documentId = 1变成了documentId = 3,自2007年6月7日以来。布莱克先生(personId = 2),documentId = 4,自2010年2月3日起一直住在addressId = 1处到现在。

我们查询问题2的期望结果是:addressId = 1,时间区间是从2000年1月1日至今,必须如下:

行:

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个回答

5

有趣的问题@Argnist!

所以为了创建一些通用语言来解释我的例子,您想要一个

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

一位同事已经写了一篇短文介绍了使用两个代理键来解释上述维度 'Using Two Surrogate Keys on Dimensions'。

我会在任何带有额外属性列的数据仓库中添加DimDate,其PK形式为yyyymmdd。

然后您将拥有以下事实表

  • FactHistory(FKs = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDate) 加上任何其他措施。
然后,通过连接“kc”可以显示当前的Person/Document/Address维度信息。如果连接“k”,则可以显示历史的Person/Document/Address维度信息。
这样做的缺点是事实表需要每个人/文档/地址/日期组合一行。但它确实是一个非常窄的表,因为该表只有一些外键。
优点是很容易查询你所问的问题类型。
或者,你可以将事实表设置为:
  • FactHistory(FKs=kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDateFrom,kDateTo),加上任何其他措施。
这显然更加紧凑,但查询变得更加复杂。你也可以在事实表上放置一个视图,以便更轻松地查询!
解决方案的选择取决于数据更改的频率。我怀疑它不会那么快地改变,因此事实表的备选设计可能更好。
希望对你有所帮助。

@Marcus D 谢谢。我理解的是类似的,但是在事实表中没有"k"键(我是否正确理解了你的命名?kcPerson - 用于标识行的代理键,kPerson - 用于标识一个人的自然键?)。 - Argnist
但是FactHistory(FKs = kcPerson,kPerson,kcDocument,kDocument,kcAddress,kAddress,kDateFrom,kDateTo)表明我们必须更新旧事实的kDateTo - 我认为这不好。也许最好只有一个kDateFrom...还有一个问题。在DimDocument或DimAddress中使用Type 2 scd - 是针对一个人的一组文档/地址还是什么? - Argnist
@Argnist。我们将使用两个整数代理键kcPerson和kPerson。kperson将是一个代理键,指向唯一的个体(无论姓名更改/性别更改等),kcperson将是一个代理键,指向该人的特定实例(他们的特定姓名/性别等)。请检查我包含的链接。我们不在事实表中保留自然键。总是使用代理键-速度更快,也可以解决当您的业务用户想要更改自然键名称但保留与历史记录的链接时出现的问题(是的,我们曾经遇到过这种情况!) - Marcus D
@Argnist。关于您的第二条评论...更新事实表记录的问题很烦人,但我看不到解决办法。对于我的任何一个事实表模型都是如此。 - Marcus D
@Argnist。关于你在第二个评论中的问题...也许对于所有维度都有类型2并不合理,但从你的例子中看来,你的文档可能会“改变”,因此你希望将更改存储在类型2维度中(也许是文档的版本号?),同样适用于你的个人信息更改。显然,如果我的理解是错误的,那么请创建单独的维度(或特定列在类型1维度上)。 - Marcus D
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接