💡 핵심 인사이트 스노우플레이크 스키마(Snowflake Schema)는 스타 스키마의 차원 테이블을 제3정규형(3NF)으로 정규화하여 저장 공간의 중복을 줄인 다차원 모델링 기법입니다. 차원 테이블들이 하위 차원 테이블로 분해되어 그 모양이 눈송이(Snowflake) 구조와 유사하여 이러한 이름이 붙었습니다. 데이터 무결성과 저장 공간 효율성을 높이면서도 분석 시 다중 조인이 필요하다는 성능 트레이드오프를 감수해야 합니다.


Ⅰ. 스타 스키마에서 스노우플레이크 스키마로: 정규화의 귀환

스타 스키마는 분석의 편의를 위해 차원 테이블을 **비정규화(De-normalization)**했습니다. 그러나 관계형 데이터베이스의 정규화(Normalization) 원칙을 완전히抛弃한 것은 아닙니다.

스노우플레이크 스키마는 이 두 가지 접근법의 절충안입니다. 스타 스키마의 핵심 구조(팩트 테이블 중심, 차원 테이블 방사형 배치)를 유지하면서, 차원 테이블 내부에서 반복되는 데이터를 정규화하여 저장 공간을 절약합니다.

[스타 스키마의 비정규화 차원 테이블]

┌──────────────────────────────────────────────────────────┐
│                    제품_차원 (비정규화)                    │
│  ┌────────┬────────┬──────────┬──────────┬──────────────┐ │
│  │ 제품키  │ 제품명   │ 브랜드명   │ 제조사명    │ 제조사 주소    │ │
│  │ P001   │ 노트북X  │ 삼성전자   │ 삼성전자    │ 서울 강남구... │ │
│  │ P002   │ 노트북Y  │ 엘지전자   │ 엘지전자    │ 서울 여의도... │ │
│  │ P003   │ 노트북Z  │ 삼성전자   │ 삼성전자    │ 서울 강남구... │ │
│  └────────┴────────┴──────────┴──────────┴──────────────┘ │
│                                                          │
│  "삼성전자" 제조사 정보가 P001, P003에 반복 저장됨           │
└──────────────────────────────────────────────────────────┘

         ↓ 정규화 (제조사 정보를 별도 테이블로 분리)

┌──────────────────────────────────────────────────────────┐
│               스노우플레이크 스키마의 차원 테이블            │
│                                                          │
│  ┌────────┐        ┌─────────────────┐                    │
│  │ 제조사   │        │   제조사_정보    │                    │
│  │ (차원)  │───────<│ - 제조사키(PK)   │                    │
│  └────┬───┘        │ - 제조사명       │                    │
│       │            │ - 대표자명       │                    │
│       │            │ - 전화번호       │                    │
│       │            │ - 주소           │                    │
│       │            └─────────────────┘                    │
│       │                                                     │
│  ┌────┴────────┐        ┌─────────────────┐               │
│  │ 제품_차원    │        │   브랜드_정보     │               │
│  │ (정규화)    │───────<│ - 브랜드키(PK)    │               │
│  ├─────────────┤        │ - 브랜드명        │               │
│  │ 제품키(PK)  │        └─────────────────┘               │
│  │ 제품명      │                                           │
│  │ 브랜드키(FK)│                                           │
│  │ 제조사키(FK)│                                           │
│  └─────────────┘                                           │
└──────────────────────────────────────────────────────────┘

다이어그램 해석: 제품 차원 테이블에서 "제조사명, 제조사 주소" 같은 제조사 정보가 반복되는 것을 볼 수 있습니다. 스노우플레이크 스키마에서는 이 정보를 제조사_정보라는 별도의 차원 테이블로 분리합니다. 이는 제3정규형(3NF)의 "이행적 함수 종속(Transitive Functional Dependency) 제거" 원칙을 적용한 것입니다.


Ⅱ. 스노우플레이크 스키마의 계층 구조

스노우플레이크 스키마에서 차원 테이블은 하위 차원 테이블들로 분해됩니다. 이 분해가 중첩되면 중첩될수록 모양이 눈송이처럼 복잡해집니다.

[스노우플레이크 스키마 전체 구조]

                    ┌──────────────┐
                    │   시간_차원   │
                    │ (정규화 가능) │
                    └──────┬───────┘
                           │
            ┌──────────────┼──────────────┐
            │              │              │
            │              │              │
    ┌───────┴───────┐ ┌────┴────┐ ┌──────┴──────┐
    │   제품_차원    │ │ 지점_차원 │ │   고객_차원  │
    │ (하위 정규화) │ │ (하위 정규화)│ │ (하위 정규화)│
    └───────┬───────┘ └────┬────┘ └──────┬──────┘
            │              │              │
    ┌───────┴───────┐      │     ┌───────┴───────┐
    │  브랜드_정보   │      │     │   지역_정보    │
    │ (정규화)      │      │     │   (정규화)     │
    └───────┬───────┘      │     └───────┬───────┘
            │              │              │
    ┌───────┴───────┐      │              │
    │  제조사_정보   │      │              │
    │ (정규화)      │      │              │
    └───────────────┘      │              │
                          │              │
                    ┌──────┴───────┐
                    │  판매_팩트    │
                    │  (중심)       │
                    └──────────────┘

시간 차원의 정규화도 가능합니다. "년_코드 > 분기_코드 > 월_코드 > 주_코드 > 일_코드"처럼 계층이 명확한 경우, 각 수준을 별도의 테이블로 분리할 수 있습니다. 그러나 실제로는 시간 차원은 대부분 비정규화 상태로 유지하는 것이 일반적입니다. 시간은 분석에서 너무 빈번하게 사용되어, 조인 비용이 오히려 성능 저하를 유발하기 때문입니다.


