PE Notes · DB
이상현상과 정규화·반정규화
삽입·삭제·갱신 이상과 1NF부터 BCNF까지의 분해, 읽기 성능을 위한 반정규화 기법과 트레이드오프를 정리합니다.
한 테이블에 학생과 과목과 교수 연락처가 섞이면, 과목만 넣기도 어렵고, 수강 한 줄을 지울 때 과목 정보까지 사라지고, 연락처를 여러 행에서 고치다 빠뜨립니다. 는 을 따라 릴레이션을 나눠 이 이상을 없앱니다.
이상현상 세 가지
| 이상 | 뜻 | 예 |
|---|---|---|
| 삽입 | 넣으려는 값 외에 불필요 값이 필요하거나 삽입 자체가 막힘 | 학생 없이 과목만 추가 불가 |
| 삭제 | 지우려는 값과 함께 필요한 정보가 사라짐 | 수강 취소에 과목 정보 소멸 |
| 갱신 | 중복 저장을 일부만 고쳐 불일치 | 교수 연락처가 행마다 다름 |
1NF부터 BCNF
1NF는 속성값이 원자값이어야 합니다. 수강과목들 같은 반복 그룹은 행으로 펼칩니다.
2NF는 1NF에 더해, 비키 속성이 기본키 전체에 완전 종속해야 합니다. {학번, 과목} 키에서 학번만으로 이름이 정해지면 부분 종속입니다. 학생 테이블을 분리합니다.
3NF는 비키가 다른 비키를 거쳐 기본키에 매달리는 이행 종속을 제거합니다. 학번 → 전공코드 → 전공명이면 전공을 따로 둡니다.
(3.5NF)는 모든 결정자가 후보키여야 합니다. 3NF를 지나도 지도교수 → 과목처럼 결정자가 키가 아니면 남습니다. 교수-과목과 학생-지도로 나눕니다.
| 정규형 | 제거 | 조건 |
|---|---|---|
| 1NF | 반복 그룹 | 원자값 |
| 2NF | 부분 종속 | 완전 FD |
| 3NF | 이행 종속 | 직접 종속 |
| BCNF | 비키 결정자 | 결정자 = 후보키 |
반정규화
테이블이 잘게 쪼개지면 JOIN이 늘고 조회가 느려집니다. 읽기가 쓰기보다 훨씬 많고, 이상보다 지연이 더 클 때 를 고릅니다.
| 기법 | 하는 일 | 주의 |
|---|---|---|
| 테이블 병합 | 자주 조인하는 표를 합침 | 삽입·갱신 이상 재발 |
| 컬럼 중복 | 자주 보는 속성을 복사 | 양쪽 갱신 |
| 파생 컬럼 | 집계를 미리 저장 | 원본과 동기화 |
| 분할 | 행·열을 나눔 | 질의 경로가 늘어남 |
| 이력 테이블 | 과거 조회를 분리 | 저장 증가 |
| 축 | 정규화 | 반정규화 |
|---|---|---|
| 무결성 | 높음 | 낮아질 수 있음 |
| 읽기 | JOIN이 많으면 느림 | 빠름 |
| 쓰기 | 한곳 수정 | 여러 곳 |
| 적합 | OLTP | OLAP·읽기 집약 |
주문 목록이 주문·상세·상품·카테고리 네 조인을 매번 타면, 상세에 상품명·카테고리명을 심는 식이 현장 패턴입니다. 상품명이 바뀌면 상세도 같이 고쳐야 합니다.