📝정규화 단계
제 0정규형 (UNF)

데이터가 반복되거나 여러 값이 한 칼럼에 들어 있는 상태입니다.
위 예제는 한 셀에 여러 값이 들어가 있습니다. (N:M 관계상태라고 볼수도 있다 → 1:N, 1:M 형태로 분리 필요)
제 1정규형 (1NF)

모든 속성은 원자값(Atomic value) 이어야 한다.
위 예제는 여전히 Alice라는 이름이 반복되고 있습니다. 또한 Alice 이름 변경 시 해당 학생의 모든 수강 행을 수정해야합니다.
제 2정규형 (2NF)

1NF + 부분 함수 종속제거한 형태로 student_id, course로 유니크한 row를 구분할 수 있었던 걸 하나에만 종속적이게 바꾼 형태입니다.
제 1정규형에서 예제에서 student_id, course를 통해 student_name이 정해지는데 굳이 이럴 필요 없이 student_id만으로 충분하기 때문에 부분함수 종속이라고 볼 수 있고 테이블을 분리 할 수 있습니다.
이러한 부분함수 종속이 있어서 학생이 course를 다 취소하게 되면 student_name하고 course가 같이 저장되어서 student_name도 다 사라지게 됩니다.
부분 함수 종속
- 슈퍼키일 때 해당 슈퍼키의 일부만으로도 하나의 행만 결정되면 부분 함수 종속입니다.
- 학번, 과목이 있지만 학번만으로도 하나의 키가 정해집니다.
함수종속
- X가 같으면 Y가 결정한다.
- 주민번호가 같으면 이름은 반드시 하나입니다.
제 3정규형 (3NF)

2NF + 이행 종속된 상태로 기본키가 아닌 속성이 또 다른 비-키 속성을 거쳐서 결정되는 상황을 의미합니다.
즉, PK가 직접적으로 모든 속성을 결정해야하는데 중간 속성을 통해 결정되는 경우입니다.
위 예제는 student_id라는 걸 통해 dept_id를 알고 dept_id를 통해 dept_name을 알 수 있는 형태입니다.
매핑되는 name이 바뀌게 되면 D10에 매핑되어있는 전체가 다 바뀌게 됩니다. 이럴 경우는 테이블을 분리하는게 맞습니다.
BCNF (Boyce–Codd Normal Form)

3NF + 함수 종속상태일 때 무조건 슈퍼키여야합니다.
위 예제에서 (student_id, course)를 통해 professor가 정해지고 슈퍼키지만 professor를 통해 course가 정해지지만 professor는 슈퍼키가 아니다. 그래서 과목이 바뀌면 여러 행을 동시에 수정해야합니다.
"어떤 필드를 통해 유일한 행을 구할 수 있는가?"에 대한 지속적인 물음을 통해 테이블을 분리시키며 중복을 없애는 방향으로 진행된다.
그 외에도 4정규화, 5정규화, 6정규화가 있지만 아주 테이블이 많이 쪼개지기 때문에 BCNF수준까지만 실무에서 분리시키는게 일반적입니다.