2012-06-14 91 views
2

我正在为VoIP服务创建关于“呼叫记录系统”的维度模型。 我将举例说明一个小例子来展示我的问题。尺寸建模 - 无事实查询

假设我有一个事实表示一次调用。我有一个叫做Client的维度,另一个叫做Provider。 (假装有其他尺寸,当然一样的日期,等..)

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

有了这个,我就可以看到有多少调用客户端做了,或有多少电话是通过发送提供者和其他问题。

而且让我们假设一个客户端与一个提供者关联,并且一个提供者可以拥有多个客户端。

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

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

我一直在想,要做到这一点的一种方法是创建一个角色扮演维度,一个客户维度的视图,并将其直接添加到提供者维度,以便执行像这样的查询。这将是这样的:

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

当然,使用这种方法,用户必须非常小心,以不使用与事实表这个View Client的尺寸,因为它会重复的事实行。

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

什么是正确的方法来做到这一点?

谢谢!

回答

1

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

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

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

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

请注意,一个没有事实的事实也可以模拟一对多关系(如果模型在后端更改,您的ETL已经完成..)