💡 핵심 인사이트
정규화(Normalization)는 데이터의 찌꺼기(중복)를 완벽하게 없애주는 명약이지만, **테이블을 너무 잘게 찢어놓아 나중에 데이터를 조회(SELECT)할 때 수많은 테이블을 본드로 다시 붙여야 하는 '조인(Join) 오버헤드 폭발'이라는 부작용(성능 저하)**을 낳습니다.
이를 해결하기 위해, 찢었던 테이블을 의도적으로 다시 합치거나 엑셀처럼 중복을 허용해 버리는 더러운(?) 타협안이 바로 **'반정규화(De-normalization)'**입니다.
Ⅰ. 정규화의 역설 (읽기 성능의 지옥)
"테이블을 3NF, BCNF까지 찢었더니 데이터가 너무 깨끗해졌어요! (INSERT, UPDATE 속도 최상)"
하지만 웹 서비스의 현실은 다릅니다. 사용자가 쇼핑몰에서 상품을 조회(SELECT)하는 행위가 90%고, 회원 정보를 수정(UPDATE)하는 행위는 10%도 안 됩니다.
- 조회(SELECT)의 고통: 사장님이 "직원 이름과 그 직원이 속한 부서의 전화번호를 뽑아와"라고 지시합니다.
- 뚱뚱한 비정규 테이블에서는 1번만 읽으면 끝났지만, 정규화된 DB에서는
사원 테이블과부서 테이블의 수백만 건 데이터를 메모리에 올려놓고 조건에 맞춰 꿰매는 '조인(Join)' 연산을 해야 합니다. 이 조인 연산이 디스크 I/O와 CPU를 갉아먹으며 서비스 응답 시간을 초토화시킵니다. 이것이 정규화의 역설입니다.
Ⅱ. 반정규화(De-normalization / 비정규화)의 결단
"데이터 중복(쓰레기) 좀 생기면 어때! 당장 고객 화면 띄우는 게 3초나 걸리는데!" DBA와 아키텍트들은 성능(속도)을 살리기 위해, 아름다운 정규화 원칙을 쓰레기통에 던지고 의도적으로 시스템에 데이터 중복을 허락하는 반정규화를 감행합니다.
반정규화 수행 전 필수 원칙
반정규화는 데이터 무결성(일관성)을 스스로 깨부수는 위험한 짓이므로 아무 때나 하면 안 됩니다.
- 무조건 철저한 정규화(3NF 이상)가 100% 완료된 이후에만 수행해야 합니다. (기본 골조도 없이 반정규화부터 하면 나중에 수정할 때 DB가 붕괴됩니다).
- 조인(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초 만에 식사를 끝낼 수 있는 극강의 '조회 퍼포먼스'**를 제공합니다.