정규화와 정규형
23.11.28
이상 현상과 정규화
이상 현상
이상 현상이란 불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 수행할 때 발생할 수 있는 부작용이다.
이상 현상의 종류
- 삽입 이상
- 릴레이션에 새 데이터를 삽입하려면 불필요한 데이터도 함께 삽입해야하는 문제
- ex) 아직 이벤트에 참여하지 않은 아이디를 이벤트 참여 릴레이션에 삽입하는 경우 실제로 참여하지 않은 임시 이벤트 번호를 삽입해야함.
- 갱신 이상
- 릴레이션의 중복된 튜플들 중 일부만 수정하여 데이터가 불일치하게 되는 모순이 발생
- ex) 아이디가 'apple'인 고객의 등급이 'gold'에서 'vip'로 변경되었는데, 일부 튜플에 대해서만 등급이 수정된다면 'apple' 고객이 서로 다른 등급을 가지는 모순이 발생
- 삭제 이상
- 릴레이션에서 튜플을 삭제하면 꼭 필요한 데이터까지 손실되는 연쇄 삭제 현상이 발생하는 문제
- ex) 아이디가 'orange'인 고객이 이벤트 참여를 취소해 관련 튜플을 삭제하게 되면 이벤트 참여와 관련이 없는 고객아이디, 고객이름, 등급 데이터까지 손실됨
정규화
정규화란 이상 현상을 제거하면서 데이터베이스를 올바르게 설계해 나가는 과정이다. 즉, 릴레이션을 관련 있는 속성들로만 구성하기 위해 릴레이션을 분해하는 과정이다.
함수적 종속성을 판단해 정규화를 수행하는데 이는 속성들 간의 관련성을 의미한다.
함수 종속
- X가 Y를 함수적으로 결정한다
- 릴레이션 내의 모든 튜플을 대상으로 하나의 X 값에 대한 Y 값이 항상 하나임
- X와 Y는 하나의 릴레이션을 구성하는 속성들의 부분 집합
- "Y가 X에 함수적으로 종속되어 있다"와 같은 의미
- X → Y로 표현(X는 결정자, Y는 종속자)
종속 관계 판단 시 유의사항
- 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단해야함
- 속성 값은 계속 변할 수 있으므로 현재 릴레이션에 포함된 속성 값만으로 판단하면 안됨
- 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정함
- 기본키나 후보키가 아니어도 다른 속성 값을 유일하게 결정하는 속성은 함수 종속 관계에서 결정자가 될 수 있음
완전 함수 종속
- 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에는 종속되지 않음을 의미
- 일반적으로 함수 종속은 완전 함수 종속을 의미함
- 예) 당첨여부는 {고객 아이디, 이벤트번호}에 완전 함수 종속됨(당첨여부는 두 속성에 전체에 종속되기 때문)
부분 함수 종속
- 릴레이션에서 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미
- 예) 고객이름은 {고객 아이디, 이벤트번호}에 부분 함수 종속됨(고객 아이디로만 판단 가능)
이행적 함수 종속
- 릴레이션을 구성하는 세 개의 속성 집합 X,Y,Z에 대해 함수 종속 관게 X → Y와 Y → Z가 존재하면 논리적으로 X → Z가 성립되는데, 이것을 Z가 X에 이행적으로 함수 종속되었다고 함
정규형
- 릴레이션이 정규화된 정도
- 각 정규형마다 제약조건이 존재
- 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해짐
- 정규형의 차수가 높아질수록 데이터 중복이 줄어 이상 현상이 발생하지 않는 바람직한 릴레이션이 됨
- 릴레이션의 특성을 고려하여 적합한 정규형을 선택
기본 정규형
- 제 1 정규형
- 제 2 정규형
- 제 3 정규형
- 보이스/코드 정규형
고급 정규형
- 제 4 정규형
- 제 5 정규형
제 1 정규형
릴레이션의 모든 속성이 더는 분해되지 않는 원자 값만 가지면 제 1정규형을 만족한다. 제 1 정규형을 만족해야 관계 데이터베이스의 릴레이션이 될 자격이 있다.
제 1정규형을 만족하지만 데이터의 중복으로 인한 이상 현상이 발생할 수 있다. 아래와 같은 예시를 살펴보자.
고객아이디 | 이벤트번호 | 당첨여부 | 등급 | 할인율 |
---|
고객아이디와 이벤트번호가 기본키이고 아래와 같이 함수 종속관계가 있다고 가정하자.
고객아이디 → 등급
고객아이디 → 할인율
등급 → 할인율
{고객아이디, 이벤트번호} → 당첨여부
이 경우 기본키인 {고객아이디, 이벤트번호}에 완전 함수 종속되지 못하고 일부분인 고객아이디에 종속되는 등급과 할인율 속성이 존재해 부분 함수 종속이 존재해 이상현상이 발생한다.
부분 함수 종속이 제거되도록 이벤트 참여 릴레이션을 분해 → 분해된 릴레이션은 제 2 정규형에 속하게 됨
제 2 정규형
릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형을 만족함
위 예제의 부분 함수 종속을 제거하면 아래와 같다.
// 고객 릴레이션
|고객아이디 | 등급 | 할인율 |
// 이벤트 참여 릴레이션
|고객아이디 | 이벤트 번호 | 당첨여부 |
그러나 제 2정규형을 만족하지만 이행적 함수 종속이 존재하기 때문에 이상 현상이 발생할 수 있다.
제 3 정규형
릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않으면 제 3정규형을 만족함
이를 분해하면 아래와 같이 된다.
// 고객 릴레이션
|고객아이디 | 등급 |
// 고객등급 릴레이션
|고객아이디 | 할인율 |
예제
아래와 같은 릴레이션이 존재하고 제 2 정규형 → 제 3 정규형으로 순차적으로 분해해보자.
// _{}_ 밑줄 사이에 존재하는 것이 기본키
- (_학번_, 이름, 지도교수, 학과이름, 학과전화번호, _과목번호_, 성적, 시간, 회장이름, 동아리이름, 방번호)
- 함수종속
- 학번 → 이름, 지도교수, 학과이름, 회장이름, 동아리이름, 방번호
- 학과이름 → 학과전화번호
- 과목번호 → 시간
- 학번, 과목번호 → 성적
- 회장이름, 동아리이름 → 방번호
먼저 제 2 정규형을 만족하도록 분해하려면 완전 함수 종속이어야한다. 따라서 아래와 같이 분해할 수 있다.
// 현재 학번과 과목번호가 PK로, 학번과 과목번호에 따라 부분 함수 종속인 것을 분해할 수 있다.
| _학번_ | 이름 | 지도교수 | 학과이름 | 학과전화번호 | 회장이름 | 동아리이름 | 방번호 |
| _과목번호_ | 시간 |
// 또한 성적은 학번과 과목번호로 결정된다.
| _학번_ | _과목번호_ | 성적 |
제 3 정규형을 만족하도록 분해하려면 이행적 함수 종속을 제거한다.
// 학과 이름은 학과전화번호를 결정하고, 회장이름과 동아리이름은 방번호를 결정한다.
// 이를 나누면 아래와 같다.
// 학생
| _학번_ | 이름 | 지도교수 | 학과이름 | 회장이름 | 동아리이름 |
// 학과
| _학과이름_ | 학과전화번호 |
// 동아리
| _회장이름_ | _동아리이름_ | 방번호 |
참고자료
Hustle-dev
It is possible for ordinary people to choose to be extraordinary.