정규화란? #
데이터를 효율적으로 관리하기 위해 데이터를 여러 테이블로 나누고, 데이터 중복과 이상 현상을 최소화해 데이터의 일관성을 유지하는 과정
정규화의 목표를 정리하자면 다음과 같다.
- 데이터 중복 줄이기 : 불필요하게 반복해서 저장하지 않게 함
- 데이터 무결성 유지 : 삽입, 삭제, 갱신 시 일관성 있게 데이터가 유지됨
- 이상 현상 방지 : 삽입, 삭제, 갱신 시 발생 가능한 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 | 과목명 | 교수명 |
---|---|---|---|
1 | A101 | 수학 | 김교수 |
1 | B202 | 영어 | 박교수 |
2 | A101 | 수학 | 김교수 |
2 | B202 | 영어 | 박교수 |
과목명과 교수명은 과목ID에 종속되며, 학생ID와는 무관하다.
즉, 부분 함수 종속이 발생해 2NF를 만족하지 않으므로 다음과 같이 변경한다.
학생-과목 관계 Table
학생ID | 과목ID |
---|---|
1 | A101 |
1 | B202 |
2 | A101 |
2 | B202 |
과목 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 |
---|---|---|
L101 | P01 | S01 |
L102 | P02 | S01 |
L101 | P01 | S02 |
L103 | P03 | S03 |
강의ID가 교수ID를 결정하지만, 강의ID와 학생ID의 조합이 기본 키로 사용되고 있다.
따라서 비후보 키인 강의ID가 교수ID를 결정하는 종속성이 발생해 다음과 같이 변경한다.
강의-교수 Table
\[각 강의에 대한 고정된 교수 정보를 저장\]강의ID | 교수ID |
---|---|
L101 | P01 |
L102 | P02 |
L103 | P03 |
강의-학생 Table
\[각 학생이 수강하는 강의 정보를 저장\]강의ID | 학생ID |
---|---|
L101 | S01 |
L101 | S02 |
L102 | S01 |
L103 | S03 |