정규화 (Normalization)
- 관계형 데이터베이스 설계에서 데이터를 주요 관심사 별로 분산/분리시키는 것
목적
- 데이터 중복 최소화
- 이상현상(anomaly) 제거
- 입출력 데이터의 양을 줄여 성능을 향상시킨다.
정규화를 통한 성능 향상 전략
- 데이터베이스에서 데이터를 처리할 때 나타나는 성능은 입력/수정/삭제 성능과 조회 성능 두 부류로 나뉜다.
- 데이터 모델을 구성하는 방식에 따라 두 부류의 성능이 trade-off 되어 나타난다.
- 정규화 수행 시, 입력/수정/삭제 성능이 향상되며, 조회 성능은 처리 조건에 따라 향상될 수도, 저하될 수도 있다.

- 데이터는 속성 간의 함수 종속성에 근거하여 정규화 되어야 한다.
함수 종속성 (FD; Functional Dependency)
- 결정자의 값으로 종속자의 값을 알 수 있는 것
- 어떤 테이블에 X,Y라는 속성이 있을 때, X의 한 값이 Y의 오직 하나의 값에만 사상된다면 Y는 X에 함수 종속(Y is funcionally dependent on X)이라고 하며 X->Y라고 표기한다.
- 이때 X를 결정자, Y를 종속자라고 한다.
- 예를 들어, X가 생일, Y가 나이라고 했을 때, 생일을 알고 있다면 나이 필드를 참조하지 않아도 나이를 알 수 있다.
- 릴레이션이 정규화된 정도
- 정규형의 차수가 높아질 수록 제약조건이 많아지고 엄격해진다.
- ex) 3NF : 1,2,3 정규형의 특성을 모두 갖춘 릴레이션
제 1 정규형(1NF)
- 모든 속성은 반드시 하나의 값만 가진다.
- 1차 정규화 : 다중값 속성 분리. row 단위의 중복, column 단위의 중복 모두 1차 정규화의 대상
제 2 정규형(2NF)
- 1NF를 만족하며, 모든 속성은 기본키에 종속되고, 일부 기본키에만 종속되지 않는다.
- 2차 정규화 : 부분 함수 종속성 제거 - 일부 기본키에만 종속된 속성을 분리
- 부분 함수 종속

제 3 정규형(3NF)
- 2NF를 만족하고, 기본키가 아닌 다른 속성들끼리 종속되지 않는다.
- 3차 정규화 : 이행 함수 종속성 제거 - 서로 종속 관계가 있는 일반속성을 분리
- 이행 함수 종속

- 3NF를 만족하고, 함수 종속 관계에서 모든 결정자가 후보키이다.
- 보이스코드 정규화 : 결정자 함수 종속성 제거 - 후보키가 아닌 결정자를 분리
- 결정자 함수 종속

📚 참고