date - 维度表中日期类型属性的哪种数据类型,包括开始和结束日期?
问题描述
我正在使用维度建模设计一个数据仓库。我已经阅读了 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”等维度属性的数据类型是否有最佳实践?我可以看到有人想要关于每个财政季度添加的用户的报告,因此使用日期维度的外键会很有帮助。除了必须从用户维度加入日期维度以显示属性之外,还有什么缺点吗?
如果重要的话,我正在使用 Amazon Redshift。
解决方案
对于问题 1:row_start_date 和 row_end_date 不是传入数据的一部分。正如您所提到的,它们是为 SCD 类型 2 目的而人工创建的,因此它们不应该具有 Date 维度的键。用户 dim 没有理由拥有 Date 维度的键。对于数据类型YYYY-MM-DD
应该没问题。
对于问题 2:如果您有这样的要求,我建议创建一个派生事实表(通常称为累积快照事实表)以保留派生措施,例如user_added_date
推荐阅读
- java - 即使 range() 运算符根据传入的范围进行自身迭代,如何仅发出整个列表一次
- python - 从数据框中删除最后 n 天
- c++ - 如何在没有 push_back 的情况下将 std::transform 与容器一起使用?
- php - php更新查询总是去别的
- r - 在 R 中,如何更改 `[` 语义以使用直角坐标系而不是(默认)矩阵索引系统?
- ios - 无法在 UINavigationBar 的 searchController 中聚焦 searchBar
- python - 如何在 Python 中使用 Apache Beam 读取和操作 Json 文件
- python - 从 python 字典更新文本文件
- xen - 使用修改后的 xml 进行 virsh 还原“错误:不支持 xml 修改”
- java - itext 7中PdfCanvas和Canvas的区别