2

我正在为 VoIP 服务创建一个关于“通话记录系统”的维度模型。我将仅举一个小例子来说明我的问题。

假设我有一个代表单个呼叫的事实。我有一个维度叫做客户端,还有一个维度叫做提供者。(假设还有其他维度,例如日期,当然等等......)

(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider

有了这个,我将能够看到客户打了多少电话,或者通过提供商发送了多少电话,以及其他问题。

假设一个客户端与一个提供者相关联,一个提供者可以有多个客户端。

那么,问题来了。如何创建一个查询,例如:每个提供商有哪些客户?

这似乎是一个介于两个维度之间的查询。我不能涉及这个事实,因为如果客户从未使用过该服务,他将不会出现在调用事实表中,并且他不会出现在这个“每个提供商的客户”查询中。

我自己在想,一种方法是创建一个角色扮演维度,一个客户端维度的视图,并将其直接添加到提供者维度,只是为了进行这样的查询。它会是这样的:

(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider <--- (Dimension)View Client

当然,使用这种方法,用户必须非常小心不要将此 View Client 维度与事实表一起使用,因为它会重复事实行。

那么,这是我需要使用著名的无事实事实表的情况之一吗?

这样做的正确方法是什么?

谢谢!

4

1 回答 1

1

当您“回收”要在同一个事实表中多次使用的维度(即调用日期、服务日期等)时,应该使用角色扮演维度。

听起来这不是你要找的。相反,如果关系确实是一对多的,那么我将直接在客户端维度上添加提供者 ID(不需要视图或任何东西),并认识到这种关系与事实无关。

从本质上讲,当涉及到这种查询时,将“提供者”视为客户端的一个属性。

但是,听起来您可能希望确保客户端和提供者之间没有多对多关系(客户端可以使用多个提供者,并且提供者可以有多个客户端)。多对多关系在维度建模为事实表。您的事实表可以是当前时间点的快照,有或没有历史。只需要两列,Client并且Provider. 如果您想在某个时间范围内记录客户/提供商关系,您只需添加一个日期戳。

请注意,一个无事实的事实也可以用来模拟一对多关系(如果模型在后端发生变化,那么您的 ETL 已经完成......)

于 2012-06-18T13:06:17.040 回答