[SQLD] 3. 정규화(Normalization)
[SQLD] 3. 정규화(Normalization)
정규화(Normalization)
정의
- 관계형 데이터베이스의 설계에서 중복을 최소화하기 위해 데이터를 구조화하는 프로세스
- 엔터티에 많은 속성이 존재하면 엔터티를 조회할 때마다 많은 양의 데이터가 조회될 수 있음
- 이를 해결하기 위해 하나의 엔터티에 최소한의 데이터만 가질 수 있도록 분해하는 과정
- 데이터베이스 설계 이론에서 E.F. Codd가 1970년대에 제안한 개념
정규화의 주요 목적
- 중복 제거
- 불필요한 데이터 반복을 줄여 저장 공간 최적화
- 동일한 데이터가 여러 테이블이나 레코드에 중복되는 것을 방지
- 일관성 유지
- 데이터 수정, 삽입, 삭제 시 일관성 보장
- 데이터 변경 시 한 곳만 수정하면 되므로 불일치 가능성 감소
- 이상 현상 방지
- 구조적 문제로 인한 데이터 불일치 최소화
- 삽입, 갱신, 삭제 이상 현상 방지
- 유연성 향상
- 변경과 확장에 용이한 구조 설계
- 데이터 구조 변경 시 영향 범위 최소화
정규화의 장단점
장점
- 데이터 중복 최소화로 저장 공간 절약
- 데이터 무결성 유지 용이
- 데이터 구조의 명확성과 일관성 향상
- 데이터베이스 변경 시 유연성 증가
단점
- 테이블 수 증가로 조인 연산 증가
- 복잡한 쿼리 발생 가능성
- 경우에 따라 성능 저하 가능성
- 설계 과정이 복잡해질 수 있음
함수적 종속성
- 데이터베이스 정규화의 기본이 되는 개념
- 속성 A의 값이 결정되면 속성 B의 값이 유일하게 결정될 때, B는 A에 함수적으로 종속된다고 함
- 표기법: A → B (A가 B를 결정한다)
종류
- 완전 함수적 종속: 키의 부분집합이 아닌 키 전체에 종속된 경우
- 부분 함수적 종속: 복합키의 일부에만 종속된 경우
- 이행적 종속: A → B이고 B → C일 때, A → C의 관계가 성립하는 경우
정규화 단계
제1정규화(1NF: First Normal Form)
정의
- 테이블의 모든 속성이 원자값(Atomic Value)만을 가지는 형태
- 각 컬럼이 하나의 값만 가져야 함 (다중값, 복합값, 배열 등 허용 안 함)
예시
1
2
3
4
5
학생 테이블
-------------------------------------------
학번 | 학생명 | 연락처
1 | 홍길동 | 010-1234-5678, 02-123-4567
2 | 이순신 | 010-8765-4321
1NF 적용 후
1
2
3
4
5
6
학생 테이블
-------------------------------------------
학번 | 학생명 | 연락처
1 | 홍길동 | 010-1234-5678
1 | 홍길동 | 02-123-4567
2 | 이순신 | 010-8765-4321
또는
1
2
3
4
5
학생 테이블
-------------------------------------------
학번 | 학생명 | 휴대전화 | 집전화
1 | 홍길동 | 010-1234-5678 | 02-123-4567
2 | 이순신 | 010-8765-4321 | NULL
제2정규화(2NF: Second Normal Form)
정의
- 1NF를 만족하면서 부분 함수적 종속이 없는 형태
- 모든 비주요 속성이 주요 속성(기본키)에 완전 함수적 종속되어야 함
- 복합키를 가진 테이블에서 일부 컬럼이 키의 일부에만 종속되는 경우 발생
예시
1
2
3
4
5
6
수강 테이블
-------------------------------------------
학번 | 과목ID | 학생명 | 과목명 | 성적
1 | CS001 | 홍길동 | 자료구조 | A
1 | CS002 | 홍길동 | 알고리즘 | B
2 | CS001 | 이순신 | 자료구조 | A+
문제점
- (학번, 과목ID)가 기본키
- 학생명은 학번에만 종속 (부분 함수적 종속)
- 과목명은 과목ID에만 종속 (부분 함수적 종속)
2NF 적용 후
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
학생 테이블
-------------------------------------------
학번 | 학생명
1 | 홍길동
2 | 이순신
과목 테이블
-------------------------------------------
과목ID | 과목명
CS001 | 자료구조
CS002 | 알고리즘
수강 테이블
-------------------------------------------
학번 | 과목ID | 성적
1 | CS001 | A
1 | CS002 | B
2 | CS001 | A+
제3정규화(3NF: Third Normal Form)
정의
- 2NF를 만족하면서 이행적 종속이 없는 형태
- 비주요 속성이 다른 비주요 속성에 종속되지 않아야 함
- A → B이고 B → C일 때, A → C의 이행적 종속 제거
예시
1
2
3
4
5
6
학생 테이블
-------------------------------------------
학번 | 학생명 | 학과코드 | 학과명 | 학과전화번호
1 | 홍길동 | CSE | 컴퓨터공학과 | 02-1234-5678
2 | 이순신 | EE | 전자공학과 | 02-2345-6789
3 | 김유신 | CSE | 컴퓨터공학과 | 02-1234-5678
문제점
- 학번 → 학과코드 → 학과명, 학과전화번호의 이행적 종속 관계 존재
- 학과 정보(학과명, 학과전화번호)가 중복 저장됨
- 학과 정보 변경 시 여러 레코드를 수정해야 함
3NF 적용 후
1
2
3
4
5
6
7
8
9
10
11
12
학생 테이블
-------------------------------------------
학번 | 학생명 | 학과코드
1 | 홍길동 | CSE
2 | 이순신 | EE
3 | 김유신 | CSE
학과 테이블
-------------------------------------------
학과코드 | 학과명 | 학과전화번호
CSE | 컴퓨터공학과 | 02-1234-5678
EE | 전자공학과 | 02-2345-6789
BCNF(Boyce-Codd Normal Form)
정의
- 3NF에서 더 강화된 조건으로, 테이블의 모든 결정자가 반드시 후보키(candidate key)여야 함
- 즉, 테이블에서 다른 속성을 결정하는 모든 속성(결정자)은 반드시, 그 테이블의 후보키여야 함
- 결정자가 후보키가 아닌 경우, 테이블을 분해하여 각 결정자가 해당 테이블의 후보키가 되도록 함
예시
1
2
3
4
5
6
강의 배정 테이블
-------------------------------------------
교수ID | 과목ID | 교수명 | 과목명
P001 | CS001 | 김교수 | 자료구조
P002 | CS002 | 이교수 | 알고리즘
P001 | CS003 | 김교수 | 데이터베이스
문제점
- (교수ID, 과목ID)가 기본키
- 교수ID → 교수명 (교수ID가 교수명을 결정)
- 과목ID → 과목명 (과목ID가 과목명을 결정)
- 두 결정자(교수ID, 과목ID) 모두 후보키의 일부이지만, 각각은 후보키가 아님
BCNF 적용 후
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
교수 테이블
-------------------------------------------
교수ID | 교수명
P001 | 김교수
P002 | 이교수
과목 테이블
-------------------------------------------
과목ID | 과목명
CS001 | 자료구조
CS002 | 알고리즘
CS003 | 데이터베이스
강의 배정 테이블
-------------------------------------------
교수ID | 과목ID
P001 | CS001
P002 | CS002
P001 | CS003
제4정규화(4NF: Fourth Normal Form)
정의
- BCNF를 만족하면서 다치 종속성(Multi-valued Dependency)이 없는 형태
- 다치 종속성: 하나의 값이 여러 독립적인 값들과 관계를 가질 때 발생, A → → B로 표기
- 다치 종속성이 발생하면, 테이블을 분해하여 각 다치 종속성을 독립적인 테이블로 분리
예시
1
2
3
4
5
6
7
학생 취미 및 과목 테이블
-------------------------------------------
학번 | 취미 | 수강과목
1 | 축구 | 자료구조
1 | 축구 | 알고리즘
1 | 농구 | 자료구조
1 | 농구 | 알고리즘
문제점
- 학생의 취미와 수강과목은 서로 독립적이지만 모든 조합이 저장됨
- 학번 → → 취미, 학번 → → 수강과목의 다치 종속성 존재
- 불필요한 데이터 중복 발생
4NF 적용 후
1
2
3
4
5
6
7
8
9
10
11
학생 취미 테이블
-------------------------------------------
학번 | 취미
1 | 축구
1 | 농구
학생 수강 테이블
-------------------------------------------
학번 | 수강과목
1 | 자료구조
1 | 알고리즘
제5정규화(5NF: Fifth Normal Form)
정의
- 조인 종속성(Join Dependency)을 제거한 형태
- 테이블이 더 작은 테이블들로 무손실 분해되고, 다시 조인했을 때 원래 테이블로 정확히 복원되는 성질
- 복잡한 다중 테이블 간의 관계에서 발생하는 중복을 제거
- 실무에서는 거의 사용되지 않음
예시
1
2
3
4
5
6
프로젝트 관리 테이블
-------------------------------------------
공급자 | 부품 | 프로젝트
S1 | P1 | J1
S1 | P2 | J2
S2 | P1 | J1
문제점
- 1.특정 공급자(S)가 특정 부품(P)을 제공
- 2.특정 공급자(S)가 특정 프로젝트(J)에 참여
- 3.특정 부품(P)이 특정 프로젝트(J)에 사용
- 공급자-부품-프로젝트 조합이 유효함
- 이러한 복잡한 관계를 하나의 테이블로 표현하면 중복과 이상현상 발생
5NF 적용 후
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
공급자-부품 테이블
-------------------
공급자 | 부품
S1 | P1
S1 | P2
S2 | P1
공급자-프로젝트 테이블
-------------------------
공급자 | 프로젝트
S1 | J1
S1 | J2
S2 | J1
부품-프로젝트 테이블
-------------------------
부품 | 프로젝트
P1 | J1
이상 현상(Anomalies)
삽입 이상(Insertion Anomaly)
정의
- 데이터 삽입 시 불필요한 데이터까지 함께 저장해야 하거나, 특정 데이터가 없어 저장이 불가능한 현상
- 테이블에 불필요한 함수적 종속성이 존재하여 발생
예시
1
2
3
4
5
강좌 테이블
-------------------------------------------
강좌ID | 강좌명 | 교수명 | 교수전화번호 | 강의실
1 | 자료구조 | 김교수 | 02-1234-5678 | 301호
2 | 알고리즘 | 김교수 | 02-1234-5678 | 302호
문제점
- 새로운 강좌를 개설할 때 교수 정보가 없으면 입력 불가
- 교수 정보 없이는 강좌 정보를 저장할 수 없음
- 아직 배정되지 않은 강의실에 대한 강좌 정보 저장 불가
정규화 적용(제 2정규화)
1
2
3
4
5
6
7
8
9
10
강좌 테이블
------------------------
강좌ID | 강좌명 | 교수ID | 강의실
1 | 자료구조 | P001 | 301호
2 | 알고리즘 | P001 | 302호
교수 테이블
------------------------
교수ID | 교수명 | 교수전화번호
P001 | 김교수 | 02-1234-5678
갱신 이상(Update Anomaly)
정의
- 데이터 갱신 시 일부만 갱신되어 데이터 불일치가 발생하는 현상
- 동일한 데이터가 여러 레코드에 중복되어 있을 때 발생
예시
1
2
3
4
5
학생 수강 테이블
-------------------------------------------
학생ID | 학생명 | 강좌ID | 강좌명 | 교수명
1 | 홍길동 | C001 | 자료구조 | 김교수
2 | 이순신 | C001 | 자료구조 | 김교수
문제점
- 교수명 변경 시 모든 관련 레코드를 업데이트해야 함
- 일부만 수정하면 데이터 불일치 발생
- 동일한 강좌에 대한 정보가 중복 저장됨
정규화 적용(제 3정규화)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
학생 테이블
------------------------
학생ID | 학생명
1 | 홍길동
2 | 이순신
수강 테이블
------------------------
학생ID | 강좌ID
1 | C001
2 | C001
강좌 테이블
------------------------
강좌ID | 강좌명 | 교수명
C001 | 자료구조 | 김교수
삭제 이상(Deletion Anomaly)
정의
- 데이터 삭제 시 의도하지 않은 데이터까지 함께 삭제되는 현상
- 삭제하려는 데이터와 보존해야 할 데이터가 같은 레코드에 있을 때 발생
예시
1
2
3
4
5
수강 정보 테이블
-------------------------------------------
학생ID | 학생명 | 전공 | 강좌ID | 강좌명
1 | 홍길동 | 컴퓨터공학 | C001 | 자료구조
2 | 이순신 | 컴퓨터공학 | C002 | 네트워크
문제점
- 특정 학생의 마지막 수강 과목 삭제 시 학생의 전공 정보도 함께 손실
- 특정 강좌를 수강하는 학생이 없으면 강좌 정보도 함께 삭제됨
정규화 적용(제 3정규화형)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
학생 테이블
------------------------
학생ID | 학생명 | 전공
1 | 홍길동 | 컴퓨터공학
2 | 이순신 | 컴퓨터공학
강좌 테이블
------------------------
강좌ID | 강좌명
C001 | 자료구조
C002 | 네트워크
수강 테이블
------------------------
학생ID | 강좌ID
1 | C001
2 | C002
반정규화(Denormalization)
정의
- 성능 향상을 위해 의도적으로 정규화 원칙을 어기는 기법
- 읽기 작업이 많고 데이터 변경이 적은 경우 효과적
- 데이터 중복을 허용하고 조인 연산을 최소화하여 성능 향상
반정규화 방법
- 테이블 병합: 자주 조인되는 테이블을 하나로 통합
- 컬럼 중복: 조인 감소를 위해 중요 컬럼을 중복 저장
- 파생 컬럼 추가: 계산된 값을 미리 저장
반정규화 고려 상황
- 조회 성능이 중요한 데이터 웨어하우스 환경
- 빈번한 집계 연산이 필요한 경우
- 데이터 변경보다 조회가 압도적으로 많은 경우
반정규화 예시
1. 테이블 병합 예시
정규화된 테이블
1
2
3
4
5
6
7
8
9
10
11
주문 테이블
-------------------------------------------
주문ID | 고객ID | 주문일자 | 총액
O001 | C001 | 2024-01-01 | 50000
O002 | C002 | 2024-01-02 | 30000
고객 테이블
-------------------------------------------
고객ID | 고객명 | 등급 | 포인트
C001 | 김고객 | VIP | 5000
C002 | 이고객 | 일반 | 1000
반정규화 후 (테이블 병합)
1
2
3
4
5
주문_고객 통합 테이블
-------------------------------------------
주문ID | 고객ID | 고객명 | 등급 | 포인트 | 주문일자 | 총액
O001 | C001 | 김고객 | VIP | 5000 | 2024-01-01 | 50000
O002 | C002 | 이고객 | 일반 | 1000 | 2024-01-02 | 30000
장점
- 주문 정보 조회 시 조인 연산 불필요
- 고객 정보를 포함한 주문 내역 조회 성능 향상
2. 컬럼 중복 예시
정규화된 테이블
1
2
3
4
5
6
7
8
9
10
게시글 테이블
-------------------------------------------
글ID | 작성자ID | 제목 | 내용 | 작성일
P001 | U001 | 안녕하세요 | 내용1 | 2024-01-01
P002 | U001 | 반갑습니다 | 내용2 | 2024-01-02
사용자 테이블
-------------------------------------------
작성자ID | 작성자명 | 이메일
U001 | 홍길동 | hong@email.com
반정규화 후 (컬럼 중복)
1
2
3
4
5
게시글 테이블
-------------------------------------------
글ID | 작성자ID | 작성자명 | 제목 | 내용 | 작성일
P001 | U001 | 홍길동 | 안녕하세요 | 내용1 | 2024-01-01
P002 | U001 | 홍길동 | 반갑습니다 | 내용2 | 2024-01-02
장점
- 게시글 목록 조회 시 작성자명 표시를 위한 조인 불필요
- 빈번한 조회 작업의 성능 개선
3. 파생 컬럼 추가 예시
정규화된 테이블
1
2
3
4
5
6
주문상세 테이블
-------------------------------------------
주문ID | 상품ID | 수량 | 단가
O001 | P001 | 2 | 10000
O001 | P002 | 1 | 30000
O002 | P001 | 3 | 10000
반정규화 후 (파생 컬럼 추가)
1
2
3
4
5
6
7
8
9
10
11
12
주문상세 테이블
-------------------------------------------
주문ID | 상품ID | 수량 | 단가 | 소계
O001 | P001 | 2 | 10000 | 20000
O001 | P002 | 1 | 30000 | 30000
O002 | P001 | 3 | 10000 | 30000
주문 테이블
-------------------------------------------
주문ID | 주문일자 | 총주문금액 | 총주문수량
O001 | 2024-01-01 | 50000 | 3
O002 | 2024-01-02 | 30000 | 3
장점
- 주문 금액 집계 시 실시간 계산 불필요
- 주문 통계 조회 성능 향상
- 빈번한 통계 조회에 효율적
This post is licensed under CC BY 4.0 by the author.