我正在为VoIP服务创建一个关于“呼叫记录系统”的维度模型。我将举一个小例子来说明我的问题。
假设我有一个事实,表示一个呼叫。我有一个维度叫做Client,还有一个叫做Provider的维度。(假装还有其他维度,比如日期,等等)
(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider有了这个功能,我就可以看到一个客户端打了多少次电话,或者有多少电话是通过提供者发送的,以及其他问题。
让我们假设一个客户机与一个提供程序相关联,而一个提供程序可以拥有多个客户端。
所以,问题来了。如何创建这样的查询:每个提供程序都有哪些客户端?
这似乎是一个在两个维度之间的查询。我不能涉及到这个事实,因为如果一个客户从未使用过该服务,他就不会出现在calls事实表上,而且他也不会使用这个“每个提供者”的查询。
我当时在想,要做到这一点,一种方法就是创建一个角色扮演维度,一个客户端维度的视图,并将其直接添加到提供者维度,这样就可以执行这样的查询。会是这样的:
(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider <--- (Dimension)View Client当然,使用这种方法,用户必须非常小心地避免在事实表中使用此View客户端维度,因为它会重复事实行。
那么,这是我需要使用著名的无事实事实表的情况之一吗?
怎么做才是对的呢?
谢谢!
发布于 2012-06-18 13:06:17
当您“回收”要在同一事实表中多次使用的维度(即呼叫日期、服务日期等)时,应使用角色扮演维度。
听起来这不是你要找的。相反,如果这种关系确实是一对多的,那么我只需要在客户端维度上直接添加提供者ID (不需要视图或任何东西),这样就可以认识到这种关系与事实无关。
本质上,当涉及到这类查询时,可以将"provider“看作是客户端被雪片覆盖的属性。
但是,听起来您可能希望确保客户端和提供者之间没有多少关系(客户端可以使用多个提供者,提供者可以有多个客户端)。一个多对多的关系在维度上被建模为一个事实表。事实表可以是当前时间点的快照,有历史记录,也可以没有历史记录。只需要两列,Client和Provider。如果您想在某个时间段内保存客户/提供者关系的记录,只需添加一个日期标记即可。
请注意,一个没有事实根据的事实也可以用来建模一对多的关系(如果模型在后端发生变化,您的ETL就已经完成了。)
https://stackoverflow.com/questions/11039706
复制相似问题