不同色谱柱的不同 SCD 类型

Posted

技术标签:

【中文标题】不同色谱柱的不同 SCD 类型【英文标题】:Different SCD types for different columns 【发布时间】:2020-08-31 18:19:01 【问题描述】:

在单个维度上为不同的列设置不同的 SCD 类型是否有意义?还是将维度表拆分为两个表总是更好?

例如,操作系统向我发送以下数据:

ID | CHANNEL_CODE | NAME | TYPE
1  |      A       |  X   |  0
2  |      B       |  Y   |  1

其中CHANNEL_CODE = 自然键,TYPE 应该是 SCD 类型 2,而 NAME 可能是 SCD 类型 1。假设NAME 经常更改。

【问题讨论】:

【参考方案1】:

我总是将类型 0、1 和 2 放在一个表中。

我也同样对待 Type 0-s 和 Type 1-s,而 Type 2-s 则相反。

类型 1/0 更改会导致更新 SCD 表中的所有版本以获取相同的企业/自然 ID,以反映新信息。 类型 2 更改导致更新 SCD 表中的最新行以包含新更改日期作为有效截止日期,当前指示符包含 FALSE,以及包含新数据的新行,有效起始日期作为更改日期,有效期至 '9999-12-31'。

使用这种类型的暂存数据:

CREATE TABLE stg_customer (
     cust_id            INT NOT NULL -- natural identifier
    ,cust_chg_dt        DATE         -- change date
    ,cust_first_name    VARCHAR(30)  -- type 1
    ,cust_last_name     VARCHAR(30)  -- type 1
    ,cust_phoneno       VARCHAR(30)  -- type 1
    ,cust_loyalty_lvl   INT          -- type 2
    ,cust_org_id        INT          -- type 2
) ;

...我的 SCD 表如下所示:

CREATE TABLE dim_customer_scd (
  cust_key         BIGINT 
      DEFAULT dim_customer_scd_seq.NEXTVAL NOT NULL -- surrogate key, primary key
, cust_id          BIGINT       NOT NULL  -- natural identifier
, cust_from_dt     DATE         NOT NULL  -- effective begin date
, cust_to_dt       DATE         NOT NULL  -- effective end date
, cust_is_current  BOOLEAN 
    DEFAULT(cust_to_dt='9999-12-31') NOT NULL -- current indicator
, cust_cre_ts      TIMESTAMP(0) NOT NULL  -- created timestamp
, cust_udt_ts      TIMESTAMP(0) NOT NULL  -- updated timestamp
, cust_first_name  VARCHAR(30)            -- Type 1 column
, cust_last_name   VARCHAR(30)            -- Type 1 column
, cust_phoneno     VARCHAR(30)            -- Type 1 column
, cust_loyalty_lvl INT                    -- Type 2 column
, cust_org_id      INT                    -- Type 2 column
)
;

【讨论】:

【参考方案2】:

IMO 的答案是否取决于...

如果您需要 Dimension 中字段的当前值和历史值,并且数据量 + 更改频率使其可行,则实施 SCD Type 7

如果维度中少量字段的数据易变,而维度中的记录数很大,则实现SCD Type 4SCD Type 5强>

【讨论】:

【参考方案3】:

通常情况下,视情况而定。

首先,确保您了解 OLAP 模型和 RDBMS 存储之间的区别。 RDBMS 存储策略不必反映 OLAP 模型。

您可以轻松地将您的 SCD 类型拆分为单独的表,然后将它们连接到一个视图中以向 OLAP 模型呈现单个源。这允许底层表具有完全不同的 ETL 策略。

如果您的大多数列都是类型 2,则单独的表没有多大意义,因为收益不大。但是,如果您的大多数列不是类型 2,您可能会在 ETL 和处理任务中看到一些性能提升。在 OLAP 处理中,Skinner 表的读取和更新速度更快。

另外,如果您使用视图,我建议您研究使用左连接来组合表格。在许多 OLAP 负载处理模型中,负载处理一次查询单个属性。使用多个表作为左连接,查询处理器可以丢弃不需要提供结果的表引用,而不是通过内连接过滤数据。这可以提高整体 OLAP 处理速度。

【讨论】:

以上是关于不同色谱柱的不同 SCD 类型的主要内容,如果未能解决你的问题,请参考以下文章

C枚举,以及枚举和结构体的不同

合并来自不同粒度维度的数据

高效液相色谱法HPLC和液质联用LC-MS在蛋白质/多肽混合物分析中的应用

代理键是如何在 hive 中处理的

SQL Server scd2 和 scd1 中的 DWH SCD 类型 2 实现

我是不是正确实施了 SCD 类型 1 和 7