1. 정규화의 개념과 이상 현상
1. 이상 (Anomaly) 현상
이상 현상이란, 불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제, 연산을 수생할 때 발생할 수 있는 부작용이다.
이러한 이상 현상을 제거하면서 DB를 올바르게 설계해 나가는 과정이 정규화이다.
이상 현상의 종류는 3가지가 있다.
1) 삽입 현상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제 (NULL 값이 들어갈 수도 있는 문제)
2) 갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 문제
3) 삭제 이상 : 튜플을 삭제할 때 꼭 필요한 데이터까지 삭제되는 데이터 손실의 문제이다.

1) 삽입 이상
: 이벤트에 참여하지 않은, 아이디가 'melon', 이름이 '성원용', 등급이 'gold'인 신규 고객의 데이터를 삽입하면 다음과 같은 오류가 나온다.

2) 갱신 이상
: 만약에 아이디가 'apple'인 고객인 등급이 gold에서 vip로 변경되었는데 일부에서만 등급이 수정된다면 서로 다른 등급을 가지는 모순이 발생

3) 삭제 이상
고객 데이터를 하나 삭제하면 데이터의 손실이 발생한다!
4) 함수적 종속성을 이용한 정규화
: 함수적 종속성을 이용해, 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해하여 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어 나가는 과정이다.
2. 함수 종속
1. 함수 종속이란?
함수 종속은 "X가Y를 함수적으로 결정한다." 라는 말이다. 여기서 X는 결정자,Y는 종속자이다.
예를 들자면,

여기서 함수적 종속성을 확인을 해보자면,
고객이름과 등급은 등급 하나에 고객 이름이 결정되지 않기에 고객 이름과 등급은 종속이 되어 있지 않다.
하지만 고객아이디는 기본키이므로 유일성과 최소성 둘 다 만족된다. 따라서 고객아이디는 결정자 역할을 한다.
따라서, 고객아이디 → (고객이름, 등급) 이런식으로 표현할 수 있다.
- 종속 관계 판단 시 유의 사항
1) 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단해야 한다.
-> 속성 값은 계속 변할 수 있으므로 현재 릴레이션에 포함된 속성 값만으로 판단하면 안된다.
2) 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정한다. (유일성과 최소성을 만족하기 때문)
3) 기본키나 후보키가 아니어도 다른 속성 값을 유일하게 결정하는 속성은 함수 종속 관계에서 결정자가 될 수 있다.
- 함수 종속의 종류
- 완전 함수 종속 : 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에는 종속되지 않는다는 것을 의미
- 부분 함수 종속 : 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에도 종속된다는 것을 의미
- 고려할 필요가 없는 함수 종속 관계
결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않는다.
3. 기본 정규형과 정규화 과정
1. 정규화란?
다시 한 번 정규화란, 함수 종속성을 이용해 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서 이상 현상이 발생하지 않는 올바른 릴레이션을 만들어 가는 과정이다. 여기서 주의사항은 무손실 분해여야 한다.
2. 정규화 과정
정규형은 릴레이션이 정규화된 정도이다. 각 정규형은 제약조건이 존재하며 정규형의 차수가 높아질수록 제약조건이 많아진다.
제1정규형부터 제5정규형까지 있다.
1) 제 1 정규형 (1NF)
릴레이션에 속한 모든 속성의 도메인이 더는 분해되지 않는 원자 값으로만 구성되어 있으면 제 1 정규형에 속한다.

위 그림에서는 apple, banana, carrot의 이벤트번호가 여러 개가 나온다. 따라서 원자성에 위배되므로 제 1 정규형이 위반된다.
그래서 원자성 위배를 해결하기 위해 다음과 같이 바꿨다.

중복 현상을 없애기 위해 여러 방법을 선택했지만 삽입, 삭제, 갱신 현상이 일어난다. 이 테이블에서 이상 현상이 발생되는 이유는 기본키에 완전 함수 종속되지 못한 부분이 있기 때문이다. 고객아이디에 종속되는 등급과 할인율 때문에 이벤트 참여 릴레이션을 분해하는 것이다. 이게 제 2 정규형이다!
2) 제 2 정규형 (2NF)
제 2 정규형은 부분 함수 종속으로 인하여 생긴 문제이다. 그렇다면 모든 속성이 기본키에 완전 함수 종속이면 된다는 것이다!
그렇게 하려면? 릴레이션을 분해하면 된다!

그렇다면, 이 릴레이션에서 속성의 관계는?

하지만 제 2 정규형을 만족한다 할지라도 이행적 함수 종속이 존재한다면? 아무래도 불필요한 관계가 하나 더 나오겠죠?
그 불필요한 관계를 해결하기 위해 제 3 정규형을 실행한다.
근데 어디서 이행적 함수 종속이? 그리고 이행적 함수 종속은 뭔데?
2-1) 이행적 함수 종속
위의 그림에서 이행적 함수 종속이 있는 부분은 바로 여기이다.

삼단 논법을 생각해보면 X -> Y, Y -> Z이면 X- > Z라는 삼단 논법이 생기는데 여기서 Z는 X에 이행적 함수 종속되었다는 것이다.
결론 : 제 3 정규형은 삼단 논법으로 생긴 이행적 함수 종속을 없애는 것과 똑같다!
3) 제 3 정규형 (3NF)
앞서 말했던 이행적 함수 종속을 없애기 위한 정규화이다. 위에서도 고객아이디가 등급을 통해 할인율을 결정하기 때문에 이행적 종속 관계가 있다는 것이다. 따라서 여기서도 릴레이션을 따로 나눠주며 정규화를 한다. 고객아이디와 등급으로 나누고 등급과 할인율로 나누는 방식이 있을 것이다.
4) 보이스/코드 정규형 (BCNF)
하나의 릴레이션에 여러 개의 후보키가 존재하는 경우, 제 3 정규형까지 모두 만족해도 이상 현상이 발생하기에 이를 해결하기 위한 정규화가 BCNF 이다. (= 강한 제3정규형이기도 하다)
예를 들어, 이러한 관계가 있다.

이러한 경우는 담당강사번호가 후보키가 아님에도 인터넷 강좌의 결정자 역할을 하기 때문에 생기는 일이다. 따라서, 여기서 릴레이션을 나눠주는 과정을 거쳐야 한다.
그 외에도 제 4 정규형, 제 5 정규형이 있는데 거기까지는 잘 안 쓰인다고 한다. 이상!
'CS 전공 > DB' 카테고리의 다른 글
[데이터베이스] 9. SQL (0) | 2024.06.08 |
---|---|
[데이터베이스] 8. 관계 데이터 연산 (0) | 2024.06.02 |
[데이터베이스] 6. 데이터베이스 설계 (0) | 2024.04.24 |
[데이터베이스] 5. 관계 데이터 모델 (0) | 2024.04.23 |
[데이터베이스] 4. 데이터 모델링 (1) | 2024.04.19 |