由于缺少一个外键而分裂事实表?

时间:2019-02-21 13:03:06

标签: data-warehouse star-schema

想象一下,我们有两个不同的消息: 汽车数据记录仪 CarStatusLog

CarDataLog 包含与汽车和相应的 Person 有直接关系的数据,并包含有关汽车的数据。

CarStatusLog 包含与上述提及的同一辆汽车有关的数据,该数据中包含一个客户。但是这次数据是一个状态。对于像这样的字段:“ CleaningState”:“ NotCleaned”或“ Cleaned”。

两条日志消息均包含Car_ID。我们是否将创建一个带有Car和Person外键的Fact表,并由于没有给出person_id有时会有null的风险。或者更好的方法是创建两个具有“ grain”风险的事实表摊开?

用例为:获取特定汽车的数据,包括其拥有的州和Person的名字。

我是数据仓库的新手,希望有人可以帮助我解决这个问题?

2 个答案:

答案 0 :(得分:2)

数据仓库的标准做法是为维表创建一个虚拟行,用于匹配“未知”数据。这样可以防止事实表的外键中出现NULL。

根据您的用例,您可能有多种类型的“未知”数据。例如,对于“ UNKNOWN”,您可以使用键-1;对于“ NOT APPLICABLE”维数据,可以使用键-2。

另请参阅:https://www.kimballgroup.com/2010/10/design-tip-128-selecting-default-values-for-nulls/

答案 1 :(得分:1)

您需要将调光设置为Car_dim,Person_dim,Status_dim(作为值CleaningState,NotCleaned”或“ Cleaned”)和Date_dim。当您获得空的人名时,Person_dim可以包含一行“未知”人名。

Dim和Fact表具有父/子关系,这意味着您必须先在Dim中加载数据(Dim是父级),然后再加载到Fact(子)表中。

根据获取的数据,从Fact表中的Dims上方加载dim ID。确保两个日志中都有日期字段,以便您可以将两个日志都加入Car_id上,并且两个日志中的日期都与该Car_id相匹配时。 如果您遇到的情况是CarDataID存在于CarDataLog中,但CarStatusLog中不存在,那么您需要在Status_dim中创建一行“未知状态”,以便可以在事实表中使用它。祝好运!