Ⅲ. 스노우플레이크 vs 스타: 구조적 비교

[스타 스키마 vs 스노우플레이크 스키마 비교]

┌─────────────────────┬────────────────────┬────────────────────┐
│       항목           │     스타 스키마       │   스노우플레이크     │
├─────────────────────┼────────────────────┼────────────────────┤
│ 차원 테이블 구조      │ 비정규화 (플랫)       │ 정규화 (계층적)      │
├─────────────────────┼────────────────────┼────────────────────┤
│ 저장 공간            │ 중복으로 인해较多     │ 정규화로 인해较少    │
├─────────────────────┼────────────────────┼────────────────────┤
│ 조인 횟수           │ 최소 (차원 수만큼)     │ 증가 (하위 테이블 수) │
├─────────────────────┼────────────────────┼────────────────────┤
│ 질의 성능           │ 일반적으로 우수       │ 조인 오버헤드로稍低   │
├─────────────────────┼────────────────────┼────────────────────┤
│ 데이터 무결성        │ 중복으로 인해 변경 시 │ 정규화로 인해 유지 쉬움│
│                     │ 이상 발생 가능        │                     │
├─────────────────────┼────────────────────┼────────────────────┤
│ 유지보수 용이성      │ 차원 추가/수정 용이   │ 구조 변경 시 다중 테이블│
│                     │                     │ 영향 고려 필요        │
├─────────────────────┼────────────────────┼────────────────────┤
│ 복잡성              │ 단순, 직관적          │ 복잡, 이해 어려울 수  │
└─────────────────────┴────────────────────┴────────────────────┘

실무적 선택 기준:

  1. 차원 테이블 규모가 작을 때: 차원 테이블 자체가 소규모(수천~수만 행)라면, 정규화所带来的 저장 공간 절감이 미미합니다. 이 경우 스타 스키마의 단순성이 더 나은 선택입니다.

  2. 차원 테이블 규모가 클 때: "제조사_정보_가 수백만 개의 제품 행에 중복"처럼 중복이 심각하다면, 스노우플레이크 스키마를 고려할 수 있습니다.

  3. 자주 변경되는 차원: "고객 등급, 제품 카테고리"처럼 자주 변경되는 정보는 정규화하여 **변경 이상(Update Anomaly)**을 방지하는 것이 좋습니다.

  4. OLAP 도구 지원: 일부 OLAP 도구는 스노우플레이크 스키마의 복잡한 조인을 최적화하지 못할 수 있습니다. 사용 중인 OLAP 도구의 특성을 고려해야 합니다.


Ⅳ. 스노우플레이크 스키마의 변형: 갈라찬 스키마(Galaxy Schema)

실무에서는 때로는 하나의 팩트 테이블이 여러 차원 테이블의 조합을 참조하는 구조가 필요합니다. 이 구조를 갈라찬 스키마(Galaxy Schema) 또는 **버스 스키마(Bus Schema)**라고 합니다.

예를 들어, "판매_팩트" 테이블과 "재고_팩트" 테이블이 동일한 시간, 지점, 제품 차원을 공유하는 경우입니다. 이 공유 차원들을 **일관된 차원(Conformed Dimension)**이라고 부릅니다.

[갈라찬 스키마 예시]

        ┌─────────────────────────────────────┐
        │       공유 차원 (Conformed)          │
        │   시간_차원   │   지점_차원   │ 제품_차원 │
        └─────────────────────────────────────┘
                    │       │       │
          ┌─────────┘       │       └─────────┐
          │                 │                 │
    ┌─────┴─────┐     ┌─────┴─────┐     ┌─────┴─────┐
    │  판매_팩트  │     │  재고_팩트  │     │ 환불_팩트   │
    │ (매출,수량) │     │ (현재고,    │     │ (환불건수,  │
    │            │     │  입고량)    │     │  환불금액)  │
    └────────────┘     └────────────┘     └────────────┘

Ⅴ. 스노우플레이크 스키마의 실제 적용과 📢 비유

데이터 Vault(Modeling)와의 비교: 기업 데이터 웨어하스를 설계할 때 스노우플레이크 외에 **데이터 볼트(Data Vault)**라는 기법도 있습니다. 데이터 볼트는 "허브(Hub), 링크(Link), 샙플(Satellite)" 구조로 데이터의 追踪可能性(Lineage)과 유연성을 강조합니다. 스노우플레이크가 정규화에 초점을 맞춈 반면, 데이터 볼트는 변경에 강한 구조를 지향합니다.

하이브리드 접근: 많은 기업에서는 스타 스키마와 스노우플레이크 스키마의 하이브리드를 사용합니다. 자주 사용하는 차원은 비정규화(스타)하고, 대규모이고 자주 변경되는 차원만 정규화(스노우플레이크)합니다.

📢 섹션 요약 비유: 스노우플레이크 스키마는 **"도서관의 상세目録 카드에 비유"**할 수 있습니다. 스타 스키마가 "이 책은 3층 A구역에 있습니다"(비정규화, 직접 접근)라면, 스노우플레이크는 "3층 A구역은 humanities楼层의 literature 구역에 있습니다. humanities楼层은 본관의 3번째 층입니다."(정규화, 계층적 참조)입니다. 정보를 찾는 데 조회가 더 필요하지만, 정보의 중복이 적고 일관성이 유지됩니다. 도서관 규모가 작다면目録 카드가 오히려 방해가 되듯, 데이터 규모와 사용 패턴에 따라 적절한 전략을 선택해야 합니다.