티스토리 뷰
🔷 3정규형(Third Normal Form, 3NF)이란?
✅ 정의
3정규형은 데이터베이스 정규화 과정에서 테이블이 이행적 종속(transitive dependency)을 제거하여 데이터 무결성을 보장하는 단계입니다. 이행적 종속이란 기본키(A)가 속성 B를 결정하고, B가 또 다른 속성 C를 결정(A → B, B → C)할 때, C가 A에 간접적으로 종속되는 경우를 말합니다. 3NF는 A가 C를 직접 결정해서는 안 된다는 철학을 바탕으로, 데이터 중복을 최소화하고 논리적 독립성을 유지합니다. 테이블이 3NF를 만족하려면 다음 조건을 충족해야 합니다:
- 1NF 조건: 테이블이 제1정규형을 만족해야 함(모든 속성이 원자값을 가짐).
- 2NF 조건: 테이블이 제2정규형을 만족해야 함(부분 함수 종속이 없음).
- 3NF 조건: 테이블에 이행적 종속이 없어야 함. 즉, 기본키가 아닌 속성이 다른 비기본키 속성에 종속되지 않아야 하며, 기본키가 비기본키 속성을 직접 결정하지 않도록 설계.
✅ 이행적 종속
🔷 이행적 종속의 정의
이행적 종속은 기본키(A)가 속성 B를 결정하고(A → B), B가 또 다른 속성 C를 결정(B → C)하는 경우입니다. 이로 인해 C는 A에 간접적으로 종속(A → C)되지만, 3NF는 A가 C를 직접 결정하지 않도록 요구합니다. 예를 들어, 학번 → 학과
, 학과 → 학과_위치
라면, 학번 → 학과_위치
는 간접적 종속입니다.
🔷 왜 문제인가?
이행적 종속은 A가 C를 간접적으로 결정하게 되어 데이터 중복을 초래하고, 삽입/갱신/삭제 이상을 유발합니다. 이는 기본키가 모든 비기본키 속성을 직접 결정해야 한다는 데이터베이스 설계 철학을 위반하며, 데이터 무결성과 유지보수성을 해칩니다.
🔷 어떤 원칙/철학을 위반하는가?
이행적 종속은 데이터 무결성, 최소 중복성, 그리고 논리적 독립성을 위반합니다. A → B → C 구조에서 A가 C를 직접 결정하면, C는 A와 독립적으로 관리될 수 없으며, 불필요한 종속 관계로 인해 데이터 구조가 비효율적입니다. 3NF는 각 속성이 기본키에 직접 종속되어 독립적으로 관리되도록 보장합니다.
🔷 예시
❌ 1. 이행적 종속 위반 예시
테이블명: 학생정보
설계 의도: 학생의 학번, 이름, 학과, 학과 위치를 저장하려 했음.
실패 원인: 학번이 학과를 결정하고, 학과가 학과_위치를 결정하여 이행적 종속 발생.
- 문제 분석:
학번 → 학과
,학과 → 학과_위치
로 인해학번 → 학과_위치
가 이행적 종속.- 학번은 학과_위치를 직접 결정하지 않아야 하나, 현재 구조는 이를 위반.
- 컴퓨터과의
학과_위치
(서울)가 중복 저장됨.
✅ 2. 이행적 종속 제거 예시
테이블명 1: 학생
테이블명 2: 학과
- 해결:
학과_위치
를 별도 테이블로 분리하여 학번이 학과_위치를 간접적으로 결정하지 않도록 함. 데이터 중복 감소 및 논리적 독립성 보장.
✅ 오해할 만한 것들
- A(기본키) → B → C
- 이 경우는 이행적 종속을 의미하며, A가 C를 간접적으로 결정하므로 3NF를 위반합니다.
- 예:
학번 → 학과 → 학과_위치
. 학번은 학과_위치를 직접 결정해서는 안 됨.
- A(기본키) → B(기본키) → C
- 이 경우는 이행적 종속이 아님. B가 기본키라면 C는 A 또는 B에 독립적으로 종속될 수 있음.
- 예:
주문번호(PK) → 고객ID(PK) → 고객이름
. 고객ID는 독립적인 키로, 고객이름을 직접 결정.
✅ 이상(Anomaly)
🔷 삽입 이상(Insertion Anomaly)
- 정의: 필요한 데이터를 삽입할 때, 불필요한 데이터도 함께 삽입해야 하는 경우.
- 원인: 이행적 종속으로 기본키가 특정 속성을 간접 결정.
- 예시:
- 테이블:
학생정보
(위반 예시 테이블 사용) - 새로운 학과(예: 화학과, 대구)를 추가하려면, 학번과 이름을 포함한 학생 데이터가 필요.
- 문제: 학번이 학과_위치를 간접 결정하므로 학과 정보만 독립적으로 추가 불가능.
🔷 갱신 이상(Update Anomaly)
- 정의: 데이터를 갱신할 때, 동일한 정보가 여러 행에 중복되어 불일치가 발생.
- 원인: 이행적 종속으로 인해 기본키가 아닌 속성이 중복 저장.
- 예시:
학생정보
테이블에서 컴퓨터과의 학과_위치가 "서울"에서 "인천"으로 변경됨.- 모든 컴퓨터과 행(S001, S002)을 갱신해야 하며, 일부만 갱신하면 불일치 발생.
🔷 삭제 이상(Deletion Anomaly)
- 정의: 특정 데이터를 삭제할 때, 의도치 않게 다른 중요한 데이터도 삭제됨.
- 원인: 기본키가 이행적 종속 속성을 간접 결정.
- 예시:
학생정보
테이블에서 학번 S003(전자과)을 삭제하면, 전자과의 정보(부산)도 삭제.- 문제: 학과_위치가 학번에 간접 종속되어 독립적으로 유지 불가능.
✅ 해결 방법
🔷 정의
3NF로 정규화하려면 이행적 종속을 제거하여 기본키가 모든 비기본키 속성을 직접 결정하도록 테이블을 분해합니다.
- 기본키가 아닌 속성이 다른 비기본키 속성에 종속되지 않도록 분리.
- 각 테이블은 독립적인 엔터티를 나타내며, 외래키로 연결.
- 기본키가 간접적으로 속성을 결정하지 않도록 보장.
🔷 예시
원본 테이블: 학생정보
(위의 이행적 종속 위반 예시)
정규화 후:
1. 학생 테이블
2. 학과 테이블
- 외래키:
학생
테이블의학과
는학과
테이블의학과
를 참조. - 효과: 학번이 학과_위치를 간접 결정하지 않도록 분리, 데이터 중복 제거, 이상 방지.
✅ 2NF와의 차이점
🔷 2NF 정의
- 2NF는 테이블이 부분 함수 종속(partial functional dependency)을 제거한 상태.
- 기본키의 일부 속성에 종속된 비기본키 속성이 없어야 함.
🔷 2NF와 3NF 차이점
- 2NF: 기본키의 부분에 종속된 속성을 제거(복합키 관련).
- 3NF: 기본키가 비기본키 속성을 간접적으로 결정하지 않도록 이행적 종속 제거.
🔷 예시
❌ 1. 2NF 위반 예시
테이블명: 수강정보
설계 의도: 학생의 수강 정보(학번, 과목, 강사)를 저장하려 했음.
- 문제:
- 기본키는
(학번, 과목)
이지만,강사
는과목
에만 종속(부분 함수 종속). 데이터베이스
과목의 강사(이교수)가 중복 저장됨.
✅ 2. 2NF로 정규화
테이블 1: 수강
테이블 2: 과목
- 효과: 부분 함수 종속 제거.
❌ 3. 3NF 위반 예시
테이블명: 주문정보
- 문제:
고객ID → 고객등급
,주문번호 → 고객ID
이므로주문번호 → 고객등급
은 이행적 종속. 주문번호가 고객등급을 간접 결정.
✅ 4. 3NF로 정규화
테이블 1: 주문
테이블 2: 고객
- 효과: 주문번호가 고객등급을 간접 결정하지 않도록 분리.
✅ 결론 및 요약
🔷 철학적 의의
3NF는 데이터베이스의 효율성, 무결성, 논리적 독립성을 보장합니다. 기본키가 비기본키 속성을 간접적으로 결정하지 않도록 설계함으로써 데이터 중복과 이상을 제거하고, 각 속성이 독립적으로 관리되도록 합니다. 이는 변화하는 요구사항에 유연하게 대응할 수 있는 설계를 제공합니다.
🔷 표로 내용 요약
3NF는 기본키가 속성을 간접 결정하지 않도록 하여 데이터의 논리적 독립성과 효율성을 보장합니다.
'자격증 > 정보처리기사' 카테고리의 다른 글
정규화:2유형과 3유형 정리 (0) | 2025.04.15 |
---|---|
정규화: 제2유형 vs 제 3유형 헷갈릴 수 있는 상황! (0) | 2025.04.15 |
제2정규형(2NF) 완전 정복 (0) | 2025.04.15 |
데이터베이스 트렌젝션과 그 성질 (0) | 2025.04.15 |
제1정규형 (1NF) - 데이터베이스 정규화 (0) | 2025.04.15 |
- Total
- Today
- Yesterday
- 일본어문법무작정따라하기
- 회계
- C
- 인지부조화
- 코딩테스트
- C/C++
- 데이터분석
- 일본어
- 열혈프로그래밍
- 일문따
- stl
- 파이썬
- 티스토리챌린지
- K-MOOC
- 오블완
- 통계학
- 뇌와행동의기초
- 여인권
- 통계
- Python
- 인프런
- 강화학습
- c++
- 사회심리학
- 류근관
- 보세사
- 윤성우
- 정보처리기사
- 백준
- 심리학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |