팩트 테이블이란 무엇인가?
팩트 테이블(Fact Table)은 복합 기본키(Composite Primary Key)를 사용하는 것이 특징입니다. 이 복합 키는 여러 개의 외래키(Foreign Key)로 구성되며, 각 외래키는 팩트 테이블이 참조하는 차원 테이블(Dimension Table)마다 하나씩 존재합니다. 또한 이러한 차원들을 활용해 측정값(Measure)을 담는 컬럼들도 함께 포함됩니다.
데이터 스테이징 과정에서의 서러게이트 키 변환
모든 데이터 스테이징(Data Staging) 프로세스에는 반드시 하나의 단계가 포함되어야 합니다. 바로 팩트 테이블 레코드에 담겨 들어오는 운영 시스템의 원본 ID(Production ID)를, 해당 차원에 맞는 데이터 웨어하우스의 서러게이트 키(Surrogate Key)로 교체하는 작업입니다. 팩트 테이블에 참조된 모든 차원에 대해 이 변환이 수행되어야 하며, 그 외에도 필요에 따라 추가적인 연산, 계산, 구조 재편 작업이 진행될 수 있습니다.
참조 무결성(Referential Integrity)의 중요성
데이터 웨어하우스에서 참조 무결성(RI)은 다음을 의미합니다. 팩트 테이블의 각 외래키에 대응하는 값이 반드시 해당 차원 테이블에 존재해야 한다는 것입니다.
예를 들어, 팩트 테이블에 제품 번호 323442번의 판매 기록이 있다면, 제품(Product) 차원 테이블에도 동일한 번호의 제품이 존재해야 합니다. 만약 그렇지 않다면 우리는 무엇이 판매되었는지 알 수 없게 되고, 존재하지 않는 제품에 대한 판매 기록만 남게 됩니다.
서러게이트 키 조회의 두 가지 유형
서러게이트 키를 체계적이고 일관되게 관리해야 한다는 요구 사항은, 추출(Extract) 로직이 항상 두 가지 유형의 서러게이트 키 조회(Lookup)를 수행해야 함을 의미합니다.
1. 변경된 차원 레코드에 대한 새 키 생성
첫 번째 유형은 변경된 차원 레코드를 발견하고, 느리게 변화하는 차원(Slowly Changing Dimension, SCD) Type 2 기법을 적용하고자 할 때 새로운 서러게이트 키를 생성하는 경우입니다.
Type 2 기법은 차원 레코드의 간헐적인 변경을 처리하는 핵심 작업 방식입니다. 변경된 항목에 대해 새로운 차원 레코드를 만들고, 여기에 완전히 새로운 서러게이트 키를 부여해야 합니다. 이 새 레코드에서 원본 레코드와 다른 속성은 오직 서러게이트 키와, 변경을 유발한 필드(또는 필드들)뿐입니다.
2. 팩트 테이블 처리 시점의 키 치환
두 번째 유형은 팩트 테이블 레코드를 처리하는 시점에 발생합니다. 참조 무결성을 유지하기 위해서는 항상 차원 레코드의 업데이트를 먼저 완료해야 한다는 점을 기억해야 합니다. 이렇게 하면 차원 테이블이 언제나 기본키의 정당한 원천(Source of Truth)이 됩니다. 두 번째 조회 단계에서는 팩트 테이블 레코드 내의 운영 키를, 서러게이트 키의 올바른 현재 값으로 교체해야 합니다.
팩트 테이블 로딩 준비 완료 조건
팩트 테이블의 모든 운영 키가 서러게이트 키로 교체되면, 해당 팩트 레코드는 로딩할 준비가 된 것입니다. 이 시점에서 팩트 테이블 레코드의 키들은 각 차원 테이블에 대한 적절한 외래키로 선정되었으며, 팩트 테이블은 차원 테이블에 대한 참조 무결성을 보장받게 됩니다.
참조 무결성 파괴 가능성에 대한 경계
그러나 이런 상황에서는 다소 편집증적(paranoid)일 만큼 경계하는 것이 좋습니다. 지금까지 설명한 정교한 관리 절차들은 실제 데이터베이스 로딩 이전에 참조 무결성을 확립하는 작업입니다. 하지만 하나 이상의 차원 테이블을 로딩하지 못하거나, 아직 해당 차원 키 값에 의존하는 팩트 레코드가 남아 있는 상태에서 차원 레코드를 삭제하는 등의 관리상 실수를 범하면, 참조 무결성은 얼마든지 깨질 수 있습니다.