对具有直接关系但在细节层而非维度层的事实表进行建模

Posted

技术标签:

【中文标题】对具有直接关系但在细节层而非维度层的事实表进行建模【英文标题】:Modeling Fact Tables that have direct relationships, but at a detail and not a dimension layer 【发布时间】:2017-04-05 16:50:39 【问题描述】:

这与我的问题非常相似。 http://forum.kimballgroup.com/t2534-modeling-fact-tables-that-have-direct-relationships-but-at-a-detail-and-not-a-dimension-layer

我有一个关于采购订单、供应商发票、付款、收据等的事实表。它们有一些共同的维度,而另一些则没有。问题是,例如,假设他们正在通过他们的 gl 帐户查看发票(使用连接到多维数据集的 excel 数据透视表),那么他们希望能够放入 PO 编号的列中,即 PO 的买方,等等。即使买家维度只与采购订单相关,而账户维度只与发票相关。但是他们说,好吧,PO是和发票有关的,所以你应该可以把它拉进去。

我确实在发票事实表上有一个 PO Ref 字段,但它只有 50% 的时间填写。即使是这样,您也可以在采购订单和发票之间以任何一种方式建立一对多的关系,至少据我所知。 无论如何,他们希望能够从任何度量组中引入任何度量,并且每个可能的维度都可以工作,然后能够深入到细节以查看采购订单、发票、付款和收据以及它们如何匹配.最佳实践是根据 Kimball 的说法,如果事实表是不同的粒度,则将它们分开,但是所有的业务问题都不能通过这种方式解决。

我能想到的唯一解决方案是:

    在加载时将一堆与细节相关的列添加到退化维度。即添加 PO 到发票和发票到 PO 等,但是当它是多对一时,在该列中将其作为逗号分隔的列表。 与每个事实和维度表创建每个可能的关系。不过,这将是一项繁重的工作,而且有些可能仍然与某些维度无关。 创建一个巨大的事实表,将所有当前的事实表连接在一起,并以某种方式找出逻辑,只为多对一连接显示一次度量值。

    这可能是个坏主意,但我想也许我可以在每个度量值组和相应的退化维度参考字段之间建立关系。比如在供应商发票退化维度 PO Ref 字段和采购订单行度量组 PO 字段之间创建关系。

    降低他们的期望,哈哈。

这是维度使用选项卡的屏幕截图,可让您了解当前的外观。

【问题讨论】:

【参考方案1】:

我曾经尝试过选项 3。表演很糟糕。输出具有误导性。再也不会了。

您最好的选择是与企业合作。如果数据不容易获得(例如没有采购订单的发票),则同意应该做什么。您可以显示默认值(PO 未记录在发票上)。您可以就 ETL 中实现的逻辑达成一致,该逻辑提取最可能的 PO。

无论您选择哪种方法,都必须进行讨论。如果您不这样做,企业将根据错误的假设做出决定。企业会发现自己正在查看它不理解的报告。您必须帮助您的用户避免这些结果。

方法一旦达成一致,就记录下来。出现疑问时,请共享文档。确保文档突出显示所有计算、困难和缺失的源数据。

与生成源日期的团队合作。如果重要领域人烟稀少,请安排会议。看看是否可以改进捕获过程。让您的用户知道您正在调查该领域。让他们知道结果。如果无法改进源数据(在没有采购订单的情况下继续开具发票),请告知您的用户原因。

管理您的客户可能具有挑战性。尤其是那些在公司担任高级职位的人。透明和可靠的文档将为您提供帮助。

【讨论】:

感谢您的反馈。有助于知道不要选择选项 3。关于让企业记录所有关系,我得出了类似的结论。我要做一个总线矩阵,让企业填写它,并使用它创建尽可能多的缺失维度和事实关系。让 BA 在技术上写下这些之间的关系。所以,基本上是选项2。很多工作,但它会解决很多。完成后,如果他们仍然不满意,也许可以在细节级别与桥接表找出一些多对多关系。但希望不会。

以上是关于对具有直接关系但在细节层而非维度层的事实表进行建模的主要内容,如果未能解决你的问题,请参考以下文章

如何对链接到具有不同粒度级别的多个事实的维度表进行建模?

对两个事实表之间的关系建模

如何使用不同谷物的事实表对日期维度进行建模

20190424 数据仓库 维度建模

如何在维度模式中建模父子关系表

将一个维度加入具有不同粒度的多个事实表