맨위로가기

느린 변경 차원

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

느린 변경 차원(SCD)은 데이터 웨어하우스에서 차원 테이블의 데이터를 변경하는 방법으로, 변경 이력을 추적하거나 유지하는 여러 가지 유형을 포함한다. Type 0은 변경되지 않는 속성, Type 1은 덮어쓰기 방식, Type 2는 새 행 추가 방식, Type 3은 새 열 추가 방식, Type 4는 히스토리 테이블 추가 방식, Type 5는 Type 4와 Type 1의 결합, Type 6은 Type 1, Type 2, Type 3을 혼합한 방식이다. 팩트 테이블 구현은 Type 2/Type 6 팩트 구현과 순수 Type 6 팩트 구현으로 나뉘며, 한 테이블 내에서 서로 다른 열에 다양한 SCD 유형을 적용할 수 있다.

더 읽어볼만한 페이지

  • 데이터 모델링 - 빌딩 정보 모델링
    빌딩 정보 모델링(BIM)은 건축물의 전 생애주기 동안 발생하는 정보를 디지털 모델로 통합 관리하는 프로세스이다.
  • 데이터 모델링 - 저장 프로시저
    저장 프로시저는 데이터베이스 관리 시스템에서 SQL 문들을 미리 컴파일하여 저장하고, 모듈화, 보안성, 성능 향상, 유지보수 용이성과 같은 특징을 가지며, 데이터베이스 시스템마다 구현 방식과 지원하는 언어가 다를 수 있는 코드 묶음이다.
느린 변경 차원

2. 역사적 배경

데이터 웨어하우징 초기에는 주로 Type 1 (덮어쓰기) 방식이 사용되었으나, 데이터 분석이 심화되고 과거 데이터 보존의 중요성이 커지면서 다양한 SCD 방법론이 발전하게 되었다.[1]

2006년 2월 21일, 브루스 오트만(Bruce Ottmann)과 크리스 앵거스(Chris Angus)는 '데이터 처리 시스템'에 대한 미국 특허청 특허 번호 7,003,504를 획득했다.[2]

3. SCD 유형

SCD(Slowly Changing Dimension, 느린 변경 차원)는 데이터 변경을 처리하는 방식에 따라 여러 유형으로 나뉜다.


  • Type 1: 덮어쓰기 - 오래된 데이터를 새 데이터로 덮어쓰는 방식으로, 과거 데이터를 추적하지 않는다. 유지 관리가 쉽지만, 데이터 웨어하우스에 기록이 남지 않는다.[1]
  • Type 2: 새 행 추가 - 데이터가 변경될 때마다 새로운 행을 추가하여 변경 이력을 추적한다. 자연 키와 대체 키를 함께 사용하며, 각 레코드의 유효 기간을 나타내기 위해 시작 날짜, 종료 날짜 또는 버전 번호를 사용한다.[1]
  • Type 3: 새 열 추가 - 별도의 열을 추가하여 변경 사항을 추적하지만, 지정된 열의 수만큼만 기록을 보존할 수 있다. 예를 들어, 원래 상태와 현재 상태를 기록하는 열을 추가할 수 있지만, 두 번 이상의 변경은 추적할 수 없다.[1]
  • Type 4: 히스토리 테이블 추가 - 현재 데이터를 유지하는 테이블과 변경 이력을 기록하는 별도의 히스토리 테이블을 사용하는 방식이다. 쿼리 성능 향상을 위해 두 테이블 모두에서 대체 키를 참조한다.[1]
  • Type 5: Type 4 + Type 1 - Type 4 미니 차원을 기반으로, Type 1 속성으로 덮어쓰여지는 "현재 프로필" 미니 차원 키를 기본 차원에 내장하는 방식이다. 팩트 테이블을 거치지 않고도 현재 할당된 미니 차원 속성 값과 기본 차원의 다른 속성 값에 접근할 수 있다.[3]
  • Type 6: Type 1 + Type 2 + Type 3 - Type 1, 2, 3 방식을 모두 결합한 방식이다. 랄프 킴볼은 이 방식을 "단일 버전 오버레이를 사용한 예측 불가능한 변경"이라고 불렀다.[1]

