내게 부족한 스펙들과 자격증을 챙기기 위하여 정처기 이후 첫걸음인 SQLD 자격증 시험을 앞두고 있다.
내가 틀린것과 헷갈리는 것들을 기록하여 복습을 할 수 있게 포스팅하겠다.
이미 정처기에서 정규화에 대해 공부를 하였지만 단순 암기식으로 공부하였고 내가 이해하기 좋게 쉽게 설명하고자 이 글을 쓰게 되었다.
정규화(Normalization)
이상 현상이 릴레이션을 분해하여 이상현상을 없애는 과정
한마디로 관계형 스키마를 더 좋은 구조로 정제해 나가는 과정이라고 보면된다.
정규화는 논리데이터 모델 상세화 과정의 대표적인 활동이다.
제 1 정규화
테이블의 컬럼에 있는 데이터 값들이 하나의 값만 가지도록 테이블을 분해하는 것이다.
이름 | 취미 |
---|---|
최정재 | 인터넷,영화,쇼핑 |
처럼 이름은 값을 한개만 가지지만 취미는 현재 인터넷, 영화, 쇼핑
이렇게 3가지의 값이 들어가 있는데 이 경우에 하나의 값을 갖도록 테이블을 분해하는 것이 제 1정규화이다.
이름 | 취미 |
---|---|
최정재 | 인터넷 |
최정재 | 영화 |
최정재 | 쇼핑 |
이런식으로 분리해주면 된다. 이렇게 1차 정규화가 된상태를 1차 정규형이라 부른다.
(제 1정규화가 필요한 시점은 1차 정규형이 아니다 주의하자)
제 2정규화
제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
하지만 말로만 들으니 이해가 안간다. 이게 무슨 말이냐면 부분 함수적 종속관계를 제거한다는 것이다. 사실 이 말도 어렵다.
제거 방법은 복합키가 구성되었을 때 부분적으로 종속된 속성을 따로 분해하여 새로운 엔티티로 분해하면 된다.
<수강강좌>수강강좌>
학번 | 강좌이름 | 강의실 | 성적 |
---|---|---|---|
001 | 데이터베이스 | DB 100 | 3.5 |
003 | 자료구조 | D 204 | 4.0 |
001 | 자료구조 | D 204 | 3.5 |
002 | 알고리즘 | D 329 | 4.5 |
지금 이 테이블은 제 1정규화를 마쳐서 값이 하나씩 들어가 있다. 여기서 문제는 뭘까?
학생번호,강좌이름이 성적을 결정하고 강좌이름으로 강의실을 결정하고 있다. 이는 완전 함수 종속이 아닌 부분적으로 종속되어 있기에 분리 해주면 좋다.
<수강>수강>
학번 | 강좌이름 | 성적 |
---|---|---|
001 | 데이터베이스 | 3.5 |
003 | 자료구조 | 4.0 |
001 | 자료구조 | 3.5 |
002 | 알고리즘 | 4.5 |
<강의실>강의실>
강좌이름 | 강의실 |
---|---|
데이터베이스 | DB 100 |
자료구조 | D 204 |
자료구조 | D 204 |
알고리즘 | D 329 |
이제 두 테이블은 모두 완전 함수 종속이기에 2차 정규형을 마친 테이블이 되었다.
제 3정규화
제 2정규화를 마친 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
역시 말을 왤케 첨들으면 그게 뭔데? 싶게 해놨다.
쉽게 말하면 컬럼 A, B, C가 있다 하자.
A가 B를 특정하고 B가 C를 특정할 때 A가 C를 특정하는 것이 성립되는 것을 의미한다.
정규화 단계에서 주식별자와 관련이 낮다
<계절학기>계절학기>
학번 | 강좌이름 | 수강료 |
---|---|---|
002 | 데이터베이스 | 20000 |
004 | 데이터베이스 | 20000 |
003 | 알고리즘 | 15000 |
005 | 자료구조 | 25000 |
이 경우에도 학번 -> 강좌이름, 강좌이름 -> 수강료, 학번 -> 수강료 가 성립이 되기에 분리를 해줘야한다.
<계절수강>계절수강>
학번 | 강좌이름 |
---|---|
002 | 데이터베이스 |
004 | 데이터베이스 |
003 | 알고리즘 |
005 | 자료구조 |
<수강료>수강료>
강좌이름 | 수강료 |
---|---|
데이터베이스 | 20000 |
데이터베이스 | 20000 |
알고리즘 | 15000 |
자료구조 | 25000 |
이렇게 바꾸게 되면 좋은 점이 뭐냐? 만약 학번 002가 데이터베이스에서 알고리즘으로 강좌를 바꾼다 치자.
그렇게 되면 강좌이름, 수강료 모두 바꿔야하지만 이렇게 테이블을 분리해주면 계절수강 테이블에 강좌이름만 바꿔주면 된다.
BCNF 정규화
문제를 풀어보니 보통은 제 3정규화까지만 자주나오는 것을 확인 할 수 있었다.
아직 많이 안풀어봐서 BCNF 정규화 문제를 못 본걸 수도 있고
이번 2024 SQLD가 개정되면서 반정규화 성능이 빠지고 정규화 성능에서 그냥 정규화로 과목을 편성한 것을 보아
좀 더 지엽적으로 낼 수 있다는 생각에 알아보도록 하겠다.
제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
한마디로 결정자이면 무조건 테이블 내에서 유일성과 최소성을 동시에 만족해야 한다는 것이다.
<특강수강>특강수강>
학번 | 특강이름 | 교수 |
---|---|---|
201 | 사물인터넷 | 김시관 |
101 | 사물인터넷 | 김시관 |
102 | 자료구조 | 이현아 |
202 | 컴퓨터비전 | 이해연 |
201 | 컴퓨터비전 | 이해연 |
특강수강을 보면 지금 특강이름을 결정 짓는 결정자는 교수 칼럼인 것을 알 수 있다.
하지만 지금 교수를 보면 후보키가 되는가?
김시관 2번, 이해연 2번으로 유일성을 만족하지 못하여 테이블을 분리 해주어야한다.
<특강신청>특강신청>
학번 | 특강이름 |
---|---|
201 | 사물인터넷 |
101 | 사물인터넷 |
102 | 자료구조 |
202 | 컴퓨터비전 |
201 | 컴퓨터비전 |
<특강교수>특강교수>
특강이름 | 교수 |
---|---|
사물인터넷 | 김시관 |
자료구조 | 이현아 |
컴퓨터비전 | 이해연 |
정리 및 추가 내용
- 정규화 : 테이블 분해, 조회 성능은 떨어질수 있음, 데이터 처리 성능은 향상됨.
- 제 1 정규화 : 원자값으로 분해
- 제 2 정규화 : 완전 함수 종속 만족(기본키의 일부가 결정자가 되어선 안됨)
- 제 3 정규화 : 이행적 함수 종속 제거(a->b,b->c => a->c가 되선 안됨 분리해줘야함 a->b테이블, b->c테이블)
- BCNF 정규화 : 모든 결정자가 후보키가 되도록 분해
문제를 풀다가 추가 할 내용과 알아두면 좋은 것이 있으면 계속 수정하며 추가 하도록 하겠음.