06 정규화
06 정규화
1. 이상현상
1. 이상현상
- 정규화되지 않은 테이블에서 데이터의 중복이나 종속성 문제로 인해 데이터의 일관성·무결성이 깨지는 현상
- 3가지 종류
종류 | 설명 | 예시 | 결과 |
---|---|---|---|
삽입 이상 (Insertion Anomaly) | 새로운 데이터를 삽입할 때 불필요한 데이터까지 함께 입력해야 하거나, 입력 자체가 불가능한 상황 | 예: 새 교수(‘최교수’)를 등록하려면, 반드시 학생 정보도 있어야 함 | 독립적 데이터 삽입 불가 |
수정 이상 (Update Anomaly) | 중복된 데이터가 여러 행에 있어서, 한 곳만 수정하면 데이터 불일치 발생 | 예: ‘박교수’가 ‘박철수’로 바뀌었는데 한 행만 수정됨 | 데이터 불일치 발생 |
삭제 이상 (Deletion Anomaly) | 특정 데이터를 삭제할 때 원하지 않는 다른 정보까지 함께 삭제되는 현상 | 예: 학생 한 명의 수강 정보 삭제 시, 해당 과목과 교수 정보까지 사라짐 | 데이터 손실 발생 |
2. 케이스
1
2
3
4
5
6
학생(Student)
────────────────────────────
학번 | 이름 | 과목1 | 과목2 | 교수1 | 교수2
────────────────────────────
1 | 김유진 | DB | OS | 박교수 | 이교수
2 | 이현우 | DB | 네트워크 | 박교수 | 최교수
- 수정 이상(Update Anomaly) : 박교수 이름을 ‘박철수’로 바꾸려면 모든 행을 수정해야 함.
- 삽입 이상(Insertion Anomaly) : 새로운 교수만 등록하려면 학생 정보가 없어서 입력 불가.
- 삭제 이상(Deletion Anomaly) : 학생 1명을 삭제했더니, 해당 교수 정보도 같이 사라짐.
2. 종속성
1. 종속성
- 어떤 속성 A의 값이 주어지면, 다른 속성 B의 값이 오직 하나로 결정되는 관계,
- 이럴때 “B가 A에 함수적으로 종속(Functional Dependent)”라고 표현
- 수식은 “ A → B “
2. 종속 VS 비종속
1. 종속
학번 | 이름 | 학과 |
---|---|---|
101 | 김유진 | 컴퓨터공학과 |
102 | 이현우 | 전자공학과 |
103 | 박민서 | 컴퓨터공학과 |
- 학번 → 이름
- 학번 → 학과
2. 비종속
학과 | 이름 |
---|---|
컴퓨터공학과 | 김유진 |
컴퓨터공학과 | 박민서 |
- 학과 → 이름
3. 종속의 종류
종류 | 설명 | 예시 |
---|---|---|
완전 함수 종속 (Full Functional Dependency) | 복합키 전체에 의해 다른 속성이 결정됨 | (학번, 과목) → 성적 |
부분 함수 종속 (Partial Functional Dependency) | 복합키의 일부만으로 속성이 결정됨 | (학번, 과목) 중 학번 → 이름 |
이행 함수 종속 (Transitive Functional Dependency) | A→B, B→C가 존재할 때, A→C 관계 | 학번 → 학과, 학과 → 학과장 ⇒ 학번 → 학과장 |
4. note
- 이상현상은 한객의 릴레이션에 두개 이상의 정보가 포함이 되어있을때 발생함.
3. 정규화
1. 정규화
- 데이터의 중복을 줄이고, 이상 현상(Anomaly)을 막기 위해 테이블 구조를 논리적으로 분해하고 정리하는 과정”
- 데이터 일관성과 무결성(Integrity)을 보장하기 위해 필요
- 함수 종속성(Functional Dependency)을 기준으로 테이블을 여러 개로 분해하는 과정
2. 정규화의 단계
단계 | 이름 | 핵심 개념 | 추가 조건 / 목적 | 예시 상황 |
---|---|---|---|---|
1NF | 제1정규형 | 반복되는 속성 제거, 모든 속성은 원자값 | 각 칼럼은 더 이상 쪼갤 수 없는 단일값만 | 주소1, 주소2 같은 컬럼 나누기 |
2NF | 제2정규형 | 부분적 종속 제거 | 기본키가 복합키일 때, 일부 속성만 종속되지 않게 | (학번, 과목) → 점수, 이름은 학번에만 종속 |
3NF | 제3정규형 | 이행적 종속 제거 | A→B, B→C일 때 A→C가 되지 않게 | 학번→학과코드, 학과코드→학과명 → 학과 테이블 분리 |
BCNF | 보이스-코드 정규형 | 모든 결정자가 후보키여야 함 | 제3정규형보다 엄격한 형태 | 후보키가 둘 이상이고, 서로 종속되는 경우 해결 |
4NF | 제4정규형 | 다치 종속(Multi-valued Dependency) 제거 | 한 키에 여러 독립적인 반복 속성이 있을 때 분리 | 학생이 ‘여러 전화번호’와 ‘여러 취미’를 동시에 가질 때 |
5NF | 제5정규형 | 조인 종속(Join Dependency) 제거 | 조인 시 데이터 손실이나 중복 발생하지 않게 | 여러 테이블 조인 시 무의미한 중복 레코드 제거 |
1. 비정규 - 한 칸(속성)에 하나의 값만 저장
1
2
3
4
| 학번 | 이름 | 수강과목 | 담당교수 |
| -- | --- | ------ | -------- |
| 1 | 김유진 | DB, OS | 박교수, 이교수 |
| 2 | 이현우 | DB | 박교수 |
2. 1NF - 한 컬럼(속성)에 하나의 값만 저장되도록 테이블을 분리
1
2
3
4
5
| 학번 | 이름 | 수강과목 | 담당교수 |
| -- | --- | ---- | ---- |
| 1 | 김유진 | DB | 박교수 |
| 1 | 김유진 | OS | 이교수 |
| 2 | 이현우 | DB | 박교수 |
3. 2NF - 이행 종속 제거 (A→B, B→C 관계 제거)
1
2
3
4
5
학생 테이블
| 학번 | 이름 |
| -- | --- |
| 1 | 김유진 |
| 2 | 이현우 |
1
2
3
4
5
6
수강 테이블
| 학번 | 수강과목 | 담당교수 |
| -- | ---- | ---- |
| 1 | DB | 박교수 |
| 1 | OS | 이교수 |
| 2 | DB | 박교수 |
4. 3NF - 수강 테이블 내 과목과 교수 분리
1
2
3
4
5
과목
| 과목명 | 담당교수 |
| --- | ---- |
| DB | 박교수 |
| OS | 이교수 |
1
2
3
4
5
6
수강
| 학번 | 과목명 |
| -- | --- |
| 1 | DB |
| 1 | OS |
| 2 | DB |
4. Note
- 데이터 구조가 지나치게 쪼개져서 조회 성능이 떨어지기 때문에, 일반적인 업무 DB는 3NF 또는 BCNF까지만 적용하는 게 보통
- 상황과 환경에 맞게 적당하게 처리하고 조절해야 함.
This post is licensed under CC BY 4.0 by the author.