我是否正确实施了 SCD 类型 1 和 7
Am I implementing SCD type 1 & 7 correctly
SCD 类型 1
假设我已经基于来自操作系统的以下数据构建了 SCD 类型 1:
ID | CHANNEL_CODE | NAME | TYPE
1 | A | X | 0
2 | B | Y | 1
因为,,我们将丢弃 ID
列并从自然键 (CHANNEL_CODE
):
生成 SRK
SRK | CHANNEL_CODE | NAME | TYPE
11 | A | X | 0
12 | B | Y | 1
意味着 CHANNEL_CODE
预计永远不会改变,以防 NAME
或 TYPE
更新 - 覆盖发生。
这是 SCD 类型 1 的正确标准实现吗?
SCD 1 + 耐用密钥
自然密钥可能会因为 sim 卡或信用卡更改、重复、源系统集成、业务原因等而更改。从 Kimball's Design Tip #147,我知道问题已通过 durable 解决 srk.
意味着,操作系统必须向我发送一个事件,例如:“从现在开始 CHANNEL_CODE=A 是 CHANNEL_CODE=C”。所以我应该有以下数据(事实 table 包含两个 srks):
DURABLE_SRK | SRK | CHANNEL_CODE | NAME | TYPE
11 | 11 | A | X | 0
12 | 12 | B | Y | 1
11 | 13 | C | X | 0
仍然更改为 NAME
或 TYPE
列将导致简单覆盖(没有新行)。
这里NAME
应该被SRK
或DURABLE_SRK
覆盖吗?还是SCD 1吗?
SCD 类型 7
据我了解,来自Kimball's Design Tip #152、SCD 7 = SCD 1 + durable key + SCD 2 (history for not natural key columns)
。所以 SCD 类型 7 应该在每次列更新时生成一个新行。例如,在 NAME update from X to Z where CHANNEL_CODE=C
:
DURABLE_SRK | SRK | CHANNEL_CODE | NAME | TYPE | EFFECTIVE_START_DATE | EXPIDATION_DATE | IS_CURRENT_IND
11 | 11 | A | X | 0 | 2020-05-02 | 2020-06-12 | False
12 | 12 | B | Y | 1 | 2020-01-12 | 2100-01-01 | True
11 | 13 | C | X | 0 | 2020-06-12 | 2020-08-15 | False
11 | 13 | C | Z | 0 | 2020-08-15 | 2100-01-01 | True
这是 SCD 类型 7 的正确实现吗?
SCD 类型 1
是的,这是正确的,但不需要丢弃 ID,我可能会保留它,因为它可能有助于您的 ETL 和调试目的,因为它允许轻松识别源系统中的相应记录(有关示例,请参见下一段)。
SCD 1 + 耐用密钥
如果这是 SCD1,那么您的示例不正确。如果同一源记录上的渠道代码发生变化,那么它将覆盖维度 table 中的记录,而不是插入新记录。这是一个很好的例子,说明为什么您应该保留 ID,因为它可以清楚地表明您维度中的记录与您的来源之间的关系。对于 SCD1,根据定义,SK 和 Durable SK 几乎是同一回事。
我知道您的示例与 real-world 场景相比可能会得到简化,但我建议通道代码是真正的自然键,因此永远不会改变:不同的通道代码将意味着不同的记录。只有当源记录中没有真正唯一的业务标识符时,自然键才会真正改变,例如一个人可能有一个真正的唯一标识符,例如社会安全号码(永远不会改变),但如果不可用,他们可能会通过名字、姓氏和电子邮件地址来识别——其中任何一个都可能改变,因此不是真实的自然键 - 这将是包含耐用 SK 的好案例。
SCD 类型 7
对于这种类型,维度 table 完全是 SCD 类型 2,并且包括耐用 SK。 SCD1 方面可以被认为是虚拟的,因为它被实现为当前标志 = True 的维度上的视图。加入此 table 的任何事实 table 都有两个 FK - 一个包含事件发生时适用的行的维度 SK(标准 SCD2 逻辑),另一个包含持久 SK 并引用查看(获取类似SCD1的记录)
SCD 类型 1
假设我已经基于来自操作系统的以下数据构建了 SCD 类型 1:
ID | CHANNEL_CODE | NAME | TYPE
1 | A | X | 0
2 | B | Y | 1
因为,ID
列并从自然键 (CHANNEL_CODE
):
SRK
SRK | CHANNEL_CODE | NAME | TYPE
11 | A | X | 0
12 | B | Y | 1
意味着 CHANNEL_CODE
预计永远不会改变,以防 NAME
或 TYPE
更新 - 覆盖发生。
这是 SCD 类型 1 的正确标准实现吗?
SCD 1 + 耐用密钥
自然密钥可能会因为 sim 卡或信用卡更改、重复、源系统集成、业务原因等而更改。从 Kimball's Design Tip #147,我知道问题已通过 durable 解决 srk.
意味着,操作系统必须向我发送一个事件,例如:“从现在开始 CHANNEL_CODE=A 是 CHANNEL_CODE=C”。所以我应该有以下数据(事实 table 包含两个 srks):
DURABLE_SRK | SRK | CHANNEL_CODE | NAME | TYPE
11 | 11 | A | X | 0
12 | 12 | B | Y | 1
11 | 13 | C | X | 0
仍然更改为 NAME
或 TYPE
列将导致简单覆盖(没有新行)。
这里NAME
应该被SRK
或DURABLE_SRK
覆盖吗?还是SCD 1吗?
SCD 类型 7
据我了解,来自Kimball's Design Tip #152、SCD 7 = SCD 1 + durable key + SCD 2 (history for not natural key columns)
。所以 SCD 类型 7 应该在每次列更新时生成一个新行。例如,在 NAME update from X to Z where CHANNEL_CODE=C
:
DURABLE_SRK | SRK | CHANNEL_CODE | NAME | TYPE | EFFECTIVE_START_DATE | EXPIDATION_DATE | IS_CURRENT_IND
11 | 11 | A | X | 0 | 2020-05-02 | 2020-06-12 | False
12 | 12 | B | Y | 1 | 2020-01-12 | 2100-01-01 | True
11 | 13 | C | X | 0 | 2020-06-12 | 2020-08-15 | False
11 | 13 | C | Z | 0 | 2020-08-15 | 2100-01-01 | True
这是 SCD 类型 7 的正确实现吗?
SCD 类型 1
是的,这是正确的,但不需要丢弃 ID,我可能会保留它,因为它可能有助于您的 ETL 和调试目的,因为它允许轻松识别源系统中的相应记录(有关示例,请参见下一段)。
SCD 1 + 耐用密钥
如果这是 SCD1,那么您的示例不正确。如果同一源记录上的渠道代码发生变化,那么它将覆盖维度 table 中的记录,而不是插入新记录。这是一个很好的例子,说明为什么您应该保留 ID,因为它可以清楚地表明您维度中的记录与您的来源之间的关系。对于 SCD1,根据定义,SK 和 Durable SK 几乎是同一回事。
我知道您的示例与 real-world 场景相比可能会得到简化,但我建议通道代码是真正的自然键,因此永远不会改变:不同的通道代码将意味着不同的记录。只有当源记录中没有真正唯一的业务标识符时,自然键才会真正改变,例如一个人可能有一个真正的唯一标识符,例如社会安全号码(永远不会改变),但如果不可用,他们可能会通过名字、姓氏和电子邮件地址来识别——其中任何一个都可能改变,因此不是真实的自然键 - 这将是包含耐用 SK 的好案例。
SCD 类型 7
对于这种类型,维度 table 完全是 SCD 类型 2,并且包括耐用 SK。 SCD1 方面可以被认为是虚拟的,因为它被实现为当前标志 = True 的维度上的视图。加入此 table 的任何事实 table 都有两个 FK - 一个包含事件发生时适用的行的维度 SK(标准 SCD2 逻辑),另一个包含持久 SK 并引用查看(获取类似SCD1的记录)