[database] 정규화(normalization)
Updated:
개요
- 정규화
- 정규형을 통해 이상 현상을 제거해가는 과정
장점
- 이상 현상 제거
- 확장에 용의(구조를 변경하지 않아도 되거나 일부만 변경)
- 어플리케이션과의 영향 최소화
단점
- 릴레이션 분해로 인한 join 연산의 수 증가
- 쿼리 응답 시간 증가 혹은 감소
- 중복 데이터가 하나의 테이블로 집약
- 성능 저하 시 반정규화 고려
이상 현상(anomaly)
- 삽입 이상(insertion anomaly)
- null 혹은 의도와는 다른 값을 입력해야 하는 현상
- 갱신 이상(update anomaly)
- 중복 데이터의 일부만 갱신되는 데이터 불일치 현상
- 삭제 이상(deletion anomaly)
- 의도와는 다른 값까지 연쇄적으로 삭제되는 현상
종속성
- 함수적 종속성(functional dependency)
- a, b 컬럼에 대해 a 값에 의해 b 값이 정해지는 관계
- a를 결정자, b를 종속자 부름
a -> b
로 표현- 완전 함수적 종속성(full functional dependency)
- 종속자가 완전한 기본키에 종속
- 부분 함수적 종속성(partial functional dependency)
- 기본키 중 일부에만 종속
- a~d 컬럼 중 a, b가 기본키일 때 c는 a, b에 종속되고 d는 b에만 종속되는 경우
- a, b, c와 b, d로 테이블을 분해
- 이행적 함수적 종속성(transitive functional dependency)
- a -> b, b -> c일 때 a -> c가 성립
- a, b와 b, c로 테이블을 분해
- 다치 종속성(multi-valued dependency)
- 최소 3개의 컬럼이 존재하고 a -> b일 때 하나의 a값에 여러개의 b값이 존재하며 b와 c가 독립적
- a, b와 a, c로 테이블을 분해
- 조인 종속성(join dependency)
- 하나의 테이블을 n개의 테이블로 분해했다가 다시 결합할 수 있는 경우
- 조인 연산을 했을 때 손실이 없어야 한다
정규형
- 제 1 정규형(1NF)
- 각 컬럼은 유일한 이름을 가져야 한다
- 각 컬럼은 원자 값을 가져야 한다
- 하나의 컬럼은 같은 타입을 가져야 한다
- 컬럼의 순서가 상관없어야 한다
- 제 2 정규형(2NF)
- 제 1 정규형을 만족해야 한다
- 모든 컬럼은 부분 함수적 종속성이 없어야 한다
- 제 3 정규형(3NF)
- 제 2 정규형을 만족해야 한다
- 기본키를 제외한 컬럼들간의 이행적 함수적 종속성이 없어야 한다
- BCNF(Boyce-Codd Normal Form)
- 제 3 정규형을 만족해야 한다
- 후보키 집합에 없은 컬럼이 결정자가 되어서는 안된다
- 제 4 정규형(3NF)
- BCNF를 만족해야 한다
- 다치 종속성이 없어야 한다
- 제 5 정규형(3NF)
- 제 4 정규형을 만족해야 한다
- 조인 종속성이 없어야 한다