维度建模 - 没有事实的查询

时间:2012-06-14 19:04:07

标签: data-warehouse dimensional-modeling

我正在为VoIP服务创建一个关于“呼叫记录系统”的维度模型。 我将举一个例子展示我的问题。

假设我有一个表示单个呼叫的事实。我有一个名为Client的维度,另一个名为Provider。 (假装还有其他方面,比如日期,等等......)

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

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

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

所以,问题来了。我可以创建一个类似的查询:每个提供商有哪些客户?

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

我在想自己,做到这一点的一种方法是创建一个角色扮演维度,一个Client维度的视图,并将其直接添加到Provider维度,只是为了做这样的查询。它会是这样的:

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

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

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

这是正确的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

基本上,当涉及到这种类型的查询时,将“提供者”视为仅仅是客户端的属性。

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

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