← 학습 카테고리

Learn

SQL

32개 모듈 · 현재 14번째

SQL 모듈 14/32 sql-learn-14

웨어하우스 실전 이슈와 흔한 모델링 실수

50 Data Modeling Interview Questions for DEs (2026 Guide) — DataVidhya blog Warehouse Design & Real-World Scenarios, Q44-50 (pp.16-18)

이 모듈을 다 읽으면

  • 차원 테이블에서 NULL 외래 키를 피해야 하는 이유와 처리 방법을 설명할 수 있다
  • 그레인 위반을 탐지하는 SQL 쿼리를 작성할 수 있다
  • 다중 통화 팩트 테이블을 설계할 때 원본 통화를 반드시 보존해야 하는 이유를 설명할 수 있다
  • Kimball과 Inmon 중 상황에 맞게 선택하는 기준을 설명할 수 있다

차원 테이블의 NULL 처리, 그레인 위반 탐지 쿼리, 구체화된 뷰의 활용 시점, 다중 통화 팩트 설계, Inmon vs Kimball 선택 기준, 그리고 실무에서 가장 자주 반복되는 모델링 실수 네 가지를 다룬다.

차원 테이블의 NULL 처리와 그레인 위반 탐지

팩트 테이블에 NULL 외래 키를 절대 남겨두면 안 된다 — JOIN을 깨뜨리고 집계 결과를 일관성 없게 만들기 때문이다. 대신 각 차원 테이블에 전용 '알 수 없음(Unknown)' 또는 '해당 없음(N/A)' 행을 추가하고(보통 서로게이트 키 -1이나 0을 씀), 모든 NULL 외래 키가 그 행을 가리키게 한다. 이렇게 하면 모든 팩트 행이 항상 차원 행에 JOIN되고, BI 도구는 'Unknown'을 명시적인 카테고리로 필터링할 수 있다.

그레인 위반(중복 행)은 다음과 같은 쿼리로 탐지한다: 그레인을 구성하는 컬럼들로 GROUP BY 하고 `HAVING COUNT(*) > 1`을 적용한다. 그레인 위반은 웨어하우스에서 지표가 부풀려지는 가장 큰 원인이며, 이 쿼리가 행을 반환한다면 파이프라인에 버그가 있다는 뜻이다 — 대개 중복 제거 단계 누락이나 행을 팬아웃시키는 잘못된 JOIN이 원인이다.

핵심 포인트

  • 팩트 테이블의 NULL 외래 키는 차원 테이블에 전용 'Unknown' 행(서로게이트 키 -1 또는 0)을 만들어 가리키게 한다.
  • 그레인을 구성하는 컬럼으로 GROUP BY + HAVING COUNT(*) > 1을 실행하면 그레인 위반(중복)을 탐지할 수 있다.

다중 통화 팩트 테이블, Inmon vs Kimball

다중 통화 팩트 테이블을 설계할 때는 원본(로컬) 통화 금액을 currency_code 외래 키, 그리고 거래 시점의 환율과 함께 저장해야 한다. 그런 다음 계산된 컬럼이나 다운스트림 모델에서 변환된(기준 통화) 금액을 추가한다. 절대 변환된 금액만 저장해서는 안 된다 — 환율은 계속 바뀌므로 그렇게 하면 나중에 재변환할 방법이 사라진다. 환율 차원은 '현재' 환율 하나가 아니라 통화별·일자별로 스냅샷된 테이블(하루에 통화당 한 행)이어야 한다.

Inmon 접근법은 단일하고 중앙화된, 3NF로 정규화된 전사적 데이터 웨어하우스를 먼저 구축한 뒤 특정 업무 영역을 위한 차원 마트를 파생시킨다. Kimball은 차원 마트를 먼저 구축하고 컨포밍 디멘션으로 마트 간 일관성을 확보한다. Inmon은 첫날부터 단일 진실 공급원을 제공하지만 가치 실현까지 시간이 더 걸리고, Kimball은 업무 영역별 결과를 더 빨리 제공하지만 컨포밍 디멘션 거버넌스가 부족하면 불일치 위험이 있다. 2026년 기준으로는 규제가 엄격한 산업에서 단일 정본 모델이 필수인 경우가 아니라면 대부분 Kimball을 기본값으로 삼는다.

핵심 포인트

  • 다중 통화 팩트는 원본 통화 금액 + 거래 시점 환율을 반드시 저장하고, 변환된 금액만 저장해서는 안 된다 — 환율 차원은 일자별 스냅샷이어야 한다.
  • Inmon은 정규화된 중앙 웨어하우스를 먼저 만드는 하향식, Kimball은 컨포밍 디멘션으로 일관성을 확보하는 차원 마트 상향식이며, 2026년 기준 대부분의 조직은 Kimball을 기본값으로 삼는다.

가장 흔한 프로덕션 모델링 실수 네 가지

첫째, 그레인 미정의 — 팀이 한 행이 무엇을 나타내는지 명시적으로 합의하지 않아 중복과 지표 부풀림으로 이어진다. 둘째, 컨포밍 디멘션 생략 — 판매팀과 마케팅팀이 각자 다른 로직으로 dim_customer를 만들어, 경영진이 서로 다른 고객 수 두 가지를 받게 된다. 셋째, 때 이른 역정규화 — 스테이징 계층에서부터 모든 것을 OBT로 평평하게 만들어 요구사항이 바뀔 때 재구조화가 불가능해진다. 넷째, 팩트-차원 JOIN에서 NULL을 방치 — 행이 조용히 누락된다.

이 네 가지는 06~13번 모듈에서 각각 그레인(08번), 컨포밍 디멘션(09번), 정규화/역정규화 계층 전략(06번), NULL 처리(위 섹션)로 이미 다룬 개념들이 실제로 어떻게 실패로 나타나는지를 보여준다. 데이터 모델링을 익힌다는 것은 정의를 암기하는 것이 아니라, 트레이드오프를 설명하고, 무엇이 잘못될 수 있는지 이름 붙이고, 실제 쿼리를 서빙하는 진짜 스키마를 만들어본 경험을 보여주는 것이다.

핵심 포인트

  • 가장 흔한 실수 4가지: 그레인 미정의, 컨포밍 디멘션 생략, 때 이른 역정규화, 팩트-차원 JOIN의 NULL 방치.
  • 이 실수들은 모두 그레인·컨포밍 디멘션·계층 전략·NULL 처리라는 앞선 모듈의 핵심 개념이 실전에서 무너지는 구체적 사례다.