3. 1. Type 0: 원본 유지

Type 0 차원 속성은 절대 변경되지 않으며, 지속적인 값을 가지거나 '원래의' 값으로 묘사되는 속성에 할당된다. 예를 들어, 생년월일, 원래 신용 점수 등이 있다. Type 0은 대부분의 날짜 차원 속성에 적용된다.[2]

3. 2. Type 1: 덮어쓰기

이 방법은 오래된 데이터를 새 데이터로 덮어쓰는 것이므로 기록 데이터를 추적하지 않는다.

공급업체 테이블의 예시는 다음과 같다.

공급업체_키공급업체_코드공급업체_이름공급업체_주
123ABCAcme Supply CoCA



위의 예에서 Supplier_Code는 자연 키이고, Supplier_Key는 대리 키이다. 기술적으로, 자연 키(Supplier_Code)로 행이 고유하므로 대리 키는 필요하지 않다.

만약 공급업체가 본사를 일리노이로 이전하면 레코드가 다음과 같이 덮어쓰여진다.

공급업체_키공급업체_코드공급업체_이름공급업체_주
123ABCAcme Supply CoIL



Type 1 방법은 데이터 웨어하우스에 기록이 없다는 단점이 있지만, 유지 관리가 쉽다는 장점이 있다.

공급업체 주별로 팩트를 요약하는 집계 테이블을 계산한 경우에는 Supplier_State가 변경되면 다시 계산해야 한다.[1]

3. 3. Type 2: 새 행 추가

Type 2 느린 변경 차원은 변경 이력을 추적하기 위해 새로운 행을 추가하는 방식이다. 즉, 데이터가 변경될 때마다 별도의 레코드를 생성하여 무제한의 변경 이력을 보존할 수 있다. 이 방식은 자연 키와 대체 키를 함께 사용하여 데이터를 관리하며, 각 레코드의 유효 기간을 나타내기 위해 유효 기간(시작 날짜, 종료 날짜) 또는 버전 번호를 사용한다.[1]

예를 들어, 공급업체가 일리노이주로 이전하는 경우 다음과 같이 버전 번호를 증가시켜 기록한다.

공급업체 키공급업체 코드공급업체 이름공급업체 주(州)버전
123ABCAcme Supply CoCA0
124ABCAcme Supply CoIL1
125ABCAcme Supply CoNY2



위의 표에서 "공급업체 코드"(ABC)는 자연 키 역할을 한다.

'유효 날짜' 열을 추가하여 변경 이력을 관리할 수도 있다.

공급업체 키공급업체 코드공급업체 이름공급업체 주(州)시작 날짜종료 날짜
123ABCAcme Supply CoCA2000-01-01T00:00:00|2000년 1월 1일 0시 0분 0초영어2004-12-22T00:00:00|2004년 12월 22일 0시 0분 0초영어
124ABCAcme Supply CoIL2004-12-22T00:00:00|2004년 12월 22일 0시 0분 0초영어



두 번째 행의 시작 날짜는 이전 행의 종료 날짜와 같고, 종료 날짜가 없는 것은 현재 유효한 레코드임을 의미한다. 종료 날짜에 9999-12-31과 같은 표준화된 대체 높은 날짜를 넣어 빈 값 사용을 피할 수도 있다.

유효 날짜와 현재 플래그를 함께 사용하는 방법도 있다.

공급업체 키공급업체 코드공급업체 이름공급업체 주(州)유효 날짜현재 플래그
123ABCAcme Supply CoCA2000-01-01T00:00:00|2000년 1월 1일 0시 0분 0초영어N
124ABCAcme Supply CoIL2004-12-22T00:00:00|2004년 12월 22일 0시 0분 0초영어Y



