296. 스타 스키마
핵심 인사이트 (3줄 요약)
- 본질: 스타 스키마(Star Schema)는 데이터 웨어하우스에서 가장 널리 사용되는 차원 모델링 기법으로, 중앙에 팩트 테이블(Fact Table)이 있고, 이를 둘러싸도록 차원 테이블(Dimension Table)이 방사형으로 배치된 형태이다.
- 가치: 단순하고 직관적인 구조, 빠른 조회 성능, 이해하기 쉬운 모델, BI 도구와의 긴밀한 Integration으로 DW 설계의 표준이다.
- 융합: 팩트 테이블, 차원 테이블, OLAP, 조인 최적화, Bitmap 인덱스, 차원 모델링, Slowly Changing Dimension과 밀접하게 연관된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
개념 정의
스타 스키마(Star Schema)는 Ralph Kimball이 제시한 차원 모델링(Dimensional Modeling)의 핵심 구조로, 데이터 웨어하우스에서 분석용 데이터 모델링의 표준으로 널리 사용된다. 구조는 별(Star)과 같이 중앙에 큰 팩트 테이블(Fact Table)이 있고, 이를 둘러싸도록 차원 테이블(Dimension Table)이 방사형(Radial)으로 배치된 형태이다. 팩트 테이블은 분석의 중심이 되는 측정값(Measure)들(매출액, 수량, 이익 등)을 저장하고, 차원 테이블은 분석의 관점(누구, 무엇을, 언제, 어디서 등)을 제공하는 属性들로 구성된다.
필요성
전통적인 3NF(제3정규형) 정규화된 관계형 모델은 데이터 중복을 최소화하고 갱신 이상을防止하는 데 유리하지만, 복잡한 조인 연산이 필요하므로 분석 쿼리 성능이 저하된다. 데이터 웨어하우스는 읽기 위주이므로 데이터 중복을 어느 정도 감수하더라도 조회 성능을 높이는 것이更重要하다. 스타 스키마는 팩트 테이블을 정규화하지 않고(비정규화), 차원 테이블도 가능하면 비정규화하여 조인 경로를最短化하고 查询 성능을 극대화한다. 또한 모델이直感적으로 이해하기 쉬워 비즈니스 사용자와의コミュニケーションにも有利である.
배경
Ralph Kimball은 1990년대DW 설계 방법론으로 차원 모델링을 제시했으며, 그 핵심 구조가 스타 스키마이다. Kimball에 따르면 "차원 모델링은 정보 시스템의 사용자가 이해하고 활용할 수 있도록 데이터를 표현하는 디자인 기술"이다. 스타 스키마는 모든 차원 테이블이 直接 中央 팩트 테이블에만 조인되므로, 모델이 간단하고 查询 최적화가 용이하다. 이후 스노우플레이크 스키마(Snowflake Schema)가 차원 테이블까지 정규화하여 데이터 중복을 제거하는 variant로 등장했지만, 스타 스키마가仍然是 DW 설계의 가장 널리 사용되는 구조이다.
비유
스타 스키마는우주 공간의 태양계와 같다. 태양(팩트 테이블)이 중앙에 있고, 각 행성(차원 테이블)이 태양을 중심으로公転している. 행성은 태양과 直接 연결되어 있으며, 행성끼리 직접 연결되어 있지는 않다. 태양에서 행성으로의 거리는 일정하고, 어떤 행성이든 태양과 直接 통신(조인)하면 된다. 이는 차원 테이블이 모두 直接 팩트 테이블에만 조인되는 스타 스키마의 구조와 동일하다.
📢 섹션 요약: 스타 스키마는 중앙 팩트 테이블과 방사형 차원 테이블로 구성된 차원 모델링 기법으로, 단순한 구조와 빠른 조회 성능으로 DW 설계의 표준이다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
스타 스키마 구조
┌─────────────────────────────────────────────────────────────────────────────┐
│ 스타 스키마 구조 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [기본 구조] │
│ ───────── │
│ │
│ ┌─────────────┐ │
│ │ 차원테이블 │ │
│ │ (Dim) │ │
│ │ Time │ │
│ └──────┬──────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────┐ │
│ │ │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 차원테이블 │ │ 팩트테이블 │ │ 차원테이블 │ │
│ │ (Dim) │ │ (Fact) │ │ (Dim) │ │
│ │ Product │◀──────│ │──────▶│ Customer │ │
│ │ │ │ -sales_amt │ │ │ │
│ └─────────────┘ │ -qty │ └─────────────┘ │
│ ▲ │ -cost │ ▲ │
│ │ │ -profit │ │ │
│ │ └──────┬──────┘ │ │
│ │ │ │ │
│ │ │ │ │
│ │ ┌──────┴──────┐ │ │
│ │ │ 차원테이블 │ │ │
│ └──────────────│ (Dim) │─────────────┘ │
│ │ Store │ │
│ └─────────────┘ │
│ │
│ [팩트 테이블 예시: fact_sales] │
│ ───────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ column │ type │ description │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ sales_id │ BIGINT PK │ 매출 고유 식별자 │ │
│ │ time_key │ INT FK │ 시간 차원 FK (20240115等形式) │ │
│ │ product_key │ INT FK │ 상품 차원 FK │ │
│ │ customer_key │ INT FK │ 고객 차원 FK │ │
│ │ store_key │ INT FK │ 점포 차원 FK │ │
│ │ sales_amt │ DECIMAL │ 매출액 (측정값) │ │
│ │ sales_qty │ INT │ 판매 수량 (측정값) │ │
│ │ cost_amt │ DECIMAL │ 원가 (측정값) │ │
│ │ profit_amt │ DECIMAL │ 이익 (측정값) │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ ※ 외래 키(FK)는 차원 테이블의 PK를 참조 │ │
│ │ ※ 측정값(Measure)은 additive(합산 가능한) 것이어야 함 │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
│ [차원 테이블 예시: dim_product] │
│ ───────────────────────────────── │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ column │ type │ description │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ product_key │ INT PK │ 상품 고유 식별자 (Surrogate Key) │ │
│ │ product_id │ VARCHAR │ 상품 코드 (Natural Key) │ │
│ │ product_name │ VARCHAR │商品名 │ │
│ │ category │ VARCHAR │ 카테고리 │ │
│ │ brand │ VARCHAR │ 브랜드 │ │
│ │ price │ DECIMAL │ 단가 │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ ※ 차원 테이블은 비정규화가 허용됨 (중복 데이터 OK) │ │
│ │ ※ SCD (Slowly Changing Dimension) 처리가 필요할 수 있음 │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
스타 스키마 조회 예시
┌─────────────────────────────────────────────────────────────────────────────┐
│ 스타 스키마 조회 예시 (SQL) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [예제 질의: 카테고리별, 분기별 매출 분석] │
│ ────────────────────────────────────────────────────────── │
│ │
│ SELECT │
│ p.category, │
│ t.quarter, │
│ SUM(f.sales_amt) AS total_sales, │
│ SUM(f.profit_amt) AS total_profit, │
│ ROUND(SUM(f.profit_amt) / SUM(f.sales_amt) * 100, 2) AS profit_rate │
│ FROM fact_sales f │
│ JOIN dim_product p ON f.product_key = p.product_key │
│ JOIN dim_time t ON f.time_key = t.time_key │
│ WHERE t.year = '2024' │
│ GROUP BY p.category, t.quarter │
│ ORDER BY p.category, t.quarter; │
│ │
│ [조인 경로 시각화] │
│ ──────────────── │
│ │
│ dim_product (차원) │
│ │ │
│ │ JOIN (PK → FK) │
│ ▼ │
│ fact_sales ────────── dim_time │
│ (팩트) (차원) │
│ │ │
│ │ JOIN (PK → FK) │
│ ▼ │
│ dim_customer (차원) │
│ │
│ ※ 모든 차원이 直接 팩트에만 조인되므로 조인 경로가 항상 동일 (1-hop) │
│ ※ 차원 테이블 간의 조인이 없음 (스노우플레이크와의 차이점) │
│ │
│ [조회 성능 최적화 기법] │
│ ─────────────────────── │
│ • 팩트 테이블: 파티셔닝 (시간 기준), 클러스터드 인덱스 │
│ • 차원 테이블: Bitmap 인덱스, 조인 최적화 │
│ • Aggregated fact table: 미리 집계한 데이터 테이블 생성 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
스타 스키마 vs 스노우플레이크 스키마
┌─────────────────────────────────────────────────────────────────────────────┐
│ 스타 스키마 vs 스노우플레이크 스키마 비교 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┬────────────────────────┬────────────────────────┐ │
│ │ 특성 │ 스타 스키마 │ 스노우플레이크 스키마 │ │
│ │ │ (Star Schema) │ (Snowflake Schema) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 차원 테이블 │ 비정규화 (1차) │ 정규화 (3NF 이상) │ │
│ │ │ (중복 허용) │ (중복 최소화) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 구조 │ 단순 (별 모양) │ 복잡 (눈송이 모양) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 조인 │ 팩트-차원 1단계만 │ 팩트-차원-서브차원 N단계 │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 조회 성능 │ 빠름 (조인 적음) │ 느림 (조인 많음) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 저장 공간 │ 많음 (중복) │ 적음 (중복 제거) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 데이터 일관성 │ 낮은 위험 (중복 갱신) │ 높은 (단일 저장) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 관리 용이성 │ 높음 (단순 구조) │ 낮음 (복잡한 구조) │ │
│ ├──────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 적합场景 │绝大多数 DW (70~80%) │ 차원 테이블非常大/복잡한 경우│ │
│ │ │ 단순하고 빠른查询 우선 │ 저장 공간 절약 우선 │ │
│ └──────────────────┴────────────────────────┴────────────────────────┘ │
│ │
│ [스노우플레이크 예시: 차원 테이블 정규화] │
│ ───────────────────────────────────────── │
│ │
│ 스타 스키마: │
│ ┌─────────────────┐ │
│ │ dim_product │ │
│ │─────────────────│ │
│ │ product_key (PK)│ │
│ │ product_name │ │
│ │ category │ ← 중복: "전자기기"가 여러 행에 반복 │
│ │ brand │ ← 중복: "삼성"이 여러 상품에 반복 │
│ │ sub_category │ │
│ └─────────────────┘ │
│ │
│ 스노우플레이크: │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ dim_sub_category│◀──────│ dim_product │ │
│ │─────────────────│ │─────────────────│ │
│ │ sub_cat_key (PK)│ │ product_key (PK)│ │
│ │ sub_category │ │ product_name │ │
│ │ category_key(FK)│ │ sub_cat_key(FK)│ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ │ │
│ ┌─────────────────┐ │ │
│ │ dim_category │ │ │
│ │─────────────────│ │ │
│ │ category_key(PK)│ │ │
│ │ category │ │ │
│ └─────────────────┘ │ │
│ ▼ │
│ fact_sales (팩트) │
│ │
│ ※ 차원 자체가 정규화되어 눈송이 모양이 됨 │
│ ※ 저장 공간 절약되지만 조인이 증가하여 쿼리 성능 저하 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Aggregated Fact Table
┌─────────────────────────────────────────────────────────────────────────────┐
│ Aggregated Fact Table (예측 테이블) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [개념] │
│ ───── │
│ • 미리 집계(aggregation)된 결과를 별도 테이블로 저장 │
│ • 자주 사용되는 집계 결과를 캐싱하여 쿼리 성능 향상 │
│ • 팩트 테이블의 volume을 줄이고 응답 시간 단축 │
│ │
│ [예시: 월별-카테고리-지역 집계 테이블] │
│ ────────────────────────────────────────── │
│ │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ fact_sales_monthly_category_region (예측 테이블) │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ time_month │ category │ region │ total_sales │ total_profit │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ 2024-01 │ 전자기기 │ 서울 │ 15억 │ 3억 │ │
│ │ 2024-01 │ 의류 │ 부산 │ 8억 │ 1.5억 │ │
│ │ 2024-02 │ 전자기기 │ 서울 │ 18억 │ 4억 │ │
│ │ ... │ ... │ ... │ ... │ ... │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ ※粒度: 월별-카테고리-지역별 │ │
│ │ ※원본 fact_sales (일별 상세)보다 행 수大幅 감소 │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
│ [Aggregated Fact vs 원본 Fact] │
│ ┌────────────────────────────────────────────────────────────────────┐ │
│ │ │ 행 수 (예시) │ 저장 공간 │ 쿼리 속도 │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ fact_sales │ 수십억 행 │ 매우 큼 │ 느림 (스캔量大) │ │
│ │ (일별 상세) │ │ │ │ │
│ │ ────────────────────────────────────────────────────────────────│ │
│ │ fact_sales_ │ 수백만 행 │ 중간 │ 빠름 │ │
│ │ monthly │ │ │ │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ 주의: Aggregated table은 특정 쿼리에特化되어 있으므로,
│ 다른粒度의 查询에는使用 불가능하며, 관리 부담도 증가한다.
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해석] 스타 스키마는 Kimball 차원 모델링의 핵심으로, 단순하고直感적이며 조회 성능이 뛰어나다는 장점이 있다. 팩트 테이블의 모든 외래 키가 直接 차원 테이블의 기본 키와 조인되므로 조인 경로가一定하고 최적화하기 쉽다. 스노우플레이크 스키마는 차원 테이블까지 정규화하여 저장 공간을 절약하지만 조인이 增加하여 쿼리 성능이 저하될 수 있다. 실무에서는 대부분의 DW가 스타 스키마를 기본으로 사용하며, 차원 테이블이非常大的 경우 일부만 정규화하는 hybrid 접근을 취하기도 한다.
📢 섹션 요약: 스타 스키마는 중앙 팩트 테이블과 방사형 차원 테이블로 구성되며, 단순한 구조와 빠른 조회 성능으로 DW 설계의 표준이다. 스노우플레이크는 차원 정규화의 장점과 조회 성능 저하 사이의 트레이드오프가 있다.
Ⅲ. 결론
스타 스키마는 Kimball 차원 모델링의 핵심 구조로, 데이터 웨어하우스에서 가장 널리 사용되는 분석용 데이터 모델이다. 중앙 팩트 테이블에 분석 대상이 되는 측정값(매출, 수량, 이익 등)을 저장하고, 주변 차원 테이블이 분석의 관점(시간, 상품, 고객, 점포 등)을 属性으로 제공한다. 모든 차원이 直接 팩트 테이블에만 조인되므로 구조가 단순하고, 조인 경로가一定하여 쿼리 성능 최적화가 용이하다. 대부분의 BI 도구와 긴밀하게 통합되어 있어, 실무에서 70~80%의 DW가 스타 스키마를 사용한다.
📢 섹션 요약: 스타 스키마는 팩트-차원 2층 구조로 단순하고 빠른 조회 성능을 제공하며, DW 설계의 표준으로 널리 사용된다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
┌─────────────────────────────────────────────────────────────────────────────┐
│ Star Schema Concept Map │
│ │
│ ┌─────────────────────────────────┐ │
│ │ Star Schema │ │
│ (스타 스키마) │ │
└───────────────┬─────────────────┘ │
│ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Fact Table │ │
│ │ (팩트 테이블) │ │
│ │ Measure (측정값)│ │
│ └────────┬────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Dim │ │ Dim │ │ Dim │ │
│ │ Time │ │ Product │ │ Customer │ │
│ │ (시간차원) │ │ (상품차원) │ │ (고객차원) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └──────────────────┴──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 조인 최적화 │ │
│ │ (1-hop 경로) │ │
│ └─────────────────┘ │
│ │
│ 장점: 단순 | 빠른 조회 | 직관적 | BI Integration │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
참고
- 스타 스키마는 팩트 테이블 + 차원 테이블 2층 구조이다.
- 모든 차원 테이블은 直接 팩트 테이블에만 조인된다.
- 차원 테이블은 비정규화가 허용된다.
- 조회 성능이 뛰어나며 관리가 용이하다.
- DW 설계의 표준으로 70~80%에서使用된다.
- Aggregated fact table로 조회 성능을 더 높일 수 있다.
- 스노우플레이크 스키마와 비교하여 조회 성능은 우세, 저장 공간 효율성은열세이다.