2012-02-26 28 views
0

我有一个客户维度和跟踪与客户会话事实表中,这些有以下栏目:迷你/垃圾尺寸咨询

代码:

[DimClient] 
---------- 
PK_ClientKey 
ClientNumber 
EmailAddress 
Postcode 
PostcodeLongitude 
PostcodeLatitude 
DateOfBirth 
Gender * 
Sexuality * 
CulturalIdentity * 
LanguageSpokenAtHome * 
CountryOfBirth 
UsualAccommodation * 
LivingWith * 
OccupationStatus * 
HighestLevelOfSchooling * 
RegistrationDate 
LastLoginDate 
Status 

[FactSession] 
------------- 
PK_SessionKey 
FK_ClientKey 
... 

我的第一个要求是开始分组的在特定会话(FactSession)中客户的年龄,解决此问题的最佳方法是创建年龄段维度并在FactSession中为DimAgeGroup维度创建一个外键(FK_AgeGroupKey)。

现在我想这将是一个很好的跟踪*(上图)的所有列。这些可能(尚未证明)与Sessions有很高的相关性。通过DWH工具包读这似乎是一个迷你尺寸,以适应所有的*列同年龄组一起配不配最好的,所以我总结了以下结构:

代码:

[DimClient] 
---------- 
PK_ClientKey 
ClientNumber 
... 
Status 

[DimDemographic] 
----------------- 
PK_DemographicKey 
AgeGroup 
Gender 
Sexuality 
... 
HighestLevelOfSchooling 

[FactSession] 
------------- 
PK_SessionKey 
FK_ClientKey 
FK_DemographicKey 

的DimDemographic表将需要利用SCD Type 2来跟踪随时间变化的变化。这对我的要求是最好的方法吗?

此外,我的客户维度上有RegistrationDate和LastLoginDate列,在客户端注册但从未登录的情况下,放入LastLoginDate字段的最佳值是什么?像'1900-01-01'或NULL?

对不起,很长的文章,但希望我已经提供了足够的信息预先感谢!

回答

1

是的,上述解决方案应该可以正常工作。它支持您跟踪随时间变化的需求,否则您可以直接在DimClient中包含DimDemographic链接。 关于日期问题,我相信你应该使用NULL,这意味着没有价值,因为没有登录。此外,识别未登录将是:

select * from DimClient where LastLoginDate IS NULL 

对我来说这读取比使用人工日期的查询要好得多。 。

+0

谢谢先生。 KAV。我认为在DimClient中滚动人口统计数据是有道理的,但是我想知道我应该如何处理AgeGroup。我想在会议期间了解客户的年龄组。我想我必须在ETL中引入逻辑,以便它看起来是否会在一年后发生新的Session,如果是这样,则更新DimClient中的AgeGroup? – schone 2012-02-27 00:49:55

+0

这里有两种方法,第一种假设ETL过程只能向前运行,即不需要重建一年前的AgeGroup。 ETL每天运行,并将汇总数据放在一边。在这个方法中,你可以在DimClient中管理它。第二种方法和我的偏好是使用您使用过的表格结构,它将允许您随时重建DWH,因为数据将始终在源数据库中正确编目。是否有意义? – itayw 2012-02-27 09:26:31

+0

先生。 kav,有道理,我认为我会继续推进垃圾/迷你维度,但不会预加载所有数据,只加载显而易见的独特组合,否则我会加载数百万*可能无关的数据。我知道,如果相关性较低,我不应该在垃圾/迷你维度中加载数据,但是想法是查看是否存在任何关联。再次感谢! – schone 2012-02-27 09:43:51

1

我将一个字段添加到您的客户端的尺寸来表示用户从未登录过喜欢的东西:

select * form DimClient where HasUserLoggedIn = 'NO'; 

它非常人性化的可读性,而且你不会有教你的商业用户关于零点。由于null!= null的复杂性,传统上数据仓库中的空值是坏的,除了数值事实值。