数据仓库 - 如何存储 created_time、created_date、complete_time、complete_date
Data Warehouse - How to store created_time, created_date, complete_time, complete_date
我的 任务 table 有 4 列要存储 created_time, created_date, completed_time, completed_date
。
当我将 table 转换为 OLAP 时,我是想将它们存储在日期时间维度下,还是将它们保留在 Fact table.
中?
谁能解释一下。谢谢。
假设您使用的是星型模式,日期维度通常不仅仅是查找 table。它通常包含大量描述事实中特定日期的列table,例如是否节假日、在哪个季度、在哪个财政季度等
以这种方式构建,企业可以询问诸如第一季度完成了多少任务之类的问题(无需输入第一季度的确切开始和结束日期)。
您问题的答案取决于您希望用户询问您的查询类型。如果可能出现上述查询,那么是的,创建一个综合日期维度来存储日期信息。
当然,这会使您的查询使用 FK(或指向日期维度的指针列),并且会让您使用联接。对于非常大的 tables,联接可能会稍微降低性能。然而,星型模式就是基于这个概念。
日期维度必须使用一些数据行进行初始化,这些数据行通常涵盖除当前年份之外的 1 年或 2 年(或更多)。
现在,我们谈谈时间列。不建议在日期维度中构建时间(参见link)。如果在日期维度中构建时间,则日期维度将不必要地巨大。
我建议您只将时间列放在事实 table 中,无论您是否使用时间维度。我还建议您在事实中包含计算列,例如在事实 table 中以天、月、年和小时为单位的总持续时间(假设此信息用于查询,例如有多少任务需要 5 小时才能完成)。您需要在 ETL 期间进行计算。您不能在没有日期的情况下从开始时间中减去结束时间。您也不希望在查询期间进行此类计算,否则查询会很复杂。
这种类型的非规范化可能会被星型模式模型中的许多人接受table,并且有一个小的缺点,那就是使事实变得更长。有多种方法可以使计算列虚拟化,但您可能决定保留计算列。在这种情况下,如果您的事实很长并且有大量事实 table,您可以决定创建一个与主要事实 1-1 关联的特殊事实 table使处理速度更快,新事实将更小,加载速度更快。但是,在许多应用程序中情况可能并非如此,即 1 个事实就可以很好地完成工作。
我的 任务 table 有 4 列要存储 created_time, created_date, completed_time, completed_date
。
当我将 table 转换为 OLAP 时,我是想将它们存储在日期时间维度下,还是将它们保留在 Fact table.
中?谁能解释一下。谢谢。
假设您使用的是星型模式,日期维度通常不仅仅是查找 table。它通常包含大量描述事实中特定日期的列table,例如是否节假日、在哪个季度、在哪个财政季度等
以这种方式构建,企业可以询问诸如第一季度完成了多少任务之类的问题(无需输入第一季度的确切开始和结束日期)。
您问题的答案取决于您希望用户询问您的查询类型。如果可能出现上述查询,那么是的,创建一个综合日期维度来存储日期信息。
当然,这会使您的查询使用 FK(或指向日期维度的指针列),并且会让您使用联接。对于非常大的 tables,联接可能会稍微降低性能。然而,星型模式就是基于这个概念。
日期维度必须使用一些数据行进行初始化,这些数据行通常涵盖除当前年份之外的 1 年或 2 年(或更多)。
现在,我们谈谈时间列。不建议在日期维度中构建时间(参见link)。如果在日期维度中构建时间,则日期维度将不必要地巨大。
我建议您只将时间列放在事实 table 中,无论您是否使用时间维度。我还建议您在事实中包含计算列,例如在事实 table 中以天、月、年和小时为单位的总持续时间(假设此信息用于查询,例如有多少任务需要 5 小时才能完成)。您需要在 ETL 期间进行计算。您不能在没有日期的情况下从开始时间中减去结束时间。您也不希望在查询期间进行此类计算,否则查询会很复杂。
这种类型的非规范化可能会被星型模式模型中的许多人接受table,并且有一个小的缺点,那就是使事实变得更长。有多种方法可以使计算列虚拟化,但您可能决定保留计算列。在这种情况下,如果您的事实很长并且有大量事实 table,您可以决定创建一个与主要事实 1-1 关联的特殊事实 table使处理速度更快,新事实将更小,加载速度更快。但是,在许多应用程序中情况可能并非如此,即 1 个事实就可以很好地完成工作。