1

我正在努力理解为数据仓库建模特定场景的最佳方法。

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

一种选择是将租赁参考、开始和结束日期作为类型 2 SCD 列添加到人员维度。只要我忽略一个人有多个并发租约的可能性,这将很有效。但是,我在数据仓库的其他领域也面临类似的设计问题,并且不可能忽略多个关系。

另一种选择是将关系建模为累积快照事实表。我不确定这在实践中的效果如何,因为我只能将其链接到 Person 和 Tenancy 的一个版本(两者都将具有 2 类 SCD 列),这似乎使得无法生成当前或将人和租户联系在一起的历史报告。

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

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

我制作了一个基本模型,显示了 SQL.Injection 所描述的模型。 推荐型号

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

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

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

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

在此期间,欢迎提出任何意见或建议!

4

1 回答 1

1

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

您的 hydra 诞生是因为您试图将租赁建模为一个维度,而您应该将其建模为事实。

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

于 2015-01-29T10:25:06.523 回答