현재 플래그가 'Y'이면 해당 레코드가 현재 유효한 버전임을 나타낸다.

Type 2 방식은 특정 대체 키(공급업체 키)를 참조하는 트랜잭션이 해당 시간 슬라이스에 영구적으로 고정되도록 한다. 따라서 과거 데이터를 정확하게 반영할 수 있다. 그러나 차원 내용에 소급 변경이 있거나 새 속성이 추가되는 경우에는 기존 트랜잭션을 업데이트해야 할 수도 있어서, 변경이 잦은 경우에는 적합하지 않다.[1]

3. 4. Type 3: 새 열 추가

이 방법은 별도의 열을 추가하여 변경 사항을 추적하며, 제한된 기록을 보존한다. Type 3은 기록 데이터를 저장하기 위해 지정된 열의 수로 제한되므로 제한된 기록만 보존할 수 있다. Type 1과 Type 2는 원래 테이블 구조가 동일하지만, Type 3은 열을 추가한다. 다음 예제에서는 공급업체의 원래 상태를 기록하기 위해 테이블에 열이 추가되었으며, 이전 기록만 저장된다.

공급업체\_키공급업체\_코드공급업체\_이름원래\_공급업체\_상태유효\_날짜현재\_공급업체\_상태
123ABCAcme Supply CoCA2004-12-22T00:00:00IL



이 기록에는 원래 상태와 현재 상태에 대한 열이 포함되어 있다. 하지만 공급업체가 두 번째로 이전하는 경우에는 변경 사항을 추적할 수 없다.

이 방법의 한 가지 변형은 Original_Supplier_State 대신 Previous_Supplier_State 필드를 생성하여 가장 최근의 기록 변경 사항만 추적하는 것이다.[1]

3. 5. Type 4: 히스토리 테이블 추가

Type 4 방법은 일반적으로 "히스토리 테이블"을 사용하는 것으로, 하나의 테이블은 현재 데이터를 유지하고 추가 테이블은 일부 또는 모든 변경 사항을 기록하는 데 사용한다. 두 개의 대체 키는 쿼리 성능을 향상시키기 위해 팩트 테이블에서 참조된다.[1]

아래 예에서 원래 테이블 이름은 공급업체(Supplier)이고 히스토리 테이블은 Supplier_History이다.

공급업체(Supplier)
공급업체_키(Supplier_Key)공급업체_코드(Supplier_Code)공급업체_이름(Supplier_Name)공급업체_주(Supplier_State)
124ABCAcme & Johnson Supply CoIL



공급업체_히스토리(Supplier_History)
공급업체_키(Supplier_Key)공급업체_코드(Supplier_Code)공급업체_이름(Supplier_Name)공급업체_주(Supplier_State)생성_날짜(Create_Date)
123ABCAcme Supply CoCA2003-06-14T00:00:00
124ABCAcme & Johnson Supply CoIL2004-12-22T00:00:00



이 방법은 데이터베이스 감사 테이블 및 변경 데이터 캡처 기술의 기능과 유사하다.[1]

3. 6. Type 5: Type 4 + Type 1

Type 5 기법은 Type 4 미니 차원을 기반으로 하며, Type 1 속성으로 덮어쓰여지는 "현재 프로필" 미니 차원 키를 기본 차원에 내장한다. 이 접근 방식은 4 + 1 = 5이기 때문에 Type 5라고 불린다. Type 5 느린 변경 차원을 사용하면 팩트 테이블을 통해 연결하지 않고도 현재 할당된 미니 차원 속성 값과 기본 차원의 다른 속성 값에 접근할 수 있다. 논리적으로, 우리는 일반적으로 기본 차원과 현재 미니 차원 프로필 아웃리거를 프레젠테이션 계층에서 단일 테이블로 나타낸다. 아웃리거 속성은 팩트 테이블에 연결된 미니 차원의 속성과 구별하기 위해 "현재 소득 수준"과 같이 고유한 열 이름을 가져야 한다. ETL 팀은 현재 미니 차원이 시간에 따라 변경될 때마다 Type 1 미니 차원 참조를 업데이트/덮어써야 한다. 아웃리거 접근 방식이 만족스러운 쿼리 성능을 제공하지 못하는 경우, 미니 차원 속성을 기본 차원에 물리적으로 내장(및 업데이트)할 수 있다.[3]

