首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >维度建模--无事实的查询

维度建模--无事实的查询
EN

Stack Overflow用户
提问于 2012-06-14 19:04:06
回答 1查看 817关注 0票数 2

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

假设我有一个事实,表示一个呼叫。我有一个维度叫做Client,还有一个叫做Provider的维度。(假装还有其他维度,比如日期,等等)

代码语言:javascript
复制
(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider

有了这个功能,我就可以看到一个客户端打了多少次电话,或者有多少电话是通过提供者发送的,以及其他问题。

让我们假设一个客户机与一个提供程序相关联,而一个提供程序可以拥有多个客户端。

所以,问题来了。如何创建这样的查询:每个提供程序都有哪些客户端?

这似乎是一个在两个维度之间的查询。我不能涉及到这个事实,因为如果一个客户从未使用过该服务,他就不会出现在calls事实表上,而且他也不会使用这个“每个提供者”的查询。

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

代码语言:javascript
复制
(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider <--- (Dimension)View Client

当然,使用这种方法,用户必须非常小心地避免在事实表中使用此View客户端维度,因为它会重复事实行。

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

怎么做才是对的呢?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-06-18 13:06:17

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

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

本质上,当涉及到这类查询时,可以将"provider“看作是客户端被雪片覆盖的属性。

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

请注意,一个没有事实根据的事实也可以用来建模一对多的关系(如果模型在后端发生变化,您的ETL就已经完成了。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11039706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档