【问题标题】:Dimensional Modeling - Queries without facts维度建模 - 没有事实的查询
【发布时间】:2012-06-17 21:01:48
【问题描述】:

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

假设我有一个表示单个调用的事实。我有一个维度叫做客户端,还有一个维度叫做提供者。 (假装还有其他维度,当然是日期等等……)

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

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

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

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: data-warehouse dimensional-modeling


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多