관계형 데이터베이스(RDBMS)에서 정규화는 데이터의 중복을 제거하고,
데이터 무결성을 유지하기 위해 테이블 구조를 체계적으로 설계하는 기법
이상현상은 테이블 설계가 잘못됐을 때 발생하는 비정상적인 현상
종류 | 설명 | 예시 |
---|---|---|
삽입 이상 | 일부 정보만으로는 삽입 불가 | 고객이 주문해야 등록 가능 |
삭제 이상 | 하나의 삭제가 다른 정보도 삭제 | 마지막 주문 삭제 시 고객 정보도 삭제 |
갱신 이상 | 중복 데이터 중 일부만 수정되어 불일치 발생 | 고객 주소가 여러 행에 있을 때 일부만 변경 |
학번(StudentID) | 과목명(Subject) |
---|---|
101 | DB, C# |
102 | DB |
학번(StudentID) | 과목명(Subject) |
---|---|
101 | DB |
101 | C# |
102 | DB |
즉, 모든 비프라이머리 속성(기본키가 아닌 속성)은 기본키 전체에 대해 완전 함수 종속이어야 함.
학번(StudentID) | 과목명(Subject) | 교수명(Professor) |
---|---|---|
101 | DB | 홍길동 |
101 | C# | 김철수 |
102 | DB | 홍길동 |
(학번, 과목명)
→ 복합키교수명
은 과목명
에만 종속됨 → 부분 함수 종속 발생문제점
→ 교수명은 과목에만 종속되어 있으므로 과목 테이블로 분리
학번(StudentID) | 과목명(Subject) |
---|---|
101 | DB |
101 | C# |
102 | DB |
과목명(Subject) | 교수명(Professor) |
---|---|
DB | 홍길동 |
C# | 김철수 |
DB | 홍길동 |
→ 교수명이 과목명에만 종속된 부분 종속 제거 완료
→ 각 테이블은 단일 기본키에만 의존하도록 분해됨
즉, 기본키가 아닌 다른 컬럼에 종속된 속성이 존재하는 경우!
학번 | 학과코드(DeptCode) | 학과명(DeptName) |
---|---|---|
101 | CS | 컴퓨터공학과 |
102 | EE | 전자공학과 |
103 | CS | 컴퓨터공학과 |
학번(StudentID)
학과명(DeptName)
은 학과코드(DeptCode)
에 종속학과코드
는 학번
에 종속학과명
은 학번에 이행적 종속됨문제점
학번(StudentID) | 학과코드(DeptCode) |
---|---|
101 | CS |
102 | EE |
103 | CS |
학과코드(DeptCode) | 학과명(DeptName) |
---|---|
CS | 컴퓨터공학과 |
EE | 전자공학과 |
→ 이행적 종속 제거 완료
→ DeptName은 더 이상 Student 테이블에 존재하지 않음
항목 | 정규화 | 비정규화 |
---|---|---|
정의 | 중복 제거 및 이상현상 방지를 위해 테이블을 분해 | 성능 향상을 위해 테이블을 병합하거나 중복 허용 |
목적 | 무결성과 일관성 유지 | 조회 속도 향상 및 쿼리 단순화 |
데이터 중복 | 최소화 | 일부 허용 (조회 속도 우선) |
무결성 | 유지하기 용이 | 유지하기 어려움 |
설계 복잡도 | 구조가 정교하고 복잡 | 구조가 단순화됨 |
속도 최적화 | 쓰기(INSERT/UPDATE) 최적화 | 읽기(SELECT) 최적화 |
사용 시점 | 설계 초기, 정합성이 중요한 시스템 | 성능이 중요한 상황, 조회가 많은 시스템 |
정규화는 데이터의 일관성을 보장하고 유지 관리가 용이하다는 장점이 있지만,
때로는 성능상 이유로 비정규화가 필요할 수도 있다."설계 초기엔 정규화, 성능 최적화 시 비정규화"가 일반적인 접근