事实表链接到缓慢变化的维度

时间:2015-01-27 18:23:11

标签: data-warehouse dimensional-modeling scd

我很难理解为数据仓库建模特定场景的最佳方法。

我有一个Person维度和一个Tenancy维度。一个人在任何时候都可以是0,1或(很少)多个租约,并且随着时间的推移往往会有一连串的租约。租赁可能有一个或多个人与之相关联。与租赁相关的人员可能会随着时间而改变,租约通常会持续很多年。

一个选项是将人员维度的租赁参考,开始和结束日期添加为类型2 SCD列。只要我忽略了一个人多个并发租约的可能性,这就行得很好。但是,我有数据仓库的其他区域,我面临类似的设计问题,忽略多重关系是不可能的。

另一种选择是将关系建模为累积快照事实表。我不确定这在实践中有多好,因为我只能将它链接到一个版本的Person和Tenancy(两个版本都有2型SCD列),这似乎无法生产将人员和租约联系在一起的当前或历史报告。

有没有推荐的方法来建模这种关系?

根据患者的回答和SQL.Injection提供的评论进行编辑

我已经生成了一个基本模型,显示了SQL.Injection所描述的模型。 Suggested model

我已将租约开始/结束日期移至“垃圾邮件”中。维度(Dim.Tenancy)并将人员租赁开始/结束日期添加到事实表中,因为我认为这是描述关系的更准确方式。

然而,现在我在视觉上看到它并不认为这与我开始使用的模型有任何不同,除了事实表是定期快照而不是累积快照。它肯定会遇到同样的缺陷,每当我在任何维度中更新类型2缓慢变化的属性时,它都不会反映在事实中。

为了使这项工作能够反映当前的变化并允许历史报告,每次在任何维度上发生SCD2更改时,我都必须向事实表添加一行。然后,为了防止通过加入同一实体的多个版本而导致过度计数,我还需要添加其他相关维度的新版本,以便我有新的加入密钥。

我需要多考虑一下。我开始认为数据库模型是正确的,并且我对如何使用模型的理解是错误的。

与此同时,欢迎任何意见或建议!

1 个答案:

答案 0 :(得分:1)

您的问题类似于sale transactions with multiple item。不同之处在于,交易通常包含多个项目,而您的租赁事实通常只有一个人(租户)。

你的九头蛇诞生是因为你试图将租赁作为一个维度进行建模,当你将它作为一个事实进行建模时。

我认为您有租赁维度的原因是因为某处您有实际租金。为了模拟事实租金,考虑使用上述相同的方法,如果两个人是同一财产的租户,则每个月应插入两个事实记录: 1)现在有了一些魔力(根本就没有魔法),将租金的价值除以租户数量并将其存储起来 2)存储租金的全部价值(你不知道数据科学家将如何使用数据) 3)检查1)与业务用户(我指的是建立风险模型的人);关于如何进行拆分可能会有一些先进的规则(当运输成本要划分到同一订单的多个项目行时会发生类似的事情 - 它可能不是均匀分布的)