我有一个客户端维度和事实表来跟踪客户端的会话,这些列表包含以下列:
代码:
[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)上开始对客户的年龄进行分组,解决此问题的最佳方法是创建Age Group维度并在FactSession中创建外键(FK_AgeGroupKey)到DimAgeGroup尺寸。
现在我认为用*(上面)跟踪所有列会很好。这些(尚未证实)与Sessions有很高的相关性。通过DWH工具包阅读它似乎是一个迷你维度,以容纳所有*列与Age Group最适合,所以我把以下结构放在一起:
代码:
[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?
很抱歉很长的帖子,但希望我已经提供了足够的信息,提前谢谢!
答案 0 :(得分:1)
是的,上述解决方案应该可以正常工作。它支持您跟踪随时间变化的需求,否则您可以直接在DimClient中包含DimDemographic链接。 关于日期问题,我相信你应该使用NULL,这意味着没有值,因为没有登录。此外,识别未登录将是:
select * from DimClient where LastLoginDate IS NULL
对我而言,这比使用人工日期的查询要好得多。
答案 1 :(得分:1)
我会在您的客户端维度中添加一个字段,以指示用户从未登录过。例如:
select * form DimClient where HasUserLoggedIn = 'NO';
它非常人性化,你不必教你的业务用户有关空值。传统上,数据仓库中的空值很糟糕,除非是数值事实值,因为null!= null的复杂性。