개발스토리
정규화 본문
■ 이상(anomaly) 현상
- 불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입/수정/삭제 연산을 수행할 때 발생할 수 있는 부작용을 말한다. 디비는 중복을 너무 싫어한다...
그럼, 먼저 이상 현상의 종류부터 알아보자..!
삽입 이상 | 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제 |
갱신 이상 | 중복 튜플 중 일부만 변경해서 데이터가 불일치하게 되는 문제 |
삭제 이상 | 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제 |
■ 정규화
- 이상 현상을 제거하면서 데이터베이스를 올바르게 설계해 나가는 과정이다.
- 이상 현상이 발생하지 않도록, 릴레이션을 관련 있는 속성들로만 구성하기 위해 릴레이션을 분해(decomposition)하는 과정이다.
- 함수적 종속성을 판단하여 정규화를 수행한다.
함수적 종속성이란 속성들 간의 관련성을 나타내는 말이다.
한마디로 다시 정리하자면,
정규화란 함수적 종속성을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해하여 이상 현상이 발생하지 않는 올바를 릴레이션으로 만들어 나가는 과정이다.
★ 함수 종속 관계 판단 시 유의사항
- 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단해야 한다.
- 속성 값은 계속 변할 수 있으므로 현재 릴레이션에 포함된 속성 값만으로 판단하면 안된다.
- 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정한다.
- 기본키나 후보키가 아니어도 다른 속성 값을 유일하게 결정하는 속성은 함수 종속 관계에서 결정자가 될 수 있다.
함수 종속 예시
- 고객이름은 {고객아이디, 이벤트번호}의 일부분인 고객아이디에 종속되어 있다.
-> 즉, 고객이름은 {고객아이디, 이벤트번호}에 부분 함수 종속되어 있다는 말이다.
- 당첨여부는 {고객아이디, 이벤트번호}의 완전 함수 종속된다.
■ 고려할 필요가 없는 함수 종속 관계
- 결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않는다.
자자자,,,이제 어느 정도 이해했으면 정규화로 본격적으로 들어가보쟈~~~
정규화의 개념이 기억이 안난다면 위에서 한번 더 보고 오쟈~~
정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현한다는 것이다.
정규화를 하면서 주의해야할 점은 정규화를 통해 릴레이션은 무손실 분해가 되어야 한다는 것이다.
릴레이션이 의미상 동등한 릴레이션들로 분해되어야 하고, 분해로 인한 정보 손실이 발생하지 않아야 한다.
분해된 릴레이션들을 자연 조인하면 분해 전의 릴레이션으로 복원 가능해야 한다.
■ 정규형(Normal Form)
- 릴레이션이 정규화된 정도
- 각 정규형마다 제약조건이 존재한다. 정규형의 차수가 높아질수록 요구되는 제약조건이 많아진다.
- 릴레이션의 특성을 고려해서 적합한 정규형을 선택하면 된다.
■ 제 1 정규형(1NF)
- 릴레이션의 모든 속성이 더는 분해되지 않는 원자 값만 가지면 제 1정규형을 만족한다.
- 제 1 정규형을 만족해야 관계 데이터베이스의 릴레이션이 될 자격이 있다.
1NF를 만족하게 바꾸었지만 내가 뭐라했죠!? 디비는 중복을 너무 싫어함.. 그래서 데이터 중복으로 인해 이상 현상이 발생할 수 있다..!
위 릴레이션에서 이상 현상이 발생하는 이유는 기본키에 완전 함수 종속이 아닌 등급, 할인율 때문이다.
그렇다면 어떻게 문제를 해결해야 할까용?
부분 함수 종속을 제거하면 된다. 릴레이션을 분해하면 됩니다~
■ 제 2 정규형(2NF)
- 릴레이션이 1NF를 만족하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 2NF를 만족한다.
1NF를 만족하는 릴레이션이 2NF를 만족하게 하려면?!??!?!?!?!?!?
부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 분해하면 된다.
근데,,, 2NF를 만족해도 이상현상이 발생할 수 있다. 이유는 이행적 함수 종속이 존재하기 때문이다.
이행적 함수 종속이란 X->Y, Y->Z가 있을때 X->Z가 되는 것을 말한다.
그렇다면 이건 또 어떻게 문제를 해결해야 할까용?
뭐,, 이행적 함수 종속을 제거하면 되겠죠...??
■ 제 3 정규형(3NF)
- 릴레이션이 2NF에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 3NF가 된다.
■ 보이스/코드 정규형(BCNF)
- 필요성: 하나의 릴레이션에 여러 개의 후보키가 존재하는 경우, 3NF까지 모두 만족해도 이상 현상이 발생할 수 있다.
- 후보키를 여러 개 가지고 있는 릴레이션에 발생할 수 있는 이상 현상을 해결하기 위해 3NF보다 더 엄격한 제약조건을 제시한다.
- BCNF에 속하는 릴레이션은 3NF에 속하지만, 3NF에 속하는 모든 릴레이션이 BCNF에 속하는 것은 아니다.
위 릴레이션은 담당강사 번호가 후보키가 아님에도 인터네강좌 속성에 결정자이기 때문에 이상현상이 발생할 수 있다.
그러면!! 또 나누세요!!!!!!
■ 제 4 정규형(4NF)
- 릴레이션이 BCNF를 만족하면서 함수 종속이 아닌 다치 종속을 제거하면 된다.
다치 종속
■ 제 5 정규형(5NF)
- 릴레이션이 4NF를 만족하면서 후보키를 통하지 않는 조인 종속을 제거하면 된다.
- 조인 종속 개념을 기반
- 필요한 데이터가 사라지지 않는 무손실 분해
- 필요 없는 데이터가 생기지 않는 비부가적 분해
근데 말이죠,,, 사실 BCNF만 가도 많이 갔다.. 4정규형과 5정규형을 만족한다고 꼭 바람직한 것은 아니다.
일반적으로 3NF, BCNF에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상을 해결하는 경우가 많다.
마무리로, 총 정리된 그림하나 쏘옥