1. 정규화 (Normalization)
- 정규화(Normalization)란 관계형 데이터베이스 설계에서 데이터의 중복을 최소화하고, 무결성을 보장하기 위해 데이터를 구조화하는 프로세스를 말합니다.
- 잘못 설계된 테이블 속성 간의 종속성을 제거하여, 데이터가 중복되거나 이상 현상이 생기지 않도록 테이블을 분해하는 과정입니다.
→ "데이터를 성격에 맞게 가장 작은 단위로 깔끔하게 쪼개는 작업"입니다.
1-1. 제1 정규형 (1NF)
테이블의 컬럼 값은 반드시 원자값(Atomic Value)이어야 하며, 반복되는 그룹(Repeating Group)이 존재해서는 안 된다.
→ "칸 하나에 값 하나만 담아라."

원자값(Atomic Value) 확보: 한 컬럼에 여러 개의 값이 들어간 경우(예: 수업 컬럼에 '헬스, 골프'), 이를 분리하여 하나의 컬럼에는 반드시 하나의 값만 저장되도록 구조를 개선해야 합니다.

반복되는 그룹 제거: '수업1', '수업2'처럼 동일한 성격의 속성이 가로로 나열된 구조는 반복되는 그룹에 해당합니다. 이러한 설계는 수업 개수가 늘어날 때마다 테이블 구조(Schema)를 변경해야 하는 비효율을 초래합니다. 또한, 수업을 적게 듣는 회원의 경우 빈 공간이 NULL값으로 채워져 불필요한 저장 공간을 낭비하게 되므로, 행(Row) 단위로 분리하여 데이터의 유연성을 확보해야 합니다.
1-2. 제2 정규형 (2NF)
- 기본키가 2개 이상의 컬럼으로 이루어진 복합키(Composite Key)일 때 발생합니다.
- 모든 컬럼이 부분 함수 종속 제거한 완전 함수적 종속 관계여야 한다.
- 기본키 전체가 아니라, 그중 일부분(Partial)에만 종속되는 컬럼이 있다면 별도 테이블로 분리해야 합니다.
→ "PK의 일부에만 종속된 데이터를 분리하자."

📝 부분 함수 종속성(Partial Functional Dependency) 제거
완전 함수 종속 상태 확립: 현재 테이블의 기본키(PK)가 복합키(이름 + 수업)로 구성된 경우, 모든 일반 컬럼은 이 두 조각의 결합 전체에 의존해야 합니다. 하지만 '수강료'처럼 기본키의 일부인 '수업'에만 종속되는 컬럼이 존재한다면, 이는 부분 함수 종속 상태로 간주합니다. 이 경우 '수업'을 기본키로 하는 별도의 테이블을 생성하여 분리하는 것이 관리 효율성과 데이터 무결성 측면에서 타당합니다. 기본키 전체와 관련이 없는 속성은 해당 테이블의 본질에서 벗어난 정보이므로 반드시 분리해야 합니다.
1-3. 제3 정규형 (3NF)
기본키가 아닌 일반 컬럼끼리 종속 관계(이행적 함수 종속)가 있다면 분리해야 합니다.
→ "PK가 아닌 데이터에 종속되는 데이터를 분리하자."

이행적 함수 종속: 현재 테이블 구조를 보면 회원ID(PK)가 등급을 결정하고(A → B), 다시 그 등급이 할인율을 결정하는(B → C) 구조입니다. 즉, 할인율은 기본키에 직접 종속되는 것이 아니라 등급이라는 일반 속성을 거쳐서 종속되는 이행적 함수 종속 상태에 있습니다. 기본키인 회원ID만으로는 할인율을 직접 결정할 수 없으므로, 이는 제3 정규형 위배에 해당합니다. 따라서 결정자 역할을 하는 등급과 그에 종속된 할인율을 별도의 테이블로 분리하여 데이터의 독립성을 확보해야 합니다.
2. 역정규화 (Denormalization)
정규화가 잘 된 DB는 데이터의 정확성(정합성)은 좋지만, 조회(SELECT) 시 치명적인 단점이 발생할 수 있습니다. 바로 과도한 JOIN 때문입니다.
왜 역정규화를 하는가?
테이블이 너무 잘게 쪼개져 있으면, 정보 하나를 보려 할 때 수많은 테이블을 JOIN 해야 합니다.
이는 CPU와 메모리를 많이 소모하고, 쿼리를 복잡하게 만들어 조회 성능을 저하시킵니다.
결국 "쓰기 성능과 데이터 정확성을 조금 희생하더라도, 읽기 속도를 극한으로 올리기 위해" 역정규화를 수행합니다.

게시글의 댓글 수 예시
게시판 목록에서 '댓글 수'를 함께 보여줘야 한다고 가정해 봅시다.
정규화 상태 - 게시글 1개를 불러올 때마다 댓글 테이블을 뒤져서 COUNT()를 해야 합니다. (게시글이 100개면 100번 카운트) -> 느림
역정규화 적용 - 게시글 테이블에 댓글수 컬럼을 강제로 추가(중복 저장)합니다. 댓글이 달릴 때마다 이 숫자를 +1 해줍니다. -> 매우 빠름 ⭐
'DB' 카테고리의 다른 글
| [DB] Transaction, ACID (0) | 2026.01.14 |
|---|---|
| [DB] DDL, DML, DCL (0) | 2026.01.05 |