💡 핵심 인사이트
정규화(Normalization)는 데이터의 찌꺼기(중복)를 완벽하게 없애주는 명약이지만, **테이블을 너무 잘게 찢어놓아 나중에 데이터를 조회(SELECT)할 때 수많은 테이블을 본드로 다시 붙여야 하는 '조인(Join) 오버헤드 폭발'이라는 부작용(성능 저하)**을 낳습니다.
이를 해결하기 위해, 찢었던 테이블을 의도적으로 다시 합치거나 엑셀처럼 중복을 허용해 버리는 더러운(?) 타협안이 바로 **'반정규화(De-normalization)'**입니다.


Ⅰ. 정규화의 역설 (읽기 성능의 지옥)

"테이블을 3NF, BCNF까지 찢었더니 데이터가 너무 깨끗해졌어요! (INSERT, UPDATE 속도 최상)" 하지만 웹 서비스의 현실은 다릅니다. 사용자가 쇼핑몰에서 상품을 조회(SELECT)하는 행위가 90%고, 회원 정보를 수정(UPDATE)하는 행위는 10%도 안 됩니다.

  • 조회(SELECT)의 고통: 사장님이 "직원 이름과 그 직원이 속한 부서의 전화번호를 뽑아와"라고 지시합니다.
  • 뚱뚱한 비정규 테이블에서는 1번만 읽으면 끝났지만, 정규화된 DB에서는 사원 테이블부서 테이블의 수백만 건 데이터를 메모리에 올려놓고 조건에 맞춰 꿰매는 '조인(Join)' 연산을 해야 합니다. 이 조인 연산이 디스크 I/O와 CPU를 갉아먹으며 서비스 응답 시간을 초토화시킵니다. 이것이 정규화의 역설입니다.

Ⅱ. 반정규화(De-normalization / 비정규화)의 결단

"데이터 중복(쓰레기) 좀 생기면 어때! 당장 고객 화면 띄우는 게 3초나 걸리는데!" DBA와 아키텍트들은 성능(속도)을 살리기 위해, 아름다운 정규화 원칙을 쓰레기통에 던지고 의도적으로 시스템에 데이터 중복을 허락하는 반정규화를 감행합니다.

반정규화 수행 전 필수 원칙

반정규화는 데이터 무결성(일관성)을 스스로 깨부수는 위험한 짓이므로 아무 때나 하면 안 됩니다.

  1. 무조건 철저한 정규화(3NF 이상)가 100% 완료된 이후에만 수행해야 합니다. (기본 골조도 없이 반정규화부터 하면 나중에 수정할 때 DB가 붕괴됩니다).
  2. 조인(Join)이 너무 많이 걸려 성능 저하가 수치로 명백히 증명되었을 때만 최후의 수단으로 씁니다.

Ⅲ. 주요 반정규화 기법 3가지 (시험 단골)

찢어놨던 것을 합치거나, 없던 컬럼을 대놓고 욱여넣습니다.

1. 테이블 병합 (Table Merge)

  • 1:1, 1:N 관계 병합: 기껏 찢어놨던 사원 테이블과 부서 테이블을 엑셀처럼 그냥 하나의 거대한 뚱뚱한 테이블로 다시 합쳐버립니다. 데이터(부서명)는 1,000번 중복되겠지만, 조인(Join) 연산이 0회가 되어 조회 속도는 미친 듯이 빨라집니다.
  • 슈퍼/서브 타입 병합: EER 모델에서 부모(직원)와 자식(정규직, 계약직)으로 나눈 테이블을 하나로 다 뭉쳐버립니다.

2. 테이블 분할 (Table Partitioning / Split)

  • 수직 분할: 100개의 컬럼이 있는 테이블에서, 자주 보는 '비밀번호, 이름' 컬럼 2개만 뚝 떼어내어 자주 쓰는 핫(Hot) 테이블로 가볍게 분리합니다.
  • 수평 분할: 10년 치 결제 내역 1억 건이 든 뚱뚱한 테이블을, '2023년 데이터', '2024년 데이터'처럼 행(Row) 기준으로 싹둑싹둑 썰어서 쪼개놓습니다. (검색 스캔 범위가 확 줄어 속도 폭발).

3. 중복 컬럼 / 파생 컬럼 추가

  • 중복 컬럼 추가: 조인하기 귀찮으니, 주문 테이블 끄머리에 아예 회원 이름 컬럼을 억지로 하나 더 뚫어놓고 복사해서 박아둡니다.
  • 파생 컬럼 추가 (계산된 값): '1학기 점수'와 '2학기 점수' 컬럼이 있는데, 매번 쿼리로 둘을 더하기(+) 연산하기 귀찮으니 아예 **'총점'**이라는 컬럼을 물리적으로 파서 미리 계산된 결과값을 저장해 둡니다. (디스크 용량은 낭비되지만 CPU 계산 시간을 아낍니다.)

📢 섹션 요약 비유: 정규화가 반찬과 밥을 예쁘게 나눈 **'고급 한정식(깔끔하지만 먹기 번거로움)'**이라면, 반정규화는 이 예쁜 반찬들을 다시 양푼에 다 때려 넣고 고추장과 함께 비벼버린 **'양푼 비빔밥'**입니다. 모양새(무결성)는 개판이 되고 밥알과 나물이 중복해서 섞였지만, **바쁜 직장인(시스템)이 숟가락 한 번(SELECT 1번)만 푹 퍼서 1초 만에 식사를 끝낼 수 있는 극강의 '조회 퍼포먼스'**를 제공합니다.