首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Datamart中的时变属性。

处理Datamart中的时变属性。
EN

Database Administration用户
提问于 2011-11-30 18:18:02
回答 3查看 1.5K关注 0票数 3

我已经浏览了整个网站列表,这是我认为最好的匹配。这并不是真正的数据库管理,更像是数据库设计。请原谅,并指给我正确的网站。

我正在为基本的BI系统设计一个数据库。此刻,我碰到了一道墙,那就是(用虚拟数据解释):

假设我的事实表包含以下信息:

代码语言:javascript
复制
John Doe flew from LAX to ATL on 1 Nov in flight AB-123

维度及其属性如下:

  • 传单-名称,俱乐部
  • 机场-城市,代码
  • 日期-年份、月份、日期
  • 航班代码,std,延迟,价格

现在,我可以很容易地生成这样的报告:

代码语言:javascript
复制
Airport --> LAX  DFW  ORD  ATL Total
Gold         50   40   10   25   125
Silver      240  300   95  140   775
Bronze     1000 1500  800 1800  5100
Total      1290 1840  905 1965  6000

使用如下查询:

代码语言:javascript
复制
select fd.club, ad.code, count(f1.id) from flyer fd, airport ad, fact1 f1
where fd.id = f1.fid and ad.id = f1.aid and month(f1.date) = 10
group by f1.club, ad.code;

但我的问题来自这样一个事实,那就是飞行员的“俱乐部”地位是一个令人感动的目标。今天在金边的传单可能是十月的银牌,所以我把他算在不正确的组里。因此,我想我需要这样一个单独的事实表:

代码语言:javascript
复制
 John Doe entered Bronze club on 8/15
 John Doe entered Silver club on 10/20
 ...

“俱乐部”作为原始传单维度的属性而退出。相反,一个新的俱乐部维度出现了。

然后,为了生成我需要的报告,我加入了这两个事实表。

我在正确的轨道上吗?或者有其他更简单的解决方案吗?我能想到的另一种选择是把俱乐部包括在原始的事实表中,在ETL过程中处理它。所以事实是:

代码语言:javascript
复制
John Doe of Silver Club flew from LAX to ATL on 1 Nov in flight AB-123

请告诉我哪种方法更好,或者是否有第三种方法。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2011-12-01 10:04:13

实现这一目标的方法是Kimball所称的类型-2或类型-6缓慢变化的尺寸.。本质上,类型-2 SCD有一个合成的维度键,以及一个由底层实体的自然键(在本例中是传单)和“生效日期”组成的唯一键。合成键是根据事实表连接的,因此您可以使用简单的equi(即,您不必在查询中按日期范围筛选)来附加它。

所有的属性(例如,俱乐部在本例中)都是传单的属性。如果其中一个属性发生更改,则在记录新状态的维度上创建一个新行,自更改日期起生效。

类型-6类似于普通的类型2,但与行的当前版本有一个自联接。每当为给定的自然键创建新行时,该自然键的所有行都会使用自联接更新到当前行。您可能需要也可能不需要此功能。

您可以通过将事实表与记录在其上的行连接起来来查询as-at状态,即当前状态。如果您的类型为-6,则可以通过自联接查询当前状态,如果需要,还可以在事实表上实现该状态。

这些数据还可以很好地处理特殊的报告工具和多维数据集,尽管在缓慢变化的维度上实现复杂的多维数据集是有点麻烦的(随着时间的推移,您需要为层次结构级别和组合的自然键保留占位符)。

一个好的起点是谷歌在“2型缓慢变化的尺寸”上的搜索。

票数 2
EN

Database Administration用户

发布于 2011-11-30 18:48:05

我会留一张单独的桌子

FlyerName, FlyerClub, StartDate, EndDate

通过这种方式,你可以跟踪随着时间的变化,并可以知道在任何给定的时间点,谁是俱乐部的人。

目前的记录将有一个EndDate of NULL

票数 1
EN

Database Administration用户

发布于 2011-12-01 00:41:14

在datamart中,需要对事实表的时变属性进行去denormalize。

您的事务性源数据库将在传单表上包含传单的俱乐部级别,或者可能在JNK建议的与传单相关的日期历史表中。

在你的数据中,你需要将每个特定传单的当前俱乐部级别应用于将传单、航班、日期等汇集在一起的事实记录。

在你的例子中,俱乐部是传单的一个时变属性,但是你感兴趣的事实是飞行和飞行的结合。因此,您需要在航班事务(事实表)上记录FlyerClub。只要你在飞行途中不让传单改变俱乐部,这个方法就能奏效。

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

https://dba.stackexchange.com/questions/8606

复制
相关文章

相似问题

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