我是数据仓库的新手(在我的学生时代就学会了这一点),并且希望将数据仓库作为一个副项目。下面是我想出的一个简单的数据仓库设计:
数据仓库有 2 个维度表和 1 个事实表。1 个维度表包含日期时间数据,另一个包含设备数据。事实表包含在现场捕获的设备传入数据值。事实表中的数据粒度为 5 分钟。
我对如何处理时间序列感到困惑,如果有人能澄清这一点,我将不胜感激。假设来自设备的一行数据如下所示:
datetime drive_a drive_b drive_c shaft_a shaft_b shaft_c total_output
02/01/2022 13:05 4.2 3.2 7.4 5.3 8.2 6.4 4563.2
这将被处理并存储到数据仓库中的事实表中。
由于与传入数据的格式不同,如何处理datetime
来自此传入数据的列?dateKey
datetime
我在想事实表需要另一个名为 的列dateTime_raw
,但这违背了dim_datetime
表格的目的,不是因为我的日期时间已经在我的事实表中了吗?
PS:对不起,如果我的问题令人困惑;由于我不精通该领域,因此尽力解释。
如评论中所述,您需要一种将时间序列事实数据关联
fact_deviceValues
回日期时间维度表的方法dim_datetime
。这应该是通过datetime
在两个表中通过引用 from 的外键来fact_deviceValues
实现的dim_datetime
。datetime
应该是您要存储时间序列数据的度量单位,例如您的示例有02/01/2022 13:05
小时和分钟。这可能会使表seconds
中不需要该字段dim_datetime
(除非您确实计划以秒为粒度存储数据)。在涵盖您的数据和用例的合理时间范围内,您的父
dim_datetime
表每天每小时的每一分钟都会有 1 行。例如,如果您需要涵盖大约 100 年的数据,那么您的dim_datetime
表中将有大约 5300 万行(60 分钟 * 24 小时 * 365 天 * 100 年 = ~5300 万行)。而您的子
fact_deviceValues
表将保存datetime
时间序列中发生的事件的实际情况。多个事件可能同时发生datetime
,因此将存在多行,其具有与表中相同的单个父行相关的相同值dim_datetime
。如果您发现您的
dim_datetime
表太大,您可能会找到一个更好的架构来使其成为一个dim_date
表,而不是每个日期只存储 1 个唯一行。然后您的fact_deviceValues
表格可以将日期与时间分开存储,并且可以将dim_date
特定于日期的维度(通常比特定于时间的维度更丰富)连接到表格中。但这取决于您的用例,以及是否有任何特定于您真正关心的时间的维度(我能想到的任何维度通常都可以从时间本身推导出来)。