관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상(Anomaly)을 방지하고, 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정을 말함
제 1정규화(1NF)
- 테이블 구성에서 중복 또는 반복, 복합값 등을 포함한 구조를 [제 1정규형이 아닌 테이블] 이라고 함
- 프로그래밍으로 말하자면, 카피 앤 페이스트를 마구 사용한 프로그램과 같은 느낌임
- 테이블 내의 속성값은
원자값
을 가지고 있어야 한다 - 각 컬럼이 하나의 속성만을 가져야 한다.
- 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.
- 각 컬럼이 유일한(unique) 이름을 가져야 한다.
- 컬럼의 순서가 상관없어야 한다.
제 2정규화(2NF)
emp_id(PK) | dept_id(PK) | dept_name | created |
1 | 100 | 인사부 | 2010-01-01 |
2 | 100 | 인사부 | 2010-01-01 |
- 모든 컬럼이 주식별자에 대해 완전 함수 종속이어야 하는데, 부분 함수 종속인 컬럼이 있을때, 제 2정규형이 아닌 테이블임
- 기본 키가 여러 열로 구성(
emp_id
,dept_id
)되어 있고, 그 기본 키 중 일부 열의 값(dept_id
)에 의해서만 결정되는 열이 있는 경우, 해당 테이블을 [제 2정규형이 아닌 테이블] 이라고 함 - 예로, emp_id, dept_id, dept_name, created가 있을 때
- created는 emp_id와 dept_id로 특정이 되지만
- dept_name은 dept_id로만 특정이 되기에 제 2정규형이 될 수없다
- 문제점 : 동일 dept_id인데도 부서명이 서로 다른 레코드가 등록될 가능성이 있다는 것임
부분함수 종속
을 제거한다- 제 1정규형을 만족해야 한다.
- 모든 컬럼이 부분적 종속이 없어야 한다. 즉, 모든 컬럼이 완전 함수 종속을 만족해야 한다
- 부분함수 종속(Partial Functional Dependency) : 기본키가 특정 컬럼에만 종속되는 것을 말함
- 완전 함수 종속(Full Functional Dependency) : 기본키의 부분집합이 결정자가 되어선 안 된다는 것
제 3정규화(3NF)
emp_id(PK) | dept_id | dept_name |
1 | 100 | 인사부 |
2 | 100 | 인사부 |
- 원칙적으로 테이블의 모든 열은 기본 키 값에 따라 단 하나로 결정되어야 함
dept_id
는 PK 가 아니지만,dept_name
의 경우dept_id
에 따라 결정되므로 기본 키의emp_id
와는 직접 관련이 없음
- 이러한 상황에서는 같은 dept_id라도 dept_name이 다를 수 있다는 문제가 있음
이행 함수 종속
을 제거한다- 제 2정규형을 만족해야 한다
- 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다
- 이행 함수 종속(Transitive Functional Dependency) : A → B, B → C 일 때 A → C 를 만족하면 이행 함수 종속이라고 함
- 즉 A랑 B가 연관이 되고, B와 C가 연관이 될 때, A가 C랑도 연관이 되면, A-B와 B-C는 테이블이 분리되어야 함
보이스 코드 정규화 (BCNF)
결정자가 후보키가 아닌 함수 종속을 제거한다
- 제 3정규형을 만족해야 한다
- 모든 결정자가 후보키 집합에 속해야 한다 ↔ 모든 컬럼이 참여하여 고유하게 하나의 행을 가리키게 해야 함(이행함수 종속이랑 비슷한거같은데..?)
제 4정규화 (4NF)
다치 종속
을 제거한다- BCNF를 만족해야 한다
- 다중값 종속(다치 종속 = Multi-valued Dependency)이 없어야 한다
- 같은 테이블 내의 독립적인 두 개 이상의 컬럼이 또 다른 컬럼에 종속되는 것을 말함
제 5정규화 (5NF)
조인 종속
을 제거한다- 4NF를 만족해야 한다
- 더 이상 비손실 분해를 할 수 없어야 한다
- 조인 종속(Joint Dependency) : 하나의 릴레이션을 여러 개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생기는 것을 말함. 조인 종속성은 다치 종속의 개념을 더 일반화한 것임