数据仓库设计 - 具有频繁变化的维度键的定期快照

Data warehouse design - periodic snapshot with frequently changing dimension keys

想象一个事实 table 在一段时间内(比如 1 小时)的措施总和。

Start Date          | Measure 1 | Measure 2
-------------------------------------------
2018-09-08 00:00:00 | 5         | 10
2018-09-08 00:01:00 | 12        | 20

理想情况下,我们希望保持每行恰好为 1 小时的粒度。但是,每一行都引用了可能“破坏”纹理的尺寸。例如:

Start Date          | Measure 1 | Measure 2 | Dim 1
---------------------------------------------------
2018-09-08 00:00:00 | 5         | 10        | key 1
2018-09-08 00:01:00 | 12        | 20        | key 2

维度值可能会从 30 分钟变为小时,在这种情况下,上述内容将不准确,应如下表示:

Start Date          | Measure 1 | Measure 2 | Dim 1
---------------------------------------------------
2018-09-08 00:00:00 | 5         | 10        | val 1
2018-09-08 00:00:30 | 5         | 10        | val 2
2018-09-08 00:01:00 | 12        | 20        | val 2

在我们的场景中,数据需要按至少 5 个维度键进行切片,查询如下:

sum(measure1) where dim1 = x and dim2 = y..

这个需求有设计模式吗?我考虑过“定期快照”,但我还没有在任何地方读到过这种在维度变化时进行行拆分的内容。

我只能看到两个选项:

  1. 存储每行中出现最多的维度值(例如,如果某个维度值在一小时内的大部分时间都为真,则使用此值)。这会导致一些准确性损失。
  2. 在每次维度更改时拆分每一行。这在 ETL 中很复杂,创建了更多数据并打破了事实 table.
  3. 中的粒度规则

选项 2 是当前的解决方案,可以达到目的,但更难维护。有没有更好的方法或其他选择?

通过一个真实的例子,这个系统记录了制造环境中的生产数据,所以数据是这样的:

Line   | Date                | Crew   | Product   | Running Time (mins)
-----------------------------------------------------------------------
Line 1 | 2018-09-08 00:00:00 | Crew A | Product A | 60

如前所述,工作人员、产品或任何其他维度可能会在一小时内多次更改。

您不需要拆分事实的时间部分 table,因为您显然想要报告每小时的数据,但您应该有两条记录,每个记录对应一个维度值。如果这是事务性事实 table 的聚合,则每小时加载 table 的进程应该按每个维度键对每个记录进行分组。所以在你上面的例子中,你应该有两个小时的记录,如下所示:

Start Date          | Measure 1 | Measure 2 | Dim 1
---------------------------------------------------
2018-09-08 00:00:00 | 5         | 10        | val 1
2018-09-08 00:01:00 | 5         | 10        | val 1
2018-09-08 00:01:00 | 12        | 10        | val 2

您还需要考虑其他措施,并确保它们都进入正确的桶(val 1 或 val 2)。我在示例中将它们平均分配。

现在,如果您按小时 1 和暗淡 1 值 2 进行切片,您将只会看到 12(测量值 1),如果您按小时 1 进行切片,暗淡 1 值 1,您将只会看到 5,如果你只在第 1 小时切片,你会看到 17。

记住,你的粒度是由每个维度的水平来定义的,而不仅仅是时间维度。 HTH.