SQL Professional
[독학! SQLP] 정규형? 정규화? 반정규화?
by 개발자의
2025. 8. 19.
정규화 (Normalization)
- 정의 : 데이터의 중복을 제거하고, 이상현상을 방지하며, 데이터 일관성을 유지하기 위해 릴레이션을 분해하는 과정
- 목적 : 데이터 중복 제거, 이상현상 방지, 일관성 확보
- 장점 : 삽입 / 삭제 / 갱신 이상 제거 → 데이터 무결성 보장
- 단점 : 테이블 / 조인 수 증가 → 성능 저하 가능
- 키워드 : 무손실 분해, 종속 보존
참고
무손실 분해(조인): 나눴다가 조인하면 빠짐/중복 없이 원래 그대로. (외래키로 자연조인되게 설계)
종속 보존: 원래 규칙(FD)을 분해된 테이블들에서도 그대로 검사 가능.
정규형 (Normal Form)
1) 1차 정규형 (1NF)
- 모든 칼럼이 한 칸에 하나의 값(원자값)을 가져야 함.
- 반복 칼럼(phone1, phone2 …)이나 콤마로 여러 값을 넣거나 JSON/배열로 묶어 넣으면 1NF 위반
- 1NF 위반
- phone1, phone2 칼럼이 반복되고, hobbies 칼럼에 값이 ","로 연결되어있다.
student_bad 테이블
- 1NF 만족
- student_bad 테이블을 student, student_phone, student_hobby 테이블로 분해
- 모든 칼럼이 하나의 값을 가짐.
student 테이블
student_phone 테이블
student_hobby 테이블
2) 2차 정규형 (2NF)
- 부분 함수 종속 제거 (모든 비키 속성은 후보키 전체에 완전 종속)
- 복합키를 쓰는 테이블에서 키의 일부만으로 비키(일반 속성)가 결정되면 부분 종속 → 2NF 위반
- 부분종속을 일으키는 속성을 자기 키를 가진 테이블로 분리해야 함.
- 2NF 위반
- order_item_bad 테이블의 키가 order_id, product_id 일때, product_name은 product_id에만 종속됨.
order_item_bad 테이블
- 2NF 만족
- product_id를 키로 가지는 product 테이블로 분리함.
order_item 테이블
product 테이블
3) 3차 정규형 (3NF)
- 이행 함수 종속 제거 (비키 속성은 키에만 종속)
- 이행 함수 종속 : 키가 X를, X가 Y를 결정하면 키가 돌아서 Y를 결정하는 상황(키 → 비키 → 다른 비키)
- 중간 결정자(X)의 속성들은 그 X를 키로 하는 별도 테이블로 분리.
- 3NF 위반
- 주문이 고객ID를, 고객ID가 고객이름·등급을 결정 → 주문이 고객이름을 “우회 결정”
orders_bad 테이블
- 3NF 만족
- 비키 속성이 모두 키에만 종속되도록 orders 테이블과 customer 테이블로 분리.
orders 테이블
customer 테이블
4) 보이스-코드 정규형 (BCNF)
- 모든 결정자가 슈퍼키여야 함.
- 함수적 종속 X → Y에서 X가 슈퍼키가 아니면 BCNF 위반.
- 종속보존이 깨질수 있음. (필요시 3NF에서 타협)
- 3차 정규형(3NF) 보다 강하다?
- 3차 정규형을 만족시키는 테이블이라도 BCNF위반할 수 있다.
- 3차 정규형 보다 엄격하다 정도로 이해
- BCNF 위반
- 학생(student), 과목(subject) -> 교수(prof) : 학생, 과목은 슈퍼키, 후보키
- 교수(prof) -> 과목(subject) : 과목은 주요속성(후보키의 구성원) 그러나 교수가 슈퍼키가 아님. 때문에 3NF는 만족. BCNF 위반
student_subject_prof_bad 테이블
- BCNF 만족
- prof → subject를 별도 테이블에서 prof를 키로 유지하고, 학생-교수 매핑으로 바꿈.
- 모든 결정자가 슈퍼키가 됨. → BCNF 만족
prof_subject 테이블
student_prof 테이블
5) 4차 정규형 (4NF)
- 다치 종속 제거
- 다치 종속: 한 키 값에 대해 여러 개의 독립적인 반복 값이 존재하는 경우
- 규칙: 비트리비얼 다치 종속의 결정자는 후보키여야 한다.
(비트리비얼 = 의미 있는, 자명하지 않은 경우)
- 4NF 위반
- 한 가수(키값)가 여러 악기/여러 장르를 서로 독립적으로 가질 수 있음 → 곱집합 중복 발생
artist_instrument_genre_bad 테이블
- 4NF 만족
- 악기/장르는 서로 독립. 두 관계로 분리하면 다치 종속 제거 → 4NF 충족.
artist_instrument 테이블
artist_genre 테이블
6) 5차 정규형 (5NF)
- 조인으로만 표현되는 종속(조인 종속) 제거
- 어떤 릴레이션이 여러 테이블로 분해되어야만 무손실 조인이 가능한 경우, 그 조인 조건이 후보키에 의해서만 성립해야 함.
- 규칙: 모든 조인 종속은 후보키에 의해 함축되어야 한다.
- 5NF 위반
- supplier-part-project(SPJ). 각 쌍 관계(SP, SJ, PJ)가 독립적으로 관리될 때, 한 테이블에 다 담으면 불필요 조합이 나옴.
supply_bad 테이블
- 5NF 만족
- 세 테이블 자연조인(또는 동등조인)으로 원래 의미를 정확히 복원 가능 → 5NF 충족
supplier-part 테이블(sp)
supplier-project 테이블(sj)
part-project 테이블(pj)
반정규화(Denormalization)
- 정의 : 정규화된 데이터 모델을 성능 향상을 위해 의도적으로 중복을 허용하거나 테이블을 통합/변형하는 과정
- 목적 : 데이터 조회 성능 향상, 조인 최소화
- 장점 : SQL 단순화, 조회 속도 상승(JOIN 감소), 집계 / 보고 편리
- 단점 : 데이터 중복 발생, 일관성 관리 필요
- 키워드 : 중복 허용, 성능 최적화
- 반정규화 전
- 주문상세 테이블에는 가격이 없기 때문에, 금액을 계산하려면 항상 조인이 필요함.
- 상품 가격이 변동될 경우 예전에 팔린 주문 금액까지 변동되는 오류가 발생함.
반정규화 전 상품, 주문, 주문상세
- 반정규화 후
- 주문내역은 팔린 시점 그대로 유지 가능.
- 매출 집계시 상품테이블과 조인 하지 않음.
반정규화 후 상품, 주문, 주문상세