维度表中日期类型属性的哪种数据类型,包括开始和结束日期?

时间:2019-05-24 16:11:03

标签: date amazon-redshift data-warehouse

我正在使用维建模来设计数据仓库。我已经阅读了Kimbal&Ross撰写的大多数数据仓库工具包。我的问题是关于维表中保存日期的列。例如,这是该应用程序用户的表:

CREATE TABLE user_dim (
   user_key BIGINT,  -- surrogate key
   user_id BIGINT,   -- natural key
   user_name VARCHAR(100),
   ...
   user_added_date DATE, -- type 0, date user added to the system
   ...
   -- Type-2 SCD administrative columns
   row_start_date DATE, -- first effective date for this row
   row_end_date DATE,   -- last effective date for this row, 9999-12-31 if current
   row_current_flag VARCHAR(10), -- current or expired
)

最后三个属性用于实现类型2缓慢变化的尺寸。参见Kimbal第150-151页。

问题1:row_start_date和row_end_date列的数据类型是否有最佳实践?类型可以是DATE(如图所示),STRING / VARCHAR / CHAR(“ YYYY-MM-DD”),甚至BIGINT(日期维度的外键)。我认为行开始/结束日期不会有太多过滤,因此不需要“日期维度”键。

问题2:维度属性的数据类型是否有最佳实践,例如“ user_added_date”?我可以看到有人想要每个财政季度添加的用户报告,因此对Date Dimension使用外键会有所帮助。除了必须从“用户维度”添加到“日期维度”以显示属性之外,还有其他缺点吗?

如果有关系,我正在使用Amazon Redshift。

2 个答案:

答案 0 :(得分:1)

问题1:对于SCD至今,我建议您使用时间戳。我的偏好是没有时区,并确保您所有的时间戳都是UTC

问题2:我总是用实际日期的逻辑键设置日期维表。这样,您可以将任何日期(例如,用户的开始日期)加入日期维度,以查找例如“会计月份”或日期范围以外的任何内容。而且您还可以看到日期,而无需加入日期维度,就可以像平常一样看到(存储为日期)

使用redshift(或任何柱状MPP DBMS)时,将规范异常化一些是一种好习惯。例如使用星型模式而不是雪花模式。这是因为columnar带来了效率,并且可以处理无效的联接(因为没有索引)

答案 1 :(得分:1)

对于问题1:row_start_date和row_end_date不是传入数据的一部分。正如您所提到的,它们是为SCD Type 2目的而人为创建的,因此它们不应具有“日期”维的键。用户dim没有理由拥有“日期”维度的键。对于数据类型YYYY-MM-DD应该没问题。

对于问题2:如果您有这样的要求,建议您创建一个派生事实表(通常称为累积快照事实表)以保留诸如user_added_date的派生度量

有关更多信息,请参见https://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimensional-modeling-techniques/accumulating-snapshot-fact-table/