[Database] 정규화 (Normalization)와 1NF, 2NF, 3NF, BCNF

Jeongyeon Park·2023년 7월 23일

Database 기본 개념

목록 보기
3/3

1. 데이터베이스 정규화 (Normalization)란?


1) 데이터베이스 정규화의 개념과 필요성

릴레이션을 분해하여 데이터 중복과 3가지 갱신 이상(Update Anomaly)을 최소화하는 과정

  • 릴레이션의 스키마를 함수적 종속성기본키를 기반으로 분석한 후, 데이터 중복 및 갱신 이상이 발견되는 경우 릴레이션을 분해하여 데이터 무결성(Integrity)를 유지한다.

📍 갱신 이상 (Update Anomaly)

정규화 과정을 거치지 않은 데이터베이스에서, 데이터가 불필요하게 중복되어 릴레이션 조작 시 예상치 못한 문제가 발생하는 현상

삽입 이상 (Insertion Anomaly)

데이터를 저장(삽입)할 때, 의도하지 않은 다른 데이터를 함께 저장해야 하는 현상

수정 이상 (Modification/Update Anomaly)

데이터(=특정 애트리뷰트의 값 혹은 튜플 전체)를 수정할 때, 동일한 데이터가 반복적으로 저장되어 있어 그 중 일부만 수정하면 데이터의 불일치가 발생하는 현상

삭제 이상 (Deletion Anomaly)

데이터를 삭제할 때, 의도하지 않은 다른 데이터를 함께 삭제해야 하는 현상


2) 데이터베이스 정규화의 장점

  • 데이터 삽입/수정/삭제 시 발생할 수 있는 이상 현상(Update Anomaly)을 제거할 수 있다.

  • 정규화된 데이터베이스에 새로운 애트리뷰트를 추가할 때, 테이블 구조 변경을 최소화할 수 있다.

  • 데이터베이스와 연결된 응용 프로그램에 최소한의 영향만을 미친다.

3) 데이터베이스 정규화의 단점

  • 하나의 릴레이션을 여러 개로 분할하므로 릴레이션 간의 Join 연산이 증가할 수 있다. => 이로 인해 성능 저하 발생 시 역정규화(De-Normalization) 적용 가능

  • 분할 후의 릴레이션으로 원래의 릴레이션을 재구성하지 못할 가능성이 있다.



2. 1NF, 2NF, 3NF, BCNF


1) 1NF (First Normal Form, 제 1 정규형)

제 1 정규형 만족 조건

테이블의 모든 컬럼은 원자값(Atomic Value, 하나의 값)을 갖는다.

다음은 제 1 정규형을 만족하지 않는 테이블의 예시입니다.
(과목 번호, 과목 이름, 학점 컬럼에 2개의 애트리뷰트 값 저장 = 반복 그룹 존재)

제 1 정규형을 만족하는 예시

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

제 1 정규형을 만족하는 테이블의 예시입니다. (학생 테이블과 수강 테이블로 분할)

하지만 학생 테이블과 수강 테이블 모두 여전히 삽입/수정/삭제 이상이 발생합니다.

  • 학생 테이블에서 특정 학과에 소속된 마지막 학생 튜플을 삭제하면 해당 학과에 대한 정보 자체가 삭제되는 삭제 이상

  • 수강 테이블에서 특정 과목을 수강한 마지막 수강 튜플을 삭제하면 해당 과목에 대한 정보 자체가 삭제되는 삭제 이상

  • 한 학과에 소속된 학생 수만큼 학과 번호와 이름이 중복되어 저장되므로, 학과 번호나 이름이 변경되었을 때 해당 학과에 속한 모든 학생들의 데이터를 변경해야 데이터 일관성이 유지되는 수정 이상

  • 한 과목을 수강한 학생 수만큼 과목 번호와 과목 이름이 중복되어 저장되므로, 과목 번호나 이름이 변경되었을 때 해당 과목을 수강한 모든 학생들의 데이터를 변경해야 데이터 일관성이 유지되는 수정 이상


2) 2NF (Second Normal Form, 제2 정규형)

제 2 정규형 만족 조건

테이블이 제 1 정규형을 만족하면서, 기본키와 후보키를 제외한 모든 컬럼이 기본키에 대해 완전 함수 종속을 만족한다.

  • 부분적 종속 (Partial Dependency)을 제거해야 한다는 의미 => 기본키가 2개 이상의 컬럼으로 구성된 경우, 기본키의 부분집합(일부) 만으로 다른 컬럼의 값을 결정할 수 없어야 한다.

  • 따라서 제 2 정규형은 기본키가 2개 이상의 컬럼으로 구성된 테이블에 대해서만 수행한다.

다음은 제 2 정규형을 만족하지 않는 테이블의 예시입니다.
(해당 테이블에서 학점은 학번과 과목 번호를 모두 알아야 접근할 수 있으므로 (학번, 과목 번호)가 기본키이지만, 과목 이름은 과목 번호만 알아도 접근 가능 => 부분적 종속)

제 2 정규형을 만족하는 예시

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


3) 3NF (Third Normal Form, 제3 정규형)

제 3 정규형 만족 조건

테이블이 제 2 정규형을 만족하면서, 기본키가 아닌 모든 컬럼이 기본키에 이행적으로 종속하지 않는다.

  • 이행적 종속 : A->B, B->C가 성립할 때 A->C가 성립하는 것

다음은 제 3 정규형을 만족하지 않는 테이블의 예시입니다.
(기본키인 학번은 해당 학생이 속한 학과 번호를 결정하고(A->B), 학과 번호는 학과 이름을 결정하며(B->C), 따라서 학번은 학과 이름 역시 결정(A->C))

제 3 정규형을 만족하는 예시

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


4) BCNF (Boyce-Codd Normal Form)

BCNF 정규형 만족 조건

테이블이 제 3 정규형을 만족하면서, 모든 결정자가 후보키에 속한다.

  • 후보키에 속하지 않는 컬럼은 다른 컬럼의 값을 결정할 수 없다.

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

BCNF 정규형을 만족하는 예시

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


🌟 BCNF 정규형까지 만족하는 전체 데이터베이스 구조는 다음과 같습니다.

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


References

0개의 댓글