데이터베이스 정규화 메모
데이터베이스에서 정규화란 데이터의 중복을 최소화하고, 데이터 무결성을 개선하기 위해 데이터를 정규형에 맞도록 구조화하는 과정을 의미한다.
일반적(비공식적)으로 관계형 데이터베이스에서 제 3정규화를 완료하면 해당 데이터베이스가 정규화 되었다고 판단한다. 3NF 테이블의 대부분이 삽입, 변경, 삭제 이상이 없으며, 3NF 테이블의 대부분이 BCNF, 4NF, 5NF를 만족하기 때문이다.
이상 현상 (Anomaly)
불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산에 발생하는 부작용
- 삽입 이상 : 데이터 삽입시 의도하지 않은 값까지 추가해야 데이터가 삽입되는 현상
- 갱신 이상 : 속성값 갱신 시 일부 튜플만 갱신되어 모순이 발생하는 현상
- 삭제 이상 : 데이터 삭제 시 의도와 다른 값들까지 삭제되는 현상
제 1정규화 (1NF) : 하나의 속성에 하나의 값
각 속성에는 하나의 값(원자값)만 존재해야 하므로, 하나의 필드에 여러 값이 필요한 경우 각각 별도의 튜플로 나타내야 한다.제 2정규화 (2NF) : 부분 함수 종속 제거
기본키(primary key)에 속하지 않은 속성 모두가 기본키에 완전 함수 종속이어야 한다.
복합키인 경우 기본키의 일부에만 종속된 속성을 제거(부분 함수 종속 제거)
모든 비기본 키 속성이 기본 키 전체에 종속되어야 한다.제 3 정규화 (3NF) : 이행 함수 제거
기본키가 아닌 모든 속성이 기본키에만 직접적으로 종속되어야 하며, 다른 속성에 종속되지 않도록 해야 한다. 다른 속성을 거치는 간접적인 종속을 제거BCNF (보이스-코드 정규화) : 후보키만 결정자
모든 결정자가 후보키여야 한다. 어떤 속성이 다른 속성을 결정할 때, 그 결정자는 반드시 후보키의 일부여야 한다.제 4정규화 (4NF) : 다치 종속 제거
관계가 없는 둘 이상의 속성이 공통된 기본키에 대해 1:N관계를 가지지 않게 분리해야 한다.제 5정규화 (5NF) : 조인 종속 제거(이용)
후보키로부터 유도되지 않는 조인 종속은 제거하기 위해 분리해야 한다.
각 속성에는 하나의 값만 존재한다.
| 학번 | 이름 | 과목 | 점수 |
|---|---|---|---|
| 1001 | 홍길동 | 수학, 영어 | 95, 88 |
| 1002 | 김철수 | 수학 | 85 |
| 학번 | 이름 | 과목 | 점수 |
|---|---|---|---|
| 1001 | 홍길동 | 수학 | 95 |
| 1001 | 홍길동 | 영어 | 88 |
| 1002 | 김철수 | 수학 | 85 |
과목속성이 여러 값을 가질 수 있기에 과목은 원자값을 가지지 않음과목속성의 값을 분리제 1 정규형을 만족하면서, 기본키(primary key)에 속하지 않은 속성 모두가 기본키에 완전 함수 종속이여야 한다.
| 학번 | 과목 | 이름 | 점수 |
|---|---|---|---|
| 1001 | 수학 | 홍길동 | 95 |
| 1001 | 영어 | 홍길동 | 88 |
| 학번 | 이름 |
|---|---|
| 1001 | 홍길동 |
| 1002 | 김철수 |
| 학번 | 과목 | 점수 |
|---|---|---|
| 1001 | 수학 | 95 |
| 1001 | 영어 | 88 |
학번 + 과목 이름은 과목에는 독립적이면서 학번에만 종속적이기 때문에 중복이 발생이름을 분리해 부분 함수 종속을 제거제 2 정규형을 만족하면서, 이행적 함수 종속성이 없어야 한다.
| 사원ID | 부서ID | 부서명 |
|---|---|---|
| 1 | 101 | 인사부 |
| 2 | 102 | 개발부 |
| 3 | 101 | 인사부 |
사원ID → 부서ID → 부서명: 이행적 종속 존재| 사원ID | 부서ID |
|---|---|
| 1 | 101 |
| 2 | 102 |
| 3 | 101 |
| 부서ID | 부서명 |
|---|---|
| 101 | 인사부 |
| 102 | 개발부 |
부서ID는 사원ID에 종속적이고, 부서명은 부서ID에 종속적부서명 변경시 불필요하게 사원ID가 필요해지는 상황 발생사원ID와 부서명을 분리하여 이행적 종속 제거제 3 정규형이 강화된 형태로 테이블 내의 모든 결정자가 후보키가 되어야 한다.
| 학생ID | 강의명 | 교수명 |
|---|---|---|
| 1 | DB | 이교수 |
| 2 | OS | 김교수 |
| 3 | DB | 이교수 |
강의명 → 교수명이지만 강의명은 후보키가 아님| 강의명 | 교수명 |
|---|---|
| DB | 이교수 |
| OS | 김교수 |
| 학생ID | 강의명 |
|---|---|
| 1 | DB |
| 2 | OS |
| 3 | DB |
교수명은 학생ID에 이행적 종속이 없으며, 강의명에 종속적
강의를 담당한 교수명이 수정되면 모든 튜플에 대한 수정이 일어나야 함 -> 데이터 불일치 가능성 : 수정 이상
학생이 모두 강의를 취소한 경우 강의-교수 관계 정보가 데이터베이스 내에서 사라지게 됨 -> 삭제 이상
테이블을 분리하여 후보키가 아닌 강의명 속성을 후보키로 설정
제 3정규형 또는 BCNF를 만족하면서, 다치 종속성이 없어야 한다.
| 학생ID | 언어 | 자격증 |
|---|---|---|
| 1 | 영어 | 정보처리기사 |
| 1 | 일본어 | 정보처리기사 |
| 1 | 영어 | 컴퓨터활용능력 |
| 1 | 일본어 | 컴퓨터활용능력 |
| 학생ID | 언어 |
|---|---|
| 1 | 영어 |
| 1 | 일본어 |
| 학생ID | 자격증 |
|---|---|
| 1 | 정보처리기사 |
| 1 | 컴퓨터활용능력 |
| 학생ID | 언어 | 자격증 |
|---|---|---|
| 1 | 영어 | 정보처리기사 |
| 1 | 영어 | 컴퓨터활용능력 |
| 1 | 영어 | ERP |
| 1 | 영어 | CAD |
| 1 | 일본어 | 정보처리기사 |
| 1 | 일본어 | 컴퓨터활용능력 |
| 1 | 일본어 | ERP |
| 1 | 일본어 | CAD |
| 1 | 불어 | 정보처리기사 |
| 1 | 불어 | 컴퓨터활용능력 |
| 1 | 불어 | ERP |
| 1 | 불어 | CAD |
| 학생ID | 언어 |
|---|---|
| 1 | 영어 |
| 1 | 일본어 |
| 1 | 불어 |
| 학생ID | 자격증 |
|---|---|
| 1 | 정보처리기사 |
| 1 | 컴퓨터활용능력 |
| 1 | ERP |
| 1 | CAD |
제 4정규형을 만족하면서, 조인 종속성이 없어야 한다.
| 제품ID | 부품 | 공급업체 |
|---|---|---|
| A | 나사 | 철물상사 |
| A | 고무패킹 | 철물상사 |
| A | 나사 | 산업마트 |
| A | 고무패킹 | 산업마트 |
| 제품ID | 부품 |
|---|---|
| A | 나사 |
| A | 고무패킹 |
| 제품ID | 공급업체 |
|---|---|
| A | 철물상사 |
| A | 산업마트 |
| 부품 | 공급업체 |
|---|---|
| 나사 | 철물상사 |
| 나사 | 산업마트 |
| 고무패킹 | 철물상사 |
| 고무패킹 | 산업마트 |
제품ID, 부품, 공급업체속성이 각기 관계가 있어 3개 이상의 관계로 표시가 가능제품ID-부품부품-공급업체제품ID-공급업체제품ID + 부품 + 공급업체)로부터 유도되지 않음(함수 종속 X) -> 조인 종속성 존재정규화 하기 전 위험성
제품ID와 공급업체 모두 필요 -> 일부만으로 추가 불가