我是否正确实施了 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 预计永远不会改变,以防 NAMETYPE 更新 - 覆盖发生。

这是 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

仍然更改为 NAMETYPE 列将导致简单覆盖(没有新行)。

这里NAME应该被SRKDURABLE_SRK覆盖吗?还是SCD 1吗?

SCD 类型 7

据我了解,来自Kimball's Design Tip #152SCD 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的记录)