DataBase 설계 시 고려해야 하는 것 중엔 정규화와 비정규화(역정규화)가 있다.
정규화
- 데이터 중복을 최소화하고 무결성을 유지하는 과정
장점
-
- 각 테이블이 하나의 주제에 집중하도록 설계
- 데이터 중복 줄이고, 업데이트 이상 현상 방지
- 저장 공간 효율적, 데이터 무결성 보장
- 데이터베이스 구조의 단순화
- 데이터 간의 관계가 명확해짐
단점
- 그러나 과도한 정규화는 쿼리 복잡도 증가시킴 (JOIN)
- 성능 저하도 가능
정규화 과정
제 1 정규화 (1NF)
- 테이블의 칼럼이 원자값(Atomic Value: 하나의 값)을 갖도록 테이블 분해
- 각 칼럼이 하나의 속성만을 가져야 함
- 하나의 칼럼은 같은 종류나 타입의 값을 가져야 함
- 각 칼럼이 유일한 이름을 가져야 함
- 칼럼의 순서가 상관없어야 함
이름 |
나이 |
수강과목 |
홍길동 |
20 |
C,C++ |
이순신 |
21 |
Java |
이도 |
34 |
DB, 운영체제 |
에서
이름 |
나이 |
수강과목 |
홍길동 |
20 |
C |
홍길동 |
20 |
C++ |
이순신 |
21 |
Java |
이도 |
34 |
DB |
이도 |
34 |
운영체제 |
제 2정규화(2NF)
- 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 분해하는 것
- 부분적 종속: 기본키 중에 특정 칼럼에 종속되는 것
- 완전 함수 종속: 기본키의 부분집합이 결정자가 되어선 안됨을 의미
- 조건
- 제 1 정규화를 만족해야함
- 모든 칼럼이 부분적 종속이 없어야 함.
- 모든 칼럼이 완전 함수 종속을 만족해야 함
이름 |
수강과목 |
강사명 |
성적 |
홍길동 |
C |
광해군 |
95 |
홍길동 |
C++ |
선조 |
100 |
이순신 |
Java |
선조 |
70 |
이도 |
DB |
세종 |
80 |
이도 |
운영체제 |
태종 |
85 |
- 특정 학생의 성적을 알기 위해선 이름과 수강과목을 알아야 함
- 특정 과목의 강사는 과목명만 알면 알 수 있다.
- 위 테이블의 기본키는 이름과 과목으로, 복합키이다.
- 반면 지도교수 칼럼은 과목에만 종속되므로, 제 2정규화를 만족하지 않음
이름 |
수강과목 |
성적 |
홍길동 |
C |
95 |
홍길동 |
C++ |
100 |
이순신 |
Java |
70 |
이도 |
DB |
80 |
이도 |
운영체제 |
85 |
강사명 |
수강과목 |
광해군 |
C |
선조 |
C++ |
선조 |
Java |
세종 |
DB |
태종 |
운영체제 |
으로 테이블을 나눈다는 의미
제 3정규화
- 이행적 종속(Transitive Dependencies) 을 없애도록 테이블을 분해함
- 이행적 종속: A -> B, B -> C이 성립할 때, A -> C이 성립함을 의미함
- 조건
- 제 2 정규화를 만족해야 함
- 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.
ID |
등급 |
할인율 |
101 |
VIP |
70% |
102 |
Gold |
40% |
103 |
Bronze |
20% |
- 이렇게 데이터가 있으면, ID 를 통해 할인율을 알 수 있다
ID |
등급 |
101 |
VIP |
102 |
Gold |
103 |
Bronze |
등급 |
할인율 |
VIP |
70% |
Gold |
40% |
Bronze |
20% |
BCNF (Boyce-Codd Normal Form)
- 제 3정규형을 좀 더 강화한 버전
- 조건
- 제 3정규형을 만족해야 함
- 모든 결정자가 후보키 집합에 속해야 함
- 후보키 집합에 없는 칼럼이 결정자가 되어선 안된다는 의미
이름 |
수강과목 |
지도교수 |
홍길동 |
C |
광해군 |
홍길동 |
C++ |
선조 |
이순신 |
Java |
선조 |
이도 |
DB |
세종 |
이도 |
운영체제 |
태종 |
* 강사의 이름을 이름과 과목으로 조회할 수 있다. |
|
|
* 그러나 같은 과목을 다른 강사가 가르칠 수 있기 때문에, 수강과목 -> 지도교수 이란 종속은 성립하지 않음 |
|
|
* 하지만 지도교수 -> 수강과목이라는 종속은 성립 |
|
|
이름 |
지도교수 |
홍길동 |
광해군 |
홍길동 |
선조 |
이순신 |
선조 |
이도 |
세종 |
이도 |
태종 |
지도교수 |
수강과목 |
광해군 |
C |
선조 |
C++ |
선조 |
Java |
세종 |
DB |
태종 |
운영체제 |
으로 나눌 수 있다. |
|
제 4정규화