3. 7. Type 6: Type 1 + Type 2 + Type 3

Type 6 방식은 Type 1, 2, 3의 방식을 결합한 것이다(1 + 2 + 3 = 6). 랄프 킴볼은 그의 저서 ''데이터 웨어하우스 툴킷''(The Data Warehouse Toolkit)에서 이 방식을 "단일 버전 오버레이를 사용한 예측 불가능한 변경"이라고 불렀다.[1]

다음은 공급업체 테이블을 예시로 든 것이다.

Supplier_KeyRow_KeySupplier_CodeSupplier_NameCurrent_StateHistorical_StateStart_DateEnd_DateCurrent_Flag
1231ABCAcme Supply CoCACA2000-01-01T00:00:009999-12-31T23:59:59Y



Current_State와 Historical_State는 동일하다. 선택적 Current_Flag 속성은 이것이 이 공급업체의 현재 또는 가장 최근 레코드임을 나타낸다.

Acme Supply Company가 일리노이 주로 이사할 경우, Type 2 처리와 같이 새로운 레코드를 추가하지만, 각 행에 고유한 키가 있는지 확인하기 위해 행 키가 포함된다.

Supplier_KeyRow_KeySupplier_CodeSupplier_NameCurrent_StateHistorical_StateStart_DateEnd_DateCurrent_Flag
1231ABCAcme Supply CoILCA2000-01-01T00:00:002004-12-22T00:00:00N
1232ABCAcme Supply CoILIL2004-12-22T00:00:009999-12-31T23:59:59Y



Type 1 처리와 같이 첫 번째 레코드(Row_Key = 1)의 Current_State 정보를 새로운 정보로 덮어쓴다. Type 2 처리와 같이 변경 사항을 추적하기 위해 새로운 레코드를 생성한다. 그리고 Type 3 처리를 통합하는 두 번째 State 열(Historical_State)에 기록을 저장한다.

예를 들어, 공급업체가 다시 이사하게 될 경우, 공급업체 차원에 다른 레코드를 추가하고 Current_State 열의 내용을 덮어쓴다.

Supplier_KeyRow_KeySupplier_CodeSupplier_NameCurrent_StateHistorical_StateStart_DateEnd_DateCurrent_Flag
1231ABCAcme Supply CoNYCA2000-01-01T00:00:002004-12-22T00:00:00N
1232ABCAcme Supply CoNYIL2004-12-22T00:00:002008-02-04T00:00:00N
1233ABCAcme Supply CoNYNY2008-02-04T00:00:009999-12-31T23:59:59Y


4. 팩트 테이블 구현

팩트 테이블은 느린 변경 차원(SCD)을 참조하여 데이터 저장소에 로드될 때, 차원의 자연 키 대신 대리 키를 사용한다.[1] 대리 키는 유효 날짜와 차원 테이블의 시작 날짜 및 종료 날짜를 기반으로 선택되어, 팩트 데이터를 해당 유효 날짜에 맞는 올바른 차원 데이터에 쉽게 연결(join)할 수 있게 한다.

유형 2 및 유형 6 SCD(Slowly Changing Dimension, 변경되지 않는 차원) 구현 방식과 순수 Type 6 구현 방식이 있으며, 유형에 따라 차원의 대리 키를 활용하는 방식과 장단점이 다르다.

4. 1. Type 2/Type 6 팩트 구현

