| 이유 | 설명 |
|---|---|
| 데이터 중복 최소화 | 동일한 정보가 여러 테이블에 반복 저장되면 업데이트가 어려움 |
| 데이터 일관성 유지 | 중복된 데이터 중 하나만 변경되어도 불일치 발생 가능 |
| 데이터 무결성 확보 | 잘못된 데이터 삽입/수정/삭제 방지 |
| 관리 용이성 향상 | 구조가 명확해져 쿼리, 유지보수, 확장이 쉬워짐 |
| 단점 | 설명 |
|---|---|
| JOIN이 많아짐 | 테이블이 여러 개로 나뉘므로 쿼리가 복잡 |
| 성능 저하 가능성 | 읽기(SELECT) 시 여러 테이블을 합쳐야 해서 속도 저하 가능 |
| 실무에서는 부분정규화(De-normalization) | 성능을 위해 일부 중복 허용하기도 함 |
모든 속성(컬럼)이 원자값(Atomic Value)을 가져야 한다.
| 학생ID | 이름 | 수강과목 |
|---|---|---|
| 1 | 홍길동 | DB, 알고리즘 |
| 2 | 김철수 | 자료구조 |
→ 수강과목에 여러 값(DB, 알고리즘)이 들어있어요. 즉, 하나의 칸에 여러 값이 들어가 있음 → 원자성이 깨졌음.
| 학생ID | 이름 | 수강과목 |
|---|---|---|
| 1 | 홍길동 | DB |
| 1 | 홍길동 | 알고리즘 |
| 2 | 김철수 | 자료구조 |
→ 이제 각 속성이 하나의 값만 가지죠.
1NF를 만족하면서, 기본키의 부분집합이 결정자가 되지 않도록 한다. 즉, 부분 함수 종속 제거.
| 학생ID | 과목ID | 학생이름 | 과목이름 | 점수 |
|---|
→ 기본키는 (학생ID, 과목ID) 하지만 학생이름은 학생ID에만 종속, 과목이름은 과목ID에만 종속 → 부분 종속 발생 ❌