在我的星型模式中,我有一个项目维度,其中包含start_date、finish_date、service_date、onhold_date、resume_date等列。
我应该为事实表中的所有日期引入外键并将它们连接到日期维度,还是应该使用date_dimension对project_dimension进行雪花化?并非所有日期都可用于给定项目,因此将所有这些列保留在 fact_table 中可能会导致 fact_table 中的键为空。
在这种情况下处理日期的最佳方法是什么?
在我的星型模式中,我有一个项目维度,其中包含start_date、finish_date、service_date、onhold_date、resume_date等列。
我应该为事实表中的所有日期引入外键并将它们连接到日期维度,还是应该使用date_dimension对project_dimension进行雪花化?并非所有日期都可用于给定项目,因此将所有这些列保留在 fact_table 中可能会导致 fact_table 中的键为空。
在这种情况下处理日期的最佳方法是什么?
在数据仓库中,我总是更喜欢一般的星型模式,尽可能少的雪花,虽然这显然有点个人喜好,并且可能取决于您使用的环境。对于 Oracle(我最习惯的环境),它在物理上支持雪花,但最佳实践表示不要对业务模型(逻辑)层进行雪花。
就个人而言,出于几个原因,我会推动将 FK 置于事实之上。一,维护一个星,它通常会随着雪花引入更多的连接而表现更好,并且星可以更快地处理聚合。第二,如果您让用户将此数据与来自其他事实的数据相结合,那么具有一致的日期维度就很有意义,可以提高查询性能,并且更加健壮。最后,星号可能是最常见的,所以将来让其他人在这个领域工作应该会更容易/将来数据可能会更好地与其他应用程序一起工作。
对于空 FK,我将默认为您的系统具有的任何默认日期,对我们来说,我们未指定的记录是 01/01/1901。我不会让它们为空,除非业务用户不希望看到 1901,即使那样,我也可能会使用 case 语句将它们清空,但仍将字段填在表上。
这是一篇很好的文章,描述了每种类型的优点/缺点。就像我说的,两者都不是完全正确或错误的。
http://www.dataonfocus.com/star-schema-and-snowflake-schema/