缓慢变化维是维度建模中处理属性随时间变化的经典方法论,其核心矛盾在于:既要保存历史状态以支持分析,又要控制存储和查询成本。根据Kimball理论体系,SCD被系统化为6种标准类型(Type0-Type6),并衍生出多种实现变体。
ALTER TABLE customer ADD COLUMN original_address VARCHAR(100);
UPDATE customer SET address = '新地址' WHERE id = 1001;
CREATE TABLE user_scd2 (
user_sk BIGINT, -- 代理键
user_id INT, -- 业务键
name STRING,
start_date DATE,
end_date DATE,
is_current BOOLEAN
);
ALTER TABLE employee ADD COLUMN previous_department STRING;
-- 当前表
CREATE TABLE product_current (...);
-- 历史表
CREATE TABLE product_history (...);
CREATE TABLE user_behavior (
behavior_sk INT,
user_id INT,
last_login DATE,
activity_score INT
);
hudiOptions.type = "MERGE_ON_READ"
维度特征 | 推荐类型 | 典型场景 |
---|---|---|
法律强制不变 | Type0 | 用户身份证号 |
无需历史追溯 | Type1 | 错误数据修正 |
完整历史分析 | Type2 | 客户等级变更 |
有限版本追溯 | Type3/Type6 | 部门结构调整 |
高频属性变化 | Type5 | 用户行为标签 |
混合需求 | Type6 | 会员等级+消费趋势分析 |
-- 创建Hudi表
CREATE TABLE customer_scd2 USING hudi
TBLPROPERTIES (
primaryKey = 'customer_id',
preCombineField = 'update_time'
);
models:
customer_scd2:
materialized: incremental
unique_key: customer_sk
strategy: scd_type2
updated_at: update_time
valid_from: start_date
valid_to: end_date
某银行使用Type2+Type5混合模式:
问题:某电商需要同时记录用户当前手机号和历史手机号,应选择哪种SCD类型?
答案:Type6(混合型),通过Type2记录完整变更历史,Type1更新当前值,Type3保留最近一次旧值。
下期预告:《维度的层次关系》
互动话题:你在学习SQL时遇到过哪些坑?欢迎评论区留言讨论!
️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路