많은 유형 2 및 유형 6 SCD(Slowly Changing Dimension, 변경되지 않는 차원) 구현에서, 차원의 대리 키는 사실 데이터를 데이터 저장소에 로드할 때 자연 키 대신 팩트 테이블에 넣는다.[1] 대리 키는 유효 날짜와 차원 테이블의 시작_날짜 및 종료_날짜를 기반으로 주어진 팩트 레코드에 대해 선택된다. 이를 통해 해당 유효 날짜에 대한 올바른 차원 데이터에 팩트 데이터를 쉽게 결합(join)할 수 있다.

다음은 유형 6 하이브리드 방식을 사용하여 위에서 생성한 공급업체 테이블의 예시이다.

공급업체_키공급업체_코드공급업체_이름현재_상태과거_상태시작_날짜종료_날짜현재_플래그
123ABCAcme Supply CoNYCA2000-01-01T00:00:002004-12-22T00:00:00N
124ABCAcme Supply CoNYIL2004-12-22T00:00:002008-02-04T00:00:00N
125ABCAcme Supply CoNYNY2008-02-04T00:00:009999-12-31T23:59:59Y



배송 테이블에 올바른 공급업체_키가 포함되면 해당 키를 사용하여 공급업체 테이블에 쉽게 결합(join)할 수 있다.

4. 2. 순수 Type 6 팩트 구현

순수 Type 6 구현은 각 마스터 데이터 항목에 대해 단일 대리 키를 사용한다.[1] 예를 들어, 각 고유 공급업체는 단일 대리 키를 가진다. 이렇게 하면 마스터 데이터의 변경 사항이 기존 트랜잭션 데이터에 영향을 미치지 않는다. 또한 트랜잭션을 쿼리할 때 더 많은 옵션을 제공한다.

다음은 순수 Type 6 방법을 사용하는 공급업체 테이블의 예시이다.

공급업체_키공급업체_코드공급업체_이름공급업체_상태시작_날짜종료_날짜
456ABCAcme Supply CoCA2000-01-01T00:00:00영어2004-12-22T00:00:00영어
456ABCAcme Supply CoIL2004-12-22T00:00:00영어2008-02-04T00:00:00영어
456ABCAcme Supply CoNY2008-02-04T00:00:00영어9999-12-31T23:59:59영어



각 거래에 대해 단일 공급업체 레코드를 검색하기 위한 쿼리는 다음과 같이 확장할 수 있다.



SELECT

supplier.supplier_code,

supplier.supplier_state

FROM supplier

INNER JOIN delivery

ON supplier.supplier_key = delivery.supplier_key

AND delivery.delivery_date >= supplier.start_date AND delivery.delivery_date < supplier.end_date;



2001-08-09T00:00:00영어의 유효 날짜(Delivery_Date)가 있는 팩트 레코드는 'CA'의 Supplier_State와 함께 ABC의 Supplier_Code에 연결된다. 2007-10-11T00:00:00영어의 유효 날짜가 있는 팩트 레코드는 동일한 Supplier_Code ABC에 연결되지만 'IL'의 Supplier_State에 연결된다.

이 접근 방식은 더 복잡하지만 다음과 같은 여러 장점이 있다.

# DBMS에 의한 참조 무결성이 가능해진다. Product 테이블에서 Supplier_Code를 외래 키로 사용할 수는 없지만, 각 제품이 특정 시간 슬라이스에 묶여 있는 Supplier_Key를 외래 키로 사용할 수 있다.

# 팩트에 날짜가 둘 이상 있는 경우(예: Order_Date, Delivery_Date, Invoice_Payment_Date) 쿼리에 사용할 날짜를 선택할 수 있다.

# 날짜 필터 로직을 변경하여 "현재 시점", "거래 시점", "특정 시점" 쿼리를 수행할 수 있다.

# 차원 테이블에 변경 사항이 있는 경우 팩트 테이블을 다시 처리할 필요가 없다. 예를 들어 시간 슬라이스를 변경하는 추가 필드를 소급하여 추가하거나, 차원 테이블의 날짜에 실수를 한 경우 쉽게 수정할 수 있다.

# 이중 시간적 날짜를 차원 테이블에 도입할 수 있다.

