RDBMS의 정규화에 대해 설명해주세요.
RDBMS의 정규화
자료 손실이나 불필요한 정보의 도입 없이 데이터 일관성, 데이터 중복을 최소화하고 최대의 데이터 안정성 확보를 위한 안정적 자료 구조로 변환하기 위해서 하나의 테이블을 둘 이상으로 분리하는 작업이다.
정규화를 하는 이유는 이상 현상(삽입, 삭제, 갱신 이상)이 방지 하기 위함이다.
- 이상 현상
정규화를 적절히 하지 않은 DB 또는 Relation(Table)에 데이터가 중복되고 이 Table에 어떠한 작업을 할 때 비합리적인 문제들이 발생하는 현상
-> 삽입 이상 :
구분 | 내용 |
---|
삽입이상 | 없는 컬럼 데이터가 있는 경우에 데이터를 테이블에 저장할 때, 불필요한 데이터도 넣어야하는 경우 |
삭제이상 | A컬럼과 B컬럼이 별개의 데이터인데 한 열에 있어 데이터를 테이블에서 삭제할 때, 원하지 않는 데이터도 같이 삭제되는 경우 |
갱신이상 | A컬럼에 있는 B컬럼의 데이터를 수정할 때 기존에 B컬럼의 데이터가 없어지는 경우 |
정규화는 총 6단계가 있으며 상위 단계의 정규화는 하위 단계의 정규화를 만족하고 있다.
- 제1정규화
각 컬럼이 하나의 속성 만을 가져야 하기 때문에 모든 속성 값이 원자 값을 갖도록 분해

- 제2정규화
기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해
※ 지도교수는 NO(학생번호)와는 직접적인 관련이 없고 과목에 종속되어 있는 컬럼이기 때문에 학생 정보 & 과목, 교수명으로 분해

- 제3정규화
기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 하기 때문에 기본키가 아닌 속성이 기본키에 직접 종속하도록 분해
※ 이행 종속성이란 A->B, B->C 일 때 A->C 가 성립하는 경우
ex) ID -> 등급 -> 할인율

- BCNF(보이스-코드 정규화)
3.5 정규화라고도 부르며 후보키 집합에 없는 컬럼이 결정자가 되지 않도록 분해
※ 후보키 집합이 아닌 칼럼이 결정자가 되어버린 상황을 BCNF를 만족하지 않는다
※ 같은 과목이나 교수가 다른 경우가 있기 때문에 아래와 같이 분해

- 제4정규화
기본키 컬럼을 기준으로 데이터를 가지고 있는 경우 다치 종속이 발생할 수 있는데 다치 종속이 되지 않도록 분해
※ 같은 A컬럼에 B컬럼/C컬럼이 여러개 있는 경우, B컬럼/C컬럼은 독립적이느 관계이다.

- 제5정규화
Project Join Normal Form(PJNF)라고도 부르며 조인 종속(분해 후 다시 조인 했을 때 동일한 값이 나오는 것)이 없도록 분해하는 것이다.
일반적으로 제3정규화까지만 사용하며 제5정규화는 사용하지 않는다.
참조 블로그
1. 정규화 + 유형_p.2
2. 정규화 + 이상 + 유형 p.2
3. 정규화