데이터베이스 1,2,3 정규화
정규화는 중복 최소화와 데이터 무결성 확보를 위해 필수적인 개념입니다.
1NF, 2NF, 3NF 각각 1정규화 부터 3정규화까지의 원칙과 예시를 통해 학습 해보겠습니다.
1. 정규화란?
정규화(Normalization) 는 관계형 데이터베이스에서 중복을 줄이고 데이터 일관성을 유지하기 위해 테이블을 구조적으로 분해하는 과정입니다.
- 중복 데이터 제거
- 이상현상(삽입, 삭제, 갱신 이상) 방지
- 데이터 무결성 유지
- 유지 보수 용이
정규화는 단계적으로 진행되며 1NF -> 2NF -> 3NF 까지 적용하는것이 일반적입니다.
1NF : 제 1정규화 (원자값)
1정규화는 모든 속성이 원자값(Atomic Value)만 가져야 한다는 원칙 입니다.
원자값이란 하나의 셀에는 하나의 값만 있어야 한다는 뜻입니다.
1정규화 위반 예시
학생ID | 이름 | 수강과목 |
---|---|---|
1 | 홍길동 | 수학, 영어 |
2 | 이몽룡 | 과학 |
- 1번학생의
수강과목
컬럼에 수학과 영어라는 값 2개가 존재
1정규화 적용
학생ID | 이름 | 수강과목 |
---|---|---|
1 | 홍길동 | 수학 |
1 | 홍길동 | 영어 |
2 | 이몽룡 | 과학 |
2NF : 제 2정규화 (부분함수 종속 제거)
2NF는 1NF를 만족하면서 테이블의 기본키를 제외한 속성이 모두 기본키에 종속되어야 한다는 원칙 입니다.
2정규화 위반 예시
학생ID | 과목 | 교수이름 |
---|---|---|
1 | 수학 | 김교수 |
1 | 영어 | 이교수 |
- 이 테이블의 PK는 (학생 ID, 과목) 으로 이루어진 복합키 형태
- 교수이름은 과목에 종속적인 성격이라 복합키(학생 ID, 과목) 에서 학생에는 종속적이지 않음
2정규화 적용
학생 수강 테이블
학생ID | 과목 |
---|---|
1 | 수학 |
1 | 영어 |
교수 과목 테이블
과목 | 교수이름 |
---|---|
수학 | 김교수 |
영어 | 이교수 |
- 과목정보와 교수이름을 따로 관리하는 테이블 생성하여 부분 종속성 제거
3NF : 제 3정규화 (이행적 함수 종속성 제거)
3NF는 2NF를 만족하고 기본키가 아닌 컬럼이 다른 일반적인 속성에 종속되지 않아야 하는 원칙 입니다.
3정규화 위반 예시
학생ID | 학과ID | 학과이름 |
---|---|---|
1 | 10 | 컴퓨터공학 |
2 | 20 | 경영학 |
- 테이블의 기본키는
학생ID
라고 할때 학과 ID는 학생ID에 종속적이고 학과이름은 학과ID에 종속적입니다. - 학과이름 => 학과ID => 학생ID : 이행적 종속
3정규화 적용
학생 정보 테이블
학생ID | 학과ID |
---|---|
1 | 10 |
2 | 20 |
학과 정보 테이블
학과ID | 학과이름 |
---|---|
10 | 컴퓨터공학 |
20 | 경영학 |
2. 이상현상 방지와 정규화의 필요성
정규화의 목적중 하나는 이상현상(Anomaly)을 방지하는 것입니다.
이상현상이란 데이터의 중복 또는 구조적 결함때문에 정상적인 데이터 삽입/수정/삭제가 불가능하거나 이상하게 동작하는 것입니다.
이상현상의 종류
유형 | 설명 |
---|---|
삽입 이상 | 데이터 일부만으로는 삽입 불가능 (예: 교수이름만 알고 있는데 과목이 없으면 못 넣음) |
삭제 이상 | 하나의 정보 삭제가 다른 정보까지 제거함 (예: 수강정보 삭제 시 교수이름까지 삭제) |
갱신 이상 | 중복 데이터가 많아 일괄 수정이 어려움 (예: 교수이름 수정 시 여러 행을 수정해야 함) |
삽입 이상
학생ID | 학생명 | 수강과목 |
---|---|---|
1 | 철수 | 수학 |
2 | 영희 | 영어 |
위와 같은 테이블이 있을때 새로운 과목만 추가하고 싶을경우 문제가 발생합니다.
학생ID가 기본키이기 때문에 기본키를 채우지 않고 일반 속성의 데이터만 삽입할수는 없기 때문입니다.
제 2정규화(부분함수 종속 제거) 방식으로 과목을 관리하는 테이블을 별도로 생성하여 관리하면 됩니다.
과목ID | 과목명 |
---|---|
1 | 수학 |
2 | 영어 |
3 | 과학 |
삭제 이상
학생ID | 학생명 | 수강과목 |
---|---|---|
1 | 철수 | 수학 |
2 | 영희 | 영어 |
학생정보 테이블에서 영희의 영어 수강을 취소할경우 행을 삭제하면 영희의 데이터가 전부 삭제되어 데이터 손실이 발생합니다.
제 2정규화 (부분함수 종속 제거)를 통해서 해결할수 있습니다.
학생 테이블
학생ID | 학생명 |
---|---|
1 | 철수 |
2 | 영희 |
수강 테이블
학생ID | 과목 |
---|---|
1 | 수학 |
2 | 영어 |
이처럼 학생ID를 FK로 사용하는 수강 테이블을 별도로 관리하면 해결 가능합니다.
'DB' 카테고리의 다른 글
[ORACLE] SID, ServiceName 개념과 차이점 (0) | 2024.11.06 |
---|---|
[DB] ORACLE, MYSQL 날짜, 시간 관련 함수 (0) | 2023.10.10 |
댓글