분석 테이블 기본 구조

글을 시작하기에 앞서 해당 글은 니시다 케이스케의 저서인 『빅데이터를 지탱하는 기술』 을 바탕으로 요약 및 정리한 글임을 알려드립니다.

정규화와 비정규화

보통 일반적인 RDB는 정규화된 데이터 구조를 가지고 있으며, 크게 트랜잭션 데이터와 마스터 데이터로 구분한다. 트랜잭션(Transaction) 데이터란 시간과 함께 생성되는 데이터를 순서대로 모두 기록하는 것을 의미하며, 트랜잭션 데이터에서 참고하는 각종 정보가 담긴 데이터를 마스터(master) 데이터라고 한다. 트랜잭션 데이터는 한 번 쓰이면 변화하지 않지만, 마스터 데이터는 상황에 따라 다시 쓰인다.

이와 같이 데이터를 구분하여 중복값을 최소화하는 과정을 정규화(nomalization)라고 한다. 정규화를 진행하면 데이터의 무결성을 유지할 수 있으며, 저장되는 데이터 크기도 최적화가 가능하다.

하지만 분석에 사용하는 테이블은 보통 이와 반대의 작업인 비정규화를 진행한다. 여기서 비정규화(denomalization)란 트랜잭션 데이터와 마스터 데이터를 분석에 용이하도록 다시 합치는 것이다. 분석에 사용되는 디멘전 테이블을 작성하려면 정규화에 의해 분해된 테이블을 최대한 결합하여 하나의 테이블로 정리한다. 그 결과로 데이터가 중복되어도 괜찮다.

다차원 모델

다차원 모델이란 말 그대로 데이터를 여러 차원으로 쪼개는 형태를 의미한다. 보통 일반적으로 데이터라고 하면 행과 열이 있는 2차원 모델을 떠올린다. 하지만 실제 운영 데이터들은 훨씬 복잡한 구조로 얽혀있기 때문에 2차원으로 간단하게 나타내기 힘들다. 오히려 2차원으로 만들고자 한다면 엄청난 중복 데이터와 끝도 없는 컬럼 개수에 시달릴 수 있다.

다차원 모델을 업계 용어로 정의해보면 실제 데이터를 나타내는 팩트 테이블과 구분값인 디멘전 테이블로 나누어 설계하는 것을 의미한다. 이는 각 차원별로 테이블을 구분하므로서 중복값을 최소화하고 사용자도 비교적 쉽게 데이터 범위를 이해할 수 있도록 도와준다.

보통 확인하고자 하는 매트릭에 맞추어 다차원 모델을 설계한다. 반면 MPP 데이터베이스에서는 다차원 모델의 개념이 없기 떄문에 비정규화 테이블을 사용한다.

팩트 테이블과 디멘전 테이블

트랜잭션과 같이 사실이 기록된 것을 팩트(fact) 테이블이라고 하며, 이에 참고되는 마스터 데이터 등을 디멘전(dimension) 테이블이라고 한다. 예를 들어 집계의 기반이 되는 숫자 데이터는 팩트 테이블에 기록되고 디멘전 테이블은 이를 분류하기 위한 속성값으로 사용된다.

데이터 양이 증가함에 따라 팩트 테이블은 디멘전 테이블보다도 훨씬 커져 해당 데이터 양이 집계 완료 시간을 좌우한다. 팩트 테이블을 가능한 작게 하는 것이 고속화에 있어서 중요하며, 팩트 테이블에는 ID와 같은 키만을 남겨두고 그 외의 나머지는 디멘전 테이블로 옮긴다.

스타 스키마와 눈송이 스키마

스타 스키마란 팩트 테이블을 중심으로 여러 디멘젼 테이블을 결합한 구조이다. 하나의 팩트 테이블에 여러 디멘전 테이블이 연결되어 있으며 디멘전 테이블은 계층적 구조 없이 단일로 존재한다. 다음 사진은 스타스키마 구조이다.

star schema

눈송이 스키마는 스타 스키마에서 디멘젼 테이블이 하위 디멘전을 계층적으로 가질 수 있는 구조이다. 즉, 스타 스키마보다 더 강하게 정규화를 진행한 구조라고 볼 수 있다. 다음 사진은 눈송이 스키마 구조이다.

snowflake schmea

스타 스키마와 눈송이 스키마를 비교하면 다음과 같다.

비교 스타 스키마 눈송이 스키마
장점 - 데이터 구조, 쿼리가 비교적 간단하다.
- 데이터 중복, 저장공간을 최소화할 수 있다.
- 중복이 없기 때문에 유지보수가 비교적 쉽다.
단점 - 디멘전 테이블에 중복이 발생할 수 있다.
- 저장공간을 비교적 많이 사용한다.
- 많은 JOIN이 요구되어 성능 상 이슈가 발생할 수 있다.
- 데이터 구조가 비교적 복잡하다.

보통 눈송이 스키마는 데이터 웨어하우스에 적합하며, 스타 스키마는 데이터 마트에 적합하다고 알려져 있다.

열 기반 스토리지 등장과 비정규화 테이블

컬럼 단위로 데이터가 저장되는 열 기반 스토리지가 등장하면서 요즘은 사정이 바뀌었다. 컬럼의 숫자가 증가해도 쿼리 엔진 성능에 영향을 받지 않으며, 컬럼 단위로 압축도 진행되므로 디스크 I/O의 증가는 억제된다. 그렇기에 굳이 디멘젼 테이블로 분리할 필요가 없어졌으며, 하나의 거대한 팩트 테이블만 있어도 충분해졌다.

스타 스키마에서 좀 더 비정규화를 진행하여 모든 테이블을 결합한 팩트 테이블을 비정규화 테이블이라고 한다. 데이터 웨어하우스의 테이블 구조로는 스타 스키마가 우수하다. 데이터를 축적하는 단계에서는 팩트 테이블과 디멘전 테이블로 분리해두고 마트로 만들 때는 결합헤 비정규화 테이블을 만든다.