如何解决不同列的SCD类型不同
在单一维上为不同的列使用不同的SCD类型是否有意义?还是将维度表分为两个表总是更好?
例如,操作系统向我发送以下数据:
ID | CHANNEL_CODE | NAME | TYPE
1 | A | X | 0
2 | B | Y | 1
在CHANNEL_CODE
=自然密钥的情况下,TYPE
应该是SCD类型2,而NAME
可能是SCD类型1。假设NAME
经常被更改。
解决方法
我总是在一个表中保留0、1和2型。
我也将类型0-s和类型1-s相同,以其他方式将类型2-s对待。
- 类型1/0的更改导致更新SCD表中具有相同业务/自然ID的所有版本,以反映新信息。
- 类型2更改导致更新SCD表中的最新行以包含新的更改日期作为有效日期,并更新当前指示符以包含FALSE,以及包含新数据的新行valid-from作为更改日期,有效期至“ 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
)
;
,
IMO的答案取决于...
如果您需要一个维度中字段的当前值和历史值,并且数据量和更改频率使其切实可行,请实施 SCD类型7 。
如果维度中少数字段的数据是易失性的,并且维度中的记录数很大,请实施 SCD类型4 或 SCD类型5
,通常情况下,这取决于情况。
首先,请确保您了解OLAP模型与RDBMS存储之间的区别。 RDBMS的存储策略不必反映OLAP模型。
您可以轻松地将SCD类型拆分为单独的表,然后将它们合并到视图中以为OLAP模型提供单个源。这使基础表具有完全不同的ETL策略。
如果您的大多数列都是类型2,那么单独的表就没有多大意义,因为收益很小。但是,如果您的大多数列都不是类型2,则您可能会在ETL和处理任务中看到一些性能提升。 Skinner表在OLAP处理中更快地读取和更新。
另外,如果您使用视图,则建议使用左联接进行调查以合并表。在许多OLAP负载处理模型中,负载处理一次查询单个属性。使用多个表作为左联接时,查询处理器可以丢弃提供结果不需要的表引用,而不是通过内部联接过滤数据。这样可以提高整体OLAP处理速度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。