정규화 - 1NF, 2NF, 3NF, BCNF

정규화란? #

데이터를 효율적으로 관리하기 위해 데이터를 여러 테이블로 나누고, 데이터 중복과 이상 현상을 최소화해 데이터의 일관성을 유지하는 과정

정규화의 목표를 정리하자면 다음과 같다.

  • 데이터 중복 줄이기 : 불필요하게 반복해서 저장하지 않게 함
  • 데이터 무결성 유지 : 삽입, 삭제, 갱신 시 일관성 있게 데이터가 유지됨
  • 이상 현상 방지 : 삽입, 삭제, 갱신 시 발생 가능한 Anomalies 방지
  • DB 성능 최적화 : 필요한 데이터만 저장하고, 데이터를 효율적으로 검색하고 수정 가능함

이상 현상이란..? #

정규화를 통해 방지하려는 주요 이상 현상들이다.

  • 삽입 이상(Insertion Anomaly) : 데이터 삽입 시 불필요한 데이터를 함께 삽입해야 하는 문제
  • 갱신 이상(Update Anomaly) : 데이터의 일부만 갱신해 데이터 불일치가 발생 가능한 문제
  • 삭제 이상(Deletion Anomaly) : 데이터를 삭제할 때 의도치 않은 정보도 함께 삭제되는 문제

정규형 #

1NF - <반복되는 속성 및 그룹 속성 제거> #

  • 목적 : 각 컬럼이 _Atomic Value_만을 가지도록 하여, 컬럼에 여러 값이 들어가는 것을 방지한다.
  • 조건
    • 모든 컬럼 값이 원자값이어야 하며, 각 셀에 단일 값만 포함되어야 한다.
    • 반복 그룹(한 컬럼에 여러 개의 값이 있는 경우)이나 중첩된 집합이 없어야 한다.
학생ID이름전화번호
1김철수010-111-222, 010-333-444
2이영희010-555-666

전화번호 컬럼에 여러 값이 포함되어 있으므로 다음과 같이 변경한다.

학생ID이름전화번호
1김철수010-111-222
1김철수010-333-444
2이영희010-555-666

전화번호 컬럼을 여러 행으로 나눠 각 행이 하나의 전화번호만 포함하도록 해 원자값을 갖도록 한다.


2NF - <부분 함수 종속성 제거> #

  • 목적 : 부분 함수 종속성을 제거해 데이터의 중복을 줄이고, 데이터의 일관성을 유지한다. 기본 키의 일부가 아닌 전체에 종속되도록 해 데이터 변경 시 일관성을 높인다.
  • 조건
    • 1NF를 만족한다.
    • 기본 키가 복합 키인 경우, 부분 함수 종속성이 없어야 한다.
    • 즉, 비기본 키 속성이 기본 키 전체에 종속되어야 한다.

1NF만 만족한 Table

학생ID과목ID과목명교수명
1A101수학김교수
1B202영어박교수
2A101수학김교수
2B202영어박교수

과목명과 교수명은 과목ID에 종속되며, 학생ID와는 무관하다.

즉, 부분 함수 종속이 발생해 2NF를 만족하지 않으므로 다음과 같이 변경한다.

학생-과목 관계 Table

학생ID과목ID
1A101
1B202
2A101
2B202

과목 Table

과목ID과목명교수명
A101수학김교수
B202영어박교수

과목ID가 과목명과 교수명을 결정하도록 테이블을 분리해 부분 함수 종속성을 제거했다. 과목명과 교수명 정보가 중복되지 않음으로써 변경 시 한 곳에서만 수정할 수 있다.


3NF - <이행 함수 종속성 제거> #

  • 목적 : 이행적 종속성을 제거해 데이터의 일관성을 높이고, 데이터 중복을 줄인다. 비기본 키 속성이 다른 비기본 키 속성에 의존하지 않도록 한다.
  • 조건
    • 2NF를 만족한다.
    • 비기본 키 속성이 다른 비기본 키 속성에 이행적 종속성을 가지면 안된다.
과목ID교수명교수연락처
A101김교수010-111-222
B202박교수010-333-444

교수연락처는 교수명에 종속되어 있으며, 과목ID를 통해 간접적으로 결정된다.

즉, 이행적 종속이 발생했으므로 다음과 같이 변경한다.

과목 Table

과목ID교수명
A101김교수
B202박교수

교수 Table

교수명교수연락처
김교수010-111-222
박교수010-333-444

BCNF - <결정자가 후보키가 아닌 함수 종속성(FD) 제거> #

  • 목적 : 후보 키가 아닌 속성의 의해 결정되는 문제를 제거해 데이터 무결성을 보장한다.
  • 조건
    • 3NF를 만족한다.
    • 모든 결정자가 후보 키가 되도록 만든다.
      • 비후보 키가 결정자 역할을 하는 상황을 방지한다.
    • 복합키를 사용하는 테이블에서 발생하는 문제를 해결하는 데 활용된다
강의ID교수ID학생ID
L101P01S01
L102P02S01
L101P01S02
L103P03S03

강의ID가 교수ID를 결정하지만, 강의ID와 학생ID의 조합이 기본 키로 사용되고 있다.

따라서 비후보 키인 강의ID가 교수ID를 결정하는 종속성이 발생해 다음과 같이 변경한다.

강의-교수 Table

\[각 강의에 대한 고정된 교수 정보를 저장\]
강의ID교수ID
L101P01
L102P02
L103P03

강의-학생 Table

\[각 학생이 수강하는 강의 정보를 저장\]
강의ID학생ID
L101S01
L101S02
L102S01
L103S03