当前位置: 首页 > 面试题库 >

如何创建历史事实表?

融伯寅
2023-03-14
问题内容

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

  1. 人员 -具有personId,dateFrom,dateTo等属性,可以更改的其他属性(例如,姓氏,生日)等-尺寸变化缓慢

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

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

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

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

  1. 哪些人在规定的日期住在规定的地址,并携带哪些文件?

2,规定的地址在规定的时间间隔内有哪些居民历史记录?

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

例如,从2005年1月1日到2010年2月2日,布朗小姐的personId = 1,documentId = 1和documentId =
2的文档一直住在addressId = 1的地址,然后移到addressId =
2自2010年3月2日至今居住日期(NULL?)。但是她从2006年5月4日起将姓氏更改为Green女士,从2007年7月7日起将她的第一个文档以documentId
= 1更改为documentId = 3。自2010年3月2日至今,Black先生的personId = 2,documentId =
4一直居住在addressId = 1。

我们对问题2(地址ID = 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)创建事实表的想法,但是我不知道如何加载该表,然后通过这种结构获得预期的结果。

我将很高兴为您提供任何帮助!


问题答案:

有趣的问题@Argnist!

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

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

一位同事写了一个简短的博客,介绍了两个代理键的用法,以解释上述暗淡的“在维上使用两个代理键”。

我将始终以yyyymmdd的形式将带有PK的DimDate添加到具有额外属性列的任何数据仓库中。

然后,您将事实表作为

  • FactHistory(FK = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDate)以及任何其他度量。

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

不利的一面是,对于每个人/文档/地址/日期组合,此事实表需要一行。但这实际上是一个非常狭窄的表,因为该表仅具有许多外键。

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

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

  • FactHistory(FKs = kcPerson,kPerson,kcDocument,kDocument,kcPerson,kPerson,kDateFrom,kDateTo)以及任何其他度量。

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

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

希望能有所帮助。



 类似资料:
  • 我试图创建一个触发器,将新插入和/或更新的记录从一个表复制到该表的历史版本。其目的是在每次插入和/或更新表中的记录时保留一条记录。 这是我拥有的创建触发器语句语法,遵循IBMDb2触发器站点。 我收到的错误是: [代码:-104,SQL状态: 42601]在N.LIFECYCLE_STATUS)之后发现了一个意外的令牌END-OF-STATEMENT。预期的令牌可能包括:""... SQLCODE

  • 我正在开发一个用PHP和javascript编写的web应用程序。在这个应用程序中,我们将一些事件存储在自己的数据库中。 现在,我们要做的是,每当我们在应用程序中创建一个新事件时,它都应该在当前登录用户的谷歌日历的谷歌日历上创建一个重复的事件。 我们可以要求我们的用户从他们的谷歌控制台生成一个API密钥。 有没有办法创建一个谷歌日历事件通过使用一个API密钥,而没有任何其他配置。 谢谢

  • 读取合约的历史事件。 调用: myContract.getPastEvents(event[, options][, callback]) 参数: event - String: 事件名,或者使用 "allEvents" 来读取所有的事件 options - Object: 用于部署的选项,包含以下字段: filter - Object : 可选,按索引参数过滤事件,例如 {filter: {m

  • 我从快速入门开始(https://developers.google.com/google-apps/calendar/quickstart/python)而且效果很好。然后我尝试用这个指南插入事件(https://developers.google.com/google-apps/calendar/create-events)。我将此代码添加到quickstart的代码中,但出现错误。如何查看我

  • 问题内容: 我最近更新了我的一个哈德逊版本的配置。生成历史记录不同步。有什么方法可以清除我的构建历史记录? 谢谢,麻烦您了 问题答案: 如果单击“从磁盘管理Hudson /重新加载配置”,Hudson将重新加载所有构建历史记录数据。 如果磁盘上的数据混乱,则需要转到%HUDSON_HOME%\ jobs \ < projectname 目录,并按预期方式还原构建目录。然后重新加载配置数据。 如果仅

  • 历史 本书改编和包含了以下两本书的部分章节,这两本书均以GNU Free Documentation License发布。 How To Think Like A Computer Scientist: Learning with C++ 作者Allen B. Downey。原书由Green Tea Press发行,可以从http://www.greenteapress.com/下载到。 Prog