# 동일한 쿼리에서 서로 다른 유효 날짜로 동일한 정보를 보고할 수 있도록 팩트를 차원 테이블의 여러 버전과 조인할 수 있다.

다음은 '2012-01-01T00:00:00영어'(현재 datetime일 수 있음)과 같은 특정 날짜를 사용하는 방법의 예시이다.



SELECT

supplier.supplier_code,

supplier.supplier_state

FROM supplier

INNER JOIN delivery

ON supplier.supplier_key = delivery.supplier_key

AND supplier.start_date <= '2012-01-01T00:00:00' AND supplier.end_date > '2012-01-01T00:00:00';


5. 유형 결합

SCD 모델 예시


한 테이블 내에서 서로 다른 열에 다양한 SCD 유형을 적용할 수 있다. 예를 들어, 동일한 테이블의 공급업체 이름 열에는 유형 1을 적용하고 공급업체 주 열에는 유형 2를 적용하는 방식이다.[1]

6. 한국적 맥락에서의 SCD

한국 기업들은 데이터 기반 의사 결정을 강화하면서, 느린 변경 차원(SCD)을 활용한 데이터 웨어하우스 구축에 대한 관심이 높아지고 있다. 급변하는 시장 환경과 소비자 트렌드에 대응하기 위해, Type 2, Type 6와 같이 변경 이력을 상세히 추적하는 방식이 선호되는 경향이 있다. 금융, 유통, 통신 등 다양한 산업 분야에서 고객 데이터, 상품 데이터, 계약 데이터 등의 변화를 관리하고 분석하는 데 SCD가 활용되고 있다.
정부 정책 변화에 따른 데이터 관리: 정부 정책 변화에 따라 기업은 관련 데이터를 신속하고 정확하게 변경하고 관리해야 한다. 예를 들어, 새로운 개인정보보호 규정이 시행되면 기업은 고객 데이터 처리 방식을 변경하고, 이 변경 이력을 SCD를 통해 관리해야 한다. 이러한 관리는 특히 Type 2 (새 행 추가) 방식을 통해 효과적으로 이루어질 수 있다.
인물 정보 관리의 복잡성: 한국의 정치적, 사회적 환경은 인물 정보 관리에 있어 더욱 복잡한 요구사항을 제시한다. 예를 들어, 정치인이나 고위 공직자의 경우, 소속 정당, 직위, 정책 입장 등이 시간에 따라 변경될 수 있으며, 이러한 변경 이력은 투명하게 관리되어야 한다. Type 6 (Type 1 + Type 2 + Type 3) 방식은 이러한 복잡한 변경 이력을 효과적으로 관리할 수 있는 방법을 제공한다.

7. 한계점

느린 변경 차원(SCD)은 설계 및 구현이 복잡하다는 단점이 있다. 특히, Type 2와 Type 6 방식은 변경 이력을 모두 저장하므로 데이터 저장 공간을 많이 차지한다. 또한, 쿼리 시에 최신 데이터를 판별하거나 변경 이력을 추적해야 하므로 쿼리 성능 저하를 유발할 수 있다. 데이터 정합성 유지를 위한 추가적인 노력이 필요하다는 점도 한계점으로 지적된다.[1][2]

참조

[1] 서적 The Data Warehouse Toolkit: The Complete Guide to Dimensional Modeling
[2] 웹사이트 Design Tip #152 Slowly Changing Dimension Types 0, 4, 5, 6 and 7 https://www.kimballg[...] 2013-02-05
[3] 웹사이트 Design Tip #152 Slowly Changing Dimension Types 0, 4, 5, 6 and 7 https://www.kimballg[...] 2013-02-05
[4] 서적 The Data Warehouse Toolkit: The Definitive Guide to Dimensional Modeling, 3rd Edition John Wiley & Sons, Inc 2013-07-01
[5] 간행물 Slowly Changing Dimensions Are Not Always as Easy as 1, 2, 3 http://intelligent-e[...] 2005-03-01



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com