C.W.K.
Stream
Lesson 03 of 05 · published

Slowly Changing Dimension — Type 1 vs Type 2

~12 min · modeling, scd, history

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

변하는 dimension — 그리고 뭐 할지

고객이 나라 이동. 제품이 카테고리 바뀜. Tier 할당이 변동. Dimension 속성이 시간 따라 변하고, "이 주문 났을 때 그 사람 tier 가 뭐였어?" 질문이 생각보다 흥미로워져. Kimball 의 답은 slowly changing dimension (SCD) type 패밀리. 둘 — Type 1 과 Type 2 — 이 거의 모든 실전 케이스 cover.

SCD Type 1 — overwrite

Dimension 이 항상 현재 상태 반영. 고객이 'KR' 에서 'US' 로 이동하면 country column 덮어. 과거 fact 가 이제 항상 US 고객과 연관됐던 것처럼 나타남. 단순, 낮은 storage, 이력 없음.

쓸 때: 역사적 속성 값이 안 중요할 때 (오타 수정, 프로필 사진 업데이트, 입력 에러 fix). Dimension 에 대한 "As-of" 리포팅 안 필요.

SCD Type 2 — versioned 이력

추적 속성에 변경할 때마다 dimension 테이블에 새 row 생성, effective-from / effective-to 타임스탬프와 current-flag 와 함께. Fact 테이블이 fact 일어난 시점 customer_key 로 join 해서 historical 리포트가 고객의 그때-당시 속성 보여줌.

쓸 때: 역사적 값이 중요할 때. 국가별 매출이 과거 주문을 고객이 그때 실제로 있던 곳에 attribute 해야 함, 지금 있는 곳 아니라.

Code

같은 고객 변경, SCD Type 1 vs Type 2 표현·sql
-- Type 1: 그냥 덮어쓰기
UPDATE dim_customers
SET    country = 'US'
WHERE  customer_id = 'C100';
-- C100 의 과거 주문이 이제 US 주문처럼 보임. 이력 사라짐.

-- Type 2: 옛 row 닫고 새 row 열기
UPDATE dim_customers_v2
SET    valid_to = NOW(), is_current = FALSE
WHERE  customer_id = 'C100' AND is_current = TRUE;

INSERT INTO dim_customers_v2 (customer_id, country, tier, valid_from, valid_to, is_current)
VALUES ('C100', 'US', 'gold', NOW(), '9999-12-31', TRUE);

-- Type 2 schema:
CREATE TABLE dim_customers_v2 (
    customer_key   INTEGER PRIMARY KEY,        -- surrogate, 변경 시마다 새 거
    customer_id    TEXT NOT NULL,              -- 자연, row 간 반복
    name           TEXT,
    country        TEXT,
    tier           TEXT,
    valid_from     TIMESTAMP NOT NULL,
    valid_to       TIMESTAMP NOT NULL DEFAULT '9999-12-31',
    is_current     BOOLEAN NOT NULL DEFAULT TRUE
);
역사 속 옳은 시점에 fact 와 Type 2 dimension join·sql
-- *역사적* 국가별 매출 — 주문 *났을 때* 고객이 어느 나라
SELECT d.country,
       SUM(f.amount_usd) AS revenue
FROM   fact_orders f
JOIN   dim_customers_v2 d
  ON   f.customer_id = d.customer_id
  AND  f.order_date >= d.valid_from
  AND  f.order_date <  d.valid_to
GROUP BY d.country
ORDER BY revenue DESC;

External links

Exercise

본인 작업한 dimension 골라. 속성 5개 나열. 각각에 대해 Type 1 또는 Type 2 결정, 한 문장 이유 적기. 답이 거의 항상 stakeholder 가 그 속성에 대해 "as-of" 리포팅 묻는지에 의존하는 거 알아채.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.