# 데이터베이스 정규화

데이터베이스에서 **정규화(Normalization)** 는 테이블을 정리하여 중복 데이터를 최소화하고, 데이터 무결성을 보장하는 과정을 의미함. 이를 통해 데이터 저장 용량을 줄이고, 삽입-갱신.삭제 이상(Anomaly) 현상을 해결할 수 있음. 정규화는 여러 단계가 존재하여, 대표적으로 1정규화(1NF), 2정규화(2NF), 3정규화(3NF), BCNF 가 있음.

### 단계

#### 1. 1 정규화(1NF)

테이블 컬럼의 값이 원자값(Atomic Value)을 가지도록 정리하는 것을 의미함.

#### 2. 2 정규화(2NF)

1 정규화를 진행한 테이블에서 완전 함수 종속을 만족할 수 있도록 테이블을 분해하는 것. 쉽게 표현하면, 기본 키의 일부에만 종속된 속성 없도록 분해하는 것을 의미함. A 속성을 통해서 B 속성의 값이 유일하게 정해지는 관계에서 A 를 **결정자** 라고 함. 가령 사용자 ID 가 기본 키이며 값이 1임. 그리고, 사용자 ID 1번에 대응되는 유일한 이름 속성 값이 "B" 이라고 했을 때, 이름 속성의 결정자는 사용자 ID 임. 2NF 를 만족하기 위해서는 기본키의 부분 집합이 결정자가 될 수 없음.

#### 3. 3 정규화(3NF)

2 정규화를 진행한 테이블에서 이행적 종속을 제거하기 위해 테이블을 분해하는 것을 의미함. A가 B를 결정하고, B가 C를 결정하는 경우에는 A가 C의 결정자가 되는데. 이를 **이행적 종속** 이라고 함. 3NF 을 만족하기 위해서는 이행적 종속이 제거되도록 테이블을 분리해야함.

#### 4. BCNF 정규화

3 정규화를 진행한 테이블의 모든 결정자가 반드시 후보키가 될 수 있도록 테이블을 분해하는 것을 의미함. BCNF 를 만족하기 위해서는 후보키가 아닌 결정자가 존재하지 않도록 테이블을 분리해야함.

### 역정규화

**역정규화(Denormalization)** 는 정규화된 데이터베이스에서 쓰기 성능을  희생하고 읽기 성능을 향상하기 위해 사용되는 전략임. 예를 들어, 전체 게시글의 수나 좋아요의 수를 계산해 특정 컬럼에 저장해서 읽기 성능을 향상 시킬 수 있음. 역정규화된 데이터베이스에서는 데이터의 중복을 허용하기 때문에 데이터의 일관성을 맞추기 위한 추가적인 작업이 필요함.
