更新事实表
Updating of Fact tables
我有一个被提取到事实和维度中的平面文件资源。
一些维度也来自数据库资源。
转换过程根据需要设置(如果平面文件中有 new/updated)。
问题是,某些数据引用不存在或不匹配基于数据库资源的维度,因此事实中的外键 ID 值设置为默认值(如果没有匹配数据则为零)。
如果所述维度(数据库资源)已更新,我如何对事实进行更新?
对于这种情况,什么是最好的 practice/routine?
这是示例图
Flatfile source product list (db source)
-------------------------------- ------------------------------
| product name | year | volume | | prodcode | name |
-------------------------------- ------------------------------
| apple | 2020 | 1000 | | 001 | apple |
| watermelon | 2020 | 2000 | | 002 | mango |
-------------------------------- ------------------------------
Fact/Dimension
production_fact dim_product
------------------------------- ---------------------------
| fk_product| fk_date| volume | | id | prodcode | name |
------------------------------- --------------------------|
| 2 | d001 | 1000 | | 1 | n/a | n/a |
| 1 | d001 | 2000 | | 2 | 001 | apple |
------------------------------- | 3 | 002 | mango |
---------------------------
如果要更新产品列表(003 西瓜),我是否应该用新值替换 dim_product 第 1 行?
根据您的示例,它应该是这样工作的:
注意:我希望产品代码位于平面文件中,而不是产品名称中。这真的是您的数据的样子吗?无论如何我都会继续。
第一组数据到达。西瓜实而不维
Flatfile source product list (db source)
-------------------------------- ------------------------------
| product name | year | volume | | prodcode | name |
-------------------------------- ------------------------------
| apple | 2020 | 1000 | | 001 | apple |
| watermelon | 2020 | 2000 | | 002 | mango |
-------------------------------- ------------------------------
我们加载了一个维度记录,但它没有任何属性值。 (正如我所说,我通常希望代码在事实输入数据中,但没关系,我们将进行描述)。这当然需要一些逻辑来找到实际上但不在维度中的维度。
production_fact dim_product
------------------------------- ------------------------------------------------
| fk_product| fk_date| volume | | id | prodcode | name | weight |colour |
------------------------------- ------------------------------------------------
| 2 | d001 | 1000 | | 1 | n/a | n/a | n/a | n/a |
| 4 | d001 | 2000 | | 2 | 001 | apple | 200mg | red |
------------------------------- | 3 | 002 | mango | 400mg | yellow|
| 4 | ? | watermelon | ? | ? |
------------------------------------------------
所以我们有维度 SK 4,这是一个合法的维度记录,只是它缺少大量属性。
后来,次元到了。我们知道匹配的含义,因此我们更新了缺少数据的现有维度。
product list (db source)
-----------------------------------------------
| prodcode | name | weight |colour |
--------------------------------------|-------|
| 003 | watermelon | 1kg | green |
-----------------------------------------------
------------------------------------------------
| id | prodcode | name | weight |colour |
------------------------------------------------
| 1 | n/a | n/a | n/a | n/a |
| 2 | 001 | apple | 200mg | red |
| 3 | 002 | mango | 400mg | yellow|
| 4 | 003 | watermelon | 1kg | green |
------------------------------------------------
您想避免更新大量事实。更新更小的维度是一个更好的主意
顺便说一句,这是类型 1 维度。您可以对 SCD 采用相同的方法,只是您不会计算维度的第一个版本,您只是覆盖它。
我有一个被提取到事实和维度中的平面文件资源。 一些维度也来自数据库资源。 转换过程根据需要设置(如果平面文件中有 new/updated)。 问题是,某些数据引用不存在或不匹配基于数据库资源的维度,因此事实中的外键 ID 值设置为默认值(如果没有匹配数据则为零)。
如果所述维度(数据库资源)已更新,我如何对事实进行更新? 对于这种情况,什么是最好的 practice/routine?
这是示例图
Flatfile source product list (db source)
-------------------------------- ------------------------------
| product name | year | volume | | prodcode | name |
-------------------------------- ------------------------------
| apple | 2020 | 1000 | | 001 | apple |
| watermelon | 2020 | 2000 | | 002 | mango |
-------------------------------- ------------------------------
Fact/Dimension
production_fact dim_product
------------------------------- ---------------------------
| fk_product| fk_date| volume | | id | prodcode | name |
------------------------------- --------------------------|
| 2 | d001 | 1000 | | 1 | n/a | n/a |
| 1 | d001 | 2000 | | 2 | 001 | apple |
------------------------------- | 3 | 002 | mango |
---------------------------
如果要更新产品列表(003 西瓜),我是否应该用新值替换 dim_product 第 1 行?
根据您的示例,它应该是这样工作的:
注意:我希望产品代码位于平面文件中,而不是产品名称中。这真的是您的数据的样子吗?无论如何我都会继续。
第一组数据到达。西瓜实而不维
Flatfile source product list (db source)
-------------------------------- ------------------------------
| product name | year | volume | | prodcode | name |
-------------------------------- ------------------------------
| apple | 2020 | 1000 | | 001 | apple |
| watermelon | 2020 | 2000 | | 002 | mango |
-------------------------------- ------------------------------
我们加载了一个维度记录,但它没有任何属性值。 (正如我所说,我通常希望代码在事实输入数据中,但没关系,我们将进行描述)。这当然需要一些逻辑来找到实际上但不在维度中的维度。
production_fact dim_product
------------------------------- ------------------------------------------------
| fk_product| fk_date| volume | | id | prodcode | name | weight |colour |
------------------------------- ------------------------------------------------
| 2 | d001 | 1000 | | 1 | n/a | n/a | n/a | n/a |
| 4 | d001 | 2000 | | 2 | 001 | apple | 200mg | red |
------------------------------- | 3 | 002 | mango | 400mg | yellow|
| 4 | ? | watermelon | ? | ? |
------------------------------------------------
所以我们有维度 SK 4,这是一个合法的维度记录,只是它缺少大量属性。
后来,次元到了。我们知道匹配的含义,因此我们更新了缺少数据的现有维度。
product list (db source)
-----------------------------------------------
| prodcode | name | weight |colour |
--------------------------------------|-------|
| 003 | watermelon | 1kg | green |
-----------------------------------------------
------------------------------------------------
| id | prodcode | name | weight |colour |
------------------------------------------------
| 1 | n/a | n/a | n/a | n/a |
| 2 | 001 | apple | 200mg | red |
| 3 | 002 | mango | 400mg | yellow|
| 4 | 003 | watermelon | 1kg | green |
------------------------------------------------
您想避免更新大量事实。更新更小的维度是一个更好的主意
顺便说一句,这是类型 1 维度。您可以对 SCD 采用相同的方法,只是您不会计算维度的第一个版本,您只是覆盖它。