我已经浏览了整个网站列表,这是我认为最好的匹配。这并不是真正的数据库管理,更像是数据库设计。请原谅,并指给我正确的网站。
我正在为基本的BI系统设计一个数据库。此刻,我碰到了一道墙,那就是(用虚拟数据解释):
假设我的事实表包含以下信息:
John Doe flew from LAX to ATL on 1 Nov in flight AB-123维度及其属性如下:
现在,我可以很容易地生成这样的报告:
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使用如下查询:
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;但我的问题来自这样一个事实,那就是飞行员的“俱乐部”地位是一个令人感动的目标。今天在金边的传单可能是十月的银牌,所以我把他算在不正确的组里。因此,我想我需要这样一个单独的事实表:
John Doe entered Bronze club on 8/15
John Doe entered Silver club on 10/20
...“俱乐部”作为原始传单维度的属性而退出。相反,一个新的俱乐部维度出现了。
然后,为了生成我需要的报告,我加入了这两个事实表。
我在正确的轨道上吗?或者有其他更简单的解决方案吗?我能想到的另一种选择是把俱乐部包括在原始的事实表中,在ETL过程中处理它。所以事实是:
John Doe of Silver Club flew from LAX to ATL on 1 Nov in flight AB-123请告诉我哪种方法更好,或者是否有第三种方法。
发布于 2011-12-01 10:04:13
实现这一目标的方法是Kimball所称的类型-2或类型-6缓慢变化的尺寸.。本质上,类型-2 SCD有一个合成的维度键,以及一个由底层实体的自然键(在本例中是传单)和“生效日期”组成的唯一键。合成键是根据事实表连接的,因此您可以使用简单的equi(即,您不必在查询中按日期范围筛选)来附加它。
所有的属性(例如,俱乐部在本例中)都是传单的属性。如果其中一个属性发生更改,则在记录新状态的维度上创建一个新行,自更改日期起生效。
类型-6类似于普通的类型2,但与行的当前版本有一个自联接。每当为给定的自然键创建新行时,该自然键的所有行都会使用自联接更新到当前行。您可能需要也可能不需要此功能。
您可以通过将事实表与记录在其上的行连接起来来查询as-at状态,即当前状态。如果您的类型为-6,则可以通过自联接查询当前状态,如果需要,还可以在事实表上实现该状态。
这些数据还可以很好地处理特殊的报告工具和多维数据集,尽管在缓慢变化的维度上实现复杂的多维数据集是有点麻烦的(随着时间的推移,您需要为层次结构级别和组合的自然键保留占位符)。
一个好的起点是谷歌在“2型缓慢变化的尺寸”上的搜索。
发布于 2011-11-30 18:48:05
我会留一张单独的桌子
FlyerName, FlyerClub, StartDate, EndDate
通过这种方式,你可以跟踪随着时间的变化,并可以知道在任何给定的时间点,谁是俱乐部的人。
目前的记录将有一个EndDate of NULL。
发布于 2011-12-01 00:41:14
在datamart中,需要对事实表的时变属性进行去denormalize。
您的事务性源数据库将在传单表上包含传单的俱乐部级别,或者可能在JNK建议的与传单相关的日期历史表中。
在你的数据中,你需要将每个特定传单的当前俱乐部级别应用于将传单、航班、日期等汇集在一起的事实记录。
在你的例子中,俱乐部是传单的一个时变属性,但是你感兴趣的事实是飞行和飞行的结合。因此,您需要在航班事务(事实表)上记录FlyerClub。只要你在飞行途中不让传单改变俱乐部,这个方法就能奏效。
https://dba.stackexchange.com/questions/8606
复制相似问题