Search

테이블 정규화 (1, 2, 3NF, SCD, Fact, Dimension)

Database Normalization

1NF, 2NF, 3NF 등의 Normalization과 SCD Type들에 대해 배워보자
Data Maturity Model and Reality
BI analytics와 거기에 사용되는 data 사이에 큰 갭이 존재

Database Normalization

데이터베이스를 좀더 조직적이고 일관된 방법으로 디자인하려는 방법
데이터베이스 정합성을 쉽게 유지하고 레코드들을 수정/적재/삭제를 용이하게 하는 것
Normalization에 사용되는 개념
Primary Key (기본 키)
Composite Key (복합 키)
여러 칼럼의 조합이 기본 키
Foreign Key (참조 키)
위의 개념은 일반 RDB에서 적용됨

1NF (First Normal Form)

목표는 중복을 제거하고 atomicity를 갖는 것
한 셀에는 하나의 값만 있어야함 (atomicity)
Primary Key가 있어야함
중복된 키나 레코드들이 없어야함
Employee 테이블

2NF (Second Normal Form)

목표는 중복을 제거하고 atomicity를 갖는 것 쉽게 말하자면, 스타 스키마의 형태를 갖추는 것 트랜잭션 - 팩트 테이블
일단 1NF를 만족해야함
다음으로 Primary Key를 중심으로 의존결과를 알 수 있어야함
부분적인 의존도가 없어야함
즉 모든 부가 속성들은 Primary key를 가지고 찾을 수 있어야함
즉, 모든 PK가 아닌 칼럼은 기본 키 칼럼에 완전히 의존(종속)합니다.
사실 State_code와 home_state도 밖으로 분리되는 것이 더 스타 스키마에 가깝다.

3NF (Third Normal Form)

일단 2NF를 만족해야함
전이적 부분 종속성을 없어야함
전이적 부분 종속성 : 테이블 내에서 기본키로 인한 종속성이 아닌 칼럼 사이에 부분적으로 종속성이 발생
2NF의 예에서 state_code과 home_state가 같이 Employees 테이블에 존재

Fact 테이블과 Dimension 테이블

Fact 테이블: 분석의 초점이 되는 양적 정보를 포함하는 중앙 테이블
일반적으로 매출 수익, 판매량, 이익과 같은 측정 항목 포함. 비즈니스 결정에 사용
Fact 테이블은 일반적으로 외래 키를 통해 여러 Dimension 테이블과 연결됨
보통 Fact 테이블의 크기가 훨씬 더 큼
Dimension 테이블: Fact 테이블에 대한 상세 정보를 제공하는 테이블
고객, 제품과 같은 테이블로 Fact 테이블에 대한 상세 정보 제공
Fact 테이블의 데이터에 맥락을 제공하여 다양한 방식으로 분석 가능하게 해줌
Dimension 테이블은 primary key를 가지며, fact 테이블에서 참조 (foreign key)
보통 Dimension 테이블의 크기는 훨씬 더 작음

SCD(Slowly Changing Dimensions)

Slowly Changing Dimensions
DW나 DL에서는 모든 테이블들의 히스토리를 유지하는 것이 중요함
보통 두 개의 timestamp 필드를 갖는 것이 좋음
created_at (생성시간으로 한번 만들어지면 고정됨)
updated_at (꼭 필요 마지막 수정 시간을 나타냄)
어떤 칼럼은 시간을 두고 바뀌기도 하고 어떻게 기록을 할지 중요해진다.
이 경우 컬럼의 성격에 따라 어떻게 유지할지 방법이 달라짐
SCD Type 0
SCD Type 1
SCD Type 2
SCD Type 3
SCD Type 4
OLTP로부터 OLAP으로 복사를 해오는데 분석을 하는 입장에서는 히스토리가 중요하다. 일부 속성들은 시간을 두고 변하게 되는데 DW Table쪽에 어떻게 반영해야하나?
현재 데이터만 유지 vs 처음부터 지금까지 히스토리도 유지

SCD Type

SCD Type 0
한번 쓰고 나면 바꿀 이유가 없는 경우들
한번 정해지면 갱신되지 않고 고정되는 필드들
예) 고객 테이블이라면 회원 등록일, 제품 첫 구매일
SCD Type 1
데이터가 새로 생기면 덮어쓰면 되는 컬럼들
처음 레코드 생성 시에는 존재하지 않았지만 나중에 생기면서 채우는 경우
derived field
예) 고객 테이블이라면 연간소득 필드
SCD Type 2 (2, 3, 4 → 히스토리와 관계 있음)
특정 entity에 대한 데이터가 새로운 레코드로 추가되어야 하는 경우
예) 고객 테이블에서 고객의 등급 변화
tier라는 컬럼의 값이 “regular”에서 “vip”로 변화하는 경우
즉 customer_id 가 100인 row가 하나 더 추가 된다 (tier = vip)
등급이 변경 시간 칼럼도 같이 추가되어야함
SCD Type 3
SCD Type 2의 대안으로 특정 entity 데이터가 새로운 컬럼으로 추가되는 경우
예) 고객 테이블에서 tier라는 컬럼의 값이 “regular”에서 “vip”로 변화하는 경우
previous_tier라는 컬럼 생성
변경시간도 별도 컬럼으로 존재해야함
️ SCD Type 4
일반적으로 많이 쓰임
특정 entity에 대한 데이터를 새로운 Dimension 테이블에 저장하는 경우
SCD Type 2의 변종
예) 별도의 테이블로 저장하고 이 경우 아예 일반화할 수도 있음
tier의 변경 흐름을 새로운 테이블을 만들어 저장