릴레이션을 분해하여 데이터 중복과 3가지 갱신 이상(Update Anomaly)을 최소화하는 과정
정규화 과정을 거치지 않은 데이터베이스에서, 데이터가 불필요하게 중복되어 릴레이션 조작 시 예상치 못한 문제가 발생하는 현상
데이터를 저장(삽입)할 때, 의도하지 않은 다른 데이터를 함께 저장해야 하는 현상
데이터(=특정 애트리뷰트의 값 혹은 튜플 전체)를 수정할 때, 동일한 데이터가 반복적으로 저장되어 있어 그 중 일부만 수정하면 데이터의 불일치가 발생하는 현상
데이터를 삭제할 때, 의도하지 않은 다른 데이터를 함께 삭제해야 하는 현상
데이터 삽입/수정/삭제 시 발생할 수 있는 이상 현상(Update Anomaly)을 제거할 수 있다.
정규화된 데이터베이스에 새로운 애트리뷰트를 추가할 때, 테이블 구조 변경을 최소화할 수 있다.
데이터베이스와 연결된 응용 프로그램에 최소한의 영향만을 미친다.
하나의 릴레이션을 여러 개로 분할하므로 릴레이션 간의 Join 연산이 증가할 수 있다. => 이로 인해 성능 저하 발생 시 역정규화(De-Normalization) 적용 가능
분할 후의 릴레이션으로 원래의 릴레이션을 재구성하지 못할 가능성이 있다.
테이블의 모든 컬럼은 원자값(Atomic Value, 하나의 값)을 갖는다.
다음은 제 1 정규형을 만족하지 않는 테이블의 예시입니다.
(과목 번호, 과목 이름, 학점 컬럼에 2개의 애트리뷰트 값 저장 = 반복 그룹 존재)

테이블에 존재하는 모든 반복 그룹을 새로운 테이블에 저장하고, 기존 테이블의 기본키를 새로운 테이블에 애트리뷰트로 추가합니다.

제 1 정규형을 만족하는 테이블의 예시입니다. (학생 테이블과 수강 테이블로 분할)
하지만 학생 테이블과 수강 테이블 모두 여전히 삽입/수정/삭제 이상이 발생합니다.
학생 테이블에서 특정 학과에 소속된 마지막 학생 튜플을 삭제하면 해당 학과에 대한 정보 자체가 삭제되는 삭제 이상
수강 테이블에서 특정 과목을 수강한 마지막 수강 튜플을 삭제하면 해당 과목에 대한 정보 자체가 삭제되는 삭제 이상
한 학과에 소속된 학생 수만큼 학과 번호와 이름이 중복되어 저장되므로, 학과 번호나 이름이 변경되었을 때 해당 학과에 속한 모든 학생들의 데이터를 변경해야 데이터 일관성이 유지되는 수정 이상
한 과목을 수강한 학생 수만큼 과목 번호와 과목 이름이 중복되어 저장되므로, 과목 번호나 이름이 변경되었을 때 해당 과목을 수강한 모든 학생들의 데이터를 변경해야 데이터 일관성이 유지되는 수정 이상
테이블이 제 1 정규형을 만족하면서, 기본키와 후보키를 제외한 모든 컬럼이 기본키에 대해 완전 함수 종속을 만족한다.
부분적 종속 (Partial Dependency)을 제거해야 한다는 의미 => 기본키가 2개 이상의 컬럼으로 구성된 경우, 기본키의 부분집합(일부) 만으로 다른 컬럼의 값을 결정할 수 없어야 한다.
따라서 제 2 정규형은 기본키가 2개 이상의 컬럼으로 구성된 테이블에 대해서만 수행한다.
다음은 제 2 정규형을 만족하지 않는 테이블의 예시입니다.
(해당 테이블에서 학점은 학번과 과목 번호를 모두 알아야 접근할 수 있으므로 (학번, 과목 번호)가 기본키이지만, 과목 이름은 과목 번호만 알아도 접근 가능 => 부분적 종속)

부분적 종속이 발생하는 컬럼과 해당 컬럼의 값을 결정하는 컬럼을 새로운 테이블에 저장합니다.

테이블이 제 2 정규형을 만족하면서, 기본키가 아닌 모든 컬럼이 기본키에 이행적으로 종속하지 않는다.
다음은 제 3 정규형을 만족하지 않는 테이블의 예시입니다.
(기본키인 학번은 해당 학생이 속한 학과 번호를 결정하고(A->B), 학과 번호는 학과 이름을 결정하며(B->C), 따라서 학번은 학과 이름 역시 결정(A->C))

이행적 종속 관계를 만드는 컬럼 A, B, C 중 A와 C가 다른 테이블에 속하도록 새로운 테이블을 만들고, B를 해당 테이블의 기본키로 설정합니다.

테이블이 제 3 정규형을 만족하면서, 모든 결정자가 후보키에 속한다.
다음은 BCNF 정규형을 만족하지 않는 테이블의 예시입니다.
(수강 테이블에서 기본키는 (학번, 과목번호)이므로 교수는 후보키에 속하지 않지만, 그럼에도 불구하고 해당 교수가 담당하는 과목 번호를 알 수 있음 => 후보키에 속하지 않는 컬럼이 다른 컬럼의 값을 결정)

후보키에 속하지 않지만 다른 컬럼의 값을 결정하는 컬럼을 새로운 테이블로 분리합니다.


제 4 정규형과 제 5 정규형의 경우, 성능 이슈 등 정규화의 단점이 명확하게 드러날 가능성이 있어 일반적으로는 고려하지 않습니다. 따라서, 해당 내용은 이 글에서 다루지 않습니다.