数据仓库设计-具有频繁更改的维键的定期快照

时间:2018-09-08 15:40:12

标签: database database-design data-warehouse

想象一个事实表,其中包含一个时间段(例如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. 存储每行上最多出现的尺寸值(例如,如果在小时的大部分时间中尺寸值都为true,则使用此值)。这会导致准确性下降。
  2. 在每次尺寸更改时将每一行拆分。这在ETL中很复杂,会创建更多数据并破坏事实表中的粒度规则。

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

通过一个实际示例,该系统在生产环境中记录生产数据,因此数据类似于:

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

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

1 个答案:

答案 0 :(得分:0)

由于您显然想报告每小时数据,因此不需要拆分事实表的时间部分,但是应该有两条记录,每个维度值一个。如果这是事务性事实表的汇总,则加载小时表的过程应按每个维键将每个记录分组。因此,在上面的示例中,您应该有两个小时的记录,如下所示:

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

您还需要考虑其他措施,并确保将它们全部放入正确的存储区(值1或值2)中。我在示例中将它们平均分配。

现在,如果按小时1和Dim 1值2进行切片,您将只看到12(小数1),如果按小时1进行切片,将值1调为1,您将仅看到5,并且如果仅在第一个小时的时间片上,您将看到17。

请记住,您的谷物是由每个维度的级别定义的,而不仅仅是时间维度。 HTH。