如何创建历史事实表?

2024-04-09

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

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

  2. Document- 文档 ID、编号、类型

  3. Address- 地址 ID、城市、街道、房屋、公寓

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

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

  1. 哪些人持有哪些文件,在规定的日期居住在规定的地址?

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

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

例如,personId=1 的 Brown 小姐,documentId=1 和 documentId=2 的文档自 2005 年 1 月 1 日到 2010 年 2 月 2 日一直居住在 addressId=1 的地址,然后移至 addressId=2,该地址已从 2010 年 2 月 3 日到当前日期(NULL?)。但自 2006 年 4 月 5 日起,她已将姓氏更改为 Green 夫人,自 2007 年 6 月 7 日起,她将第一份文档的 documentId=1 更改为 documentId=3。 personId=2、documentId=4 的 Black 先生自 2010 年 2 月 3 日至今一直居住在 addressId=1。

对于问题 2(其中 addressId=1,时间间隔是从 01/01/2000 到现在)的查询的预期结果必须类似于:

Rows:

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,唯一 Person=Person 的代理键,类型 2 暗淡)
  • DimDocument(PK=kcDocument,唯一 Documents=kDocument 的建议键,类型 2 暗淡)
  • DimAddress(PK=kcAddress,唯一地址的suggorate key=kAddress,类型 2 暗淡)

一位同事写了一篇关于使用两个代理键来解释上述暗淡的简短博客'在尺寸上使用两个代理键 http://www.consolidata.co.uk/SQL-blog/2008/07/using-2-surrogate-keys-on-dime.html'.

我总是会添加 DimDate,PK 格式为 yyyymmdd 任何具有额外属性列的数据仓库。

那么你的事实表将是

  • FactHistory(FKs=kcPerson、kPerson、kcDocument、kDocument、kcPerson、kPerson、kDate) 加上任何其他措施。

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

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

这样做的优点是很容易查询您所问的各种问题。

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

  • FactHistory(FKs=kcPerson、kPerson、kcDocument、kDocument、kcPerson、kPerson、kDateFrom、kDateTo) 加上任何其他措施。

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

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

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建历史事实表? 的相关文章

随机推荐

  • Linux内核将写入管道的数据保存在哪里

    假设有以下简单代码 include
  • 包含任何文本的元素的量角器预期条件

    有没有办法检查元素中是否有任何文本 我已经找到了textToBePresentInElement但此函数会检查指定值 如果失败则不会返回正确的错误 我通过 API 填充该元素 并且稍后加载它 因此我希望浏览器等到元素中出现任何信息 然后检查
  • 如何通过 Xml 属性重命名类名?

    假设我有一个名为的 XML 可序列化类Song Serializable class Song public string Artist public string SongTitle 为了节省空间 也半混淆XML 文件 我决定重命名 xm
  • 导入pfx时无法导入以下密钥文件错误

    我在 stackoverflow 上彻底研究了这个问题 我看到了很多答案 但没有一个对我们有用 我们最近从 comodo 购买了一个代码签名证书 我们将使用它来签署我们的 c WPF net4 应用程序 我们已按照以下说明进行操作 然后在
  • 是否可以调试在 jni4net 中运行的 Java 程序?

    我目前正在使用 Java 库jni4net http jni4net com 在 IIS Express 上运行的 C 应用程序中 Java 库抛出异常 是否可以附加调试器来调试 Java 代码 Attempt 我尝试按照 提供的说明将以下
  • Ehcache避免将敏感数据存储到磁盘?

    我们希望使用 Ehcache 缓存不应该存储到磁盘的敏感数据 数据只能驻留在主内存中 这种数据存储在磁盘上是非法的 因此需要谨慎对待 我们已经在使用 Ehcache 无论是否带有陶土 来实现常见的缓存目的 我知道 Ehcache 提供了在主
  • Xcode 8 警告:“__textcoal_nt”部分已弃用

    我最近在 el cap 上更新到了 Xcode 8 今天早些时候我做了一个 xcode select install 还运行了brew来安装几个命令 我还更新了 Podfile 然后启动了 Xcode 8 直到现在我还没有为我正在处理的特定
  • 删除 Symfony2 表单中的表单命名空间(针对 REST API)

    我正在使用 Symfony2 设计 REST API 对于 POST 和 PUT 请求 我使用 FormType 就像是 class EmailType extends AbstractType public function buildF
  • SwiftUI 文本动画不透明度不起作用

    问题很简单 我到底如何才能获得Text正确设置动画 struct ContentView View State var foozle String var body some View VStack Spacer Text self foo
  • Java:加载重构后保存在硬盘上的对象=>“找不到类”异常:/

    我正在用java开发一个应用程序 它使用这个简单的方法定期将对象保存到硬盘上 public void save String filename try FileOutputStream fos new FileOutputStream fi
  • 在代码中重新加载反应本机应用程序

    我的用例是在单击按钮时重新加载应用程序 以便在单击后可以重新定义许多属性 有没有一种方法可以通过代码重新加载 React Native 应用程序 Thanks 这是一个巨大的解决方法 但它节省了大量时间 并避免了因摇晃不正确而带来的挫败感
  • 无法找到 WAMP 64 / Openssl Ordinal 372

    我正在尝试生成 SSL 证书 但我在这样做时遇到了这个错误 The 序数 372无法定位动态链接库 C wamp64 bin apache apache2 4 7 bin openssl exe 我已经搜索了一段时间 但解决方案不够详细 我
  • PKCS11异常:CKR_KEY_FUNCTION_NOT_PERMITTED

    你看 我有一个小程序 可以根据RSA在 pkcs11 令牌中找到的私钥 在巴西 现在有一些包含 2048 位私钥的新证书 也有常规 1024 位的旧型号 到目前为止 我的应用程序运行良好 我使用的是 1024 位证书 所以不用担心 但现在我
  • 使用 !== 或 != 将 Julia 变量与 `nothing` 进行比较

    在一些 Julia 代码中 何时可以看到条件表达式 例如 if val nothing dosomething end where val是一个类型变量Union Int Nothing 条件有什么区别val nothing and val
  • 返回布尔值和字符串值的最佳实践是什么

    我创建了一个方法 该方法对 XML 层次结构执行一些验证 该层次结构是在运行时由 Javascript 文本中的另一个类动态生成的 我的方法当前返回 True 或 False 这对使用我的类的任何人都有帮助 但我还想返回更多信息 因为可能有
  • CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入

    我正在尝试编写一个使用CreateRemoteThread注入一个dll 问题是 CreateRemoteThread 拒绝工作 GetLastError 返回 5 即 ERROR ACCESS DENIED 我不明白为什么 我正在根据这个
  • SNMP 错误,端口已在使用中

    我创建了一个 SNMP 代理模拟器应用程序 它对模拟设备使用端口号 161 有时会出现端口已使用异常 如何知道161端口是否繁忙 只需启动您的应用程序即可 如果它收到 BindException 则该端口正在使用中 如果没有 您的应用程序可
  • 如何在设定时间后关闭 ProgressDialog?

    我试图在 3 秒后自动关闭 ProgressDialog 框 这是对话框 ProgressDialog progress new ProgressDialog this progress setTitle Connecting progre
  • 如何在C#中通过解析Xml创建表达式树?

    我希望通过使用 C 解析 xml 来创建表达式树 xml 如下所示
  • 如何创建历史事实表?

    我的数据仓库中有一些实体 Person 具有 personId dateFrom dateTo 和其他可以更改的属性 例如姓氏 出生日期等 缓慢变化的维度 Document 文档 ID 编号 类型 Address 地址 ID 城市 街道 房