DB 설계는 데이터의 중복을 최소화하고, 일관성 & 무결성을 유지하기 위한 기본 과정이고, 정규화는 이 설계의 핵심 기법임.
정규화?
데이터의 일관성 확보 및 중복을 최소화하기 위해 테이블을 구조화하는 과정
DB가 잘못 설계되어 데이터가 중복적으로 쌓여있으면, 데이터를 다룰 때 심각한 문제가 발생함
정규화되지 않은 테이블에서 자주 발생하는 문제를 ‘이상현상’이라 부름
불필요한 데이터 없이는 삽입이 불가능한 문제
동일한 데이터가 여러 곳에 중복 저장되어, 수정할 때 일부만 수정되고 일부는 누락되는 현상
특정 데이터를 삭제했을 때, 필요한 정보까지 함께 삭제되는 문제
하나의 속성이 다른 속성의 값을 고유하게 결정짓는 관계
학생ID → 학생이름)1) 완전 함수 종속 (Full Functional Dependency)
복합키 전체에 의해 다른 속성이 결정되는 경우
2) 부분적 함수 종속 (Partial Functional Dependency)
복합키 일부만으로 다른 속성이 결정되는 경우
3) 이행적 종속 (Transitive Functional Dependency)
A → B, B → C이면 A → C 관계가 성립하는 경우
| 정규형 | 제거 대상 | 관련된 함수 종속성 |
|---|---|---|
| 1NF | 비원자값 | - |
| 2NF | 부분 함수 종속 | 복합키의 일부 종속 |
| 3NF | 이행적 함수 종속 | A → B → C 구조 |
| BCNF | 비후보키 결정자 | 모든 결정자가 후보키여야 함 |
| 4NF | 다중값 종속 | 독립적 다대다 관계 |
| 5NF | 조인 종속 | 조인 시 중복 발생 제거 |
정규화는 함수 종속성을 분석하고, 그 관계를 기준으로 테이블을 분리하는 과정을 수행함.
정규화의 모든 단계는 결국 어떤 속성이 어떤 키에 종속되는가를 기준으로 판단하기 때문에 키는 정규화의 축이라고 할 수 있음
후보키 (Candidate Key)
기본키 (Primary Key)
대체키 (Alternate Key)
외래키 (Foreign Key)
주문.회원ID → 회원.회원ID| 개념 | 정규화에서의 역할 |
|---|---|
| 후보키 | 종속 관계의 기준 (결정자 판단 근거) |
| 기본키 | 테이블의 중심 식별자, 완전 종속의 기준 |
| 외래키 | 테이블 간 종속 관계 표현 |
| 정규화 | 키를 기준으로 비정상 종속을 제거하는 과정 |
정규화는 속성들이 키에 대해 어떻게 종속되어 있는가를 기준으로 단계가 나뉨
함수 종속성을 판단하려면 먼저 기준 키가 명확해야 함
테이블에 존재하는 불필요한 종속성을 제거해 중복과 이상(anomalies)을 줄이는 단계별 규칙이자 레벨
각 정규형은 ‘어떤 종류의 종속을 없애야 하는가?’로 정의되고, 해당 정의를 만족시키지 못하면 테이블을 분해하여 해결함.
테이블의 모든 속성 값이 원자값(Atomic Value)을 가져야 함.
반복 그룹, 배열, 리스트와 같은 비원자 값을 허용하지 않음.
하나의 컬럼에 여러 값이 포함될 수 없음 - "축구, 농구" (X)
학생(학번, 이름, 전화번호)
행: (1001, '홍', '010-1111-2222,010-3333-4444') → 1NF 위반
1NF를 만족하고, 부분 함수 종속이 제거되어야 함.
복합키의 일부에만 종속되는 속성이 있어서는 안 됨
수강(학번, 과목코드, 학생이름, 성적)
기본키 = (학번, 과목코드)
학생이름 → 학번에만 종속 → 부분 종속(2NF 위반)
2NF를 만족하고, 이행적 종속이 제거되어야 함
학생(학번, 학과코드, 학과명)
학번 → 학과코드, 학과코드 → 학과명 → 학번 → 학과명 (이행적 종속)
제3 정규형(3NF)을 만족하고, 모든 결정자가 후보키여야 함.
모든 결정자( 어떤 속성 집합 X가 Y를 결정할 때 X )는 후보키(Candidate Key) 여야 함.
강의(교수, 과목, 강의실)
FD: 과목 → 교수 (한 과목은 특정 교수 전담)
FD: 교수, 과목 → 강의실
과목은 후보키가 아님(과목만으로 행을 식별 못함), 그런데 과목 → 교수 이므로 BCNF 위반