이상현상 (Anomaly)
- 한 릴레이션에 여러 엔티티의 속성들을 혼합하게 되면 불필요한 데이터 중복이 발생하여, 릴레이션에 대한 데이터의 삽입, 수정, 삭제 연산을 수행할 때 부작용이 발생할 수 있다.
- 이러한 부작용을 이상 현상이라고 하며, 함수 종속성을 이용하여 릴레이션을 연관성 있는 속성들로만 구성되도록 분해해서 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어나가는 과정을 정규화라고 한다.
이상현상 | 설명 |
삽입 이상 | 데이터 삽입 시 필요한 자료가 부족해 삽입되지 않거나, 불필요한 자료를 삽입해야 하는 문제 |
갱신 이상 | 중복 튜플 중 일부만 변경되어 데이터가 불일치하게 되는 모순 |
삭제 이상 | 삭제하려는 자료가 포함된 전체 튜플이 삭제되면서 원하지 않는 데이터까지 삭제되는 정보 손실 |
함수 종속
- 하나의 릴레이션을 구성하는 속성들의 부분 집합을 X와 Y라고 할 때, 어느 시점에서든 릴레이션 내의 모든 튜플에서 하나의 X값에 대한 Y값이 항상 하나면 Y가 X에 함수적으로 종속되어 있다고 한다.
- 함수 종속 관계는 X → Y로 표현하고 X를 결정자, Y를 종속자라고 한다.
완전 함수 종속
- 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X 전체에 종속된 것이지 일부분에 종속된 것이 아님을 의미한다.
- 이와 반대로 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속되는 것을 부분 함수 종속이라고 하며, 부분 함수 종속 관계가 성립하려면 결정자 X가 여러 개의 속성들로 구성되어 있어야 한다.
이행적 함수 종속
- 릴레이션을 구성하는 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X → Y와 Y → Z가 존재하면 논리적으로 X → Y 가 성립한다.
- 이때 속성 집합 Z가 속성 집합 X에 이행적으로 함수 종속되었다고 한다.
정규화 (Normalization)
- 정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것
- 릴레이션이 정규화된 정도를 정규형으로 표현하며, 크게 기본 정규형과 고급 정규형으로 나뉜다.
- 기본 정규형: 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형
- 고급 정규형: 제4정규형, 제5정규형
- 각 정규형마다 만족시켜야 하는 제약조건이 존재하며, 릴레이션이 특정 정규형의 제약조건을 만족하면 릴레이션이 해당 정규형에 속한다고 표현한다.
- 일반적으로 차수가 높은 정규형에 속하는 릴레이션일수록 데이터 중복이 줄어 데이터 중복에 의한 이상 현상이 발생하지 않는 올바른 릴레이션일 수 있지만, 모든 릴레이션이 제5정규형에 속해야 되는 것은 아니므로 릴레이션의 특성을 고려해서 적합한 정규형을 찾아야 한다.
제1정규형
- 릴레이션에 속한 모든 속성의 도메인이 원자값으로만 구성되어 있으면 제1정규형에 속한다.
- 위와 같은 릴레이션에서 한 명의 고객이 여러 이벤트에 참여할 수 있으므로, 이벤트번호와 당첨여부가 다중 값 속성으로 표현되어 있다.
- 다중 값을 가지는 속성을 포함한 릴레이션은 제1정규형의 제약조건을 만족하지 못하므로 해당 릴레이션은 제1정규형에 속하지 않는다.
- 이 릴레이션을 제1정규형에 속하게 하려면 튜플마다 이벤트번호와 당첨 여부 속성 값을 하나씩만 포함하도록 분해하여, 모든 속성이 원자 값을 가지도록 해야 한다.
- 위의 릴레이션은 이제 제1정규형에는 속하지만, 불필요한 데이터 중복으로 인해 아래와 같은 이상 현상이 발생할 수 있다.
이상 현상 | 설명 |
삽입 이상 | 이벤트에 참여하지 않으면 기본키를 구성하는 이벤트번호 속성이 NULL 값이 되므로 개체 무결성 제약조건을 위반하게 되므로, 새 고객에 대한 데이터를 삽입하려면 고객이 이벤트에 무조건 참여해야 한다. |
갱신 이상 | 만약 일부 튜플만 등급 속성의 값을 변경하면 동일한 고객이 2개의 등급 값을 가져 데이터 일관성을 유지할 수 없게 된다. |
삭제 이상 | 어떤 고객과 관련된 튜플이 하나일 경우 이 튜플을 삭제하면 이벤트와 관련이 없는 고객 정보도 함께 삭제되므로 꼭 필요한 데이터를 유지할 수 없게 된다. |
- 이러한 이상 현상이 발생하는 이유는 등급과 할인율 속성이 기본키인 [고객아이디, 이벤트번호]에 완전 함수 종속되지 못하기 때문이다.
제2정규형
- 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제2정규형에 속한다.
- 정규화 과정에서 릴레이션을 분해할 때 주의할 점은, 분해된 릴레이션들을 자연 조인하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다는 것이다.
- 즉, 릴레이션이 의미상 동등한 릴레이션들로 분해되어야 하고, 릴레이션을 분해했을 때 정보 손실이 발생하지 않아야 한다. (무손실 분해)
- 이벤트참여 릴레이션은 함수 종속성을 단 하나만 포함하므로 이상 현상이 발생하지 않지만, 고객 릴레이션은 아직 함수 종속성을 여러개 포함하고 있어 이상 현상이 발생할 수 있다.
이상 현상 | 설명 |
삽입 이상 | 새로운 등급과 할인율에 대한 정보는 해당 등급에 속하는 고객이 있어야 고객 릴레이션에 삽입할 수 있다. |
갱신 이상 | 등급에 대한 할인율이 변경되면 해당 등급에 관련된 모든 튜플에서 할인율 속성 값을 똑같이 변경해야 한다. |
삭제 이상 | 고객 탈퇴로 인해 고객 릴레이션에서 튜플의 삭제가 발생하면 등급과 할인율에 대한 정보까지 삭제된다. |
- 이러한 이상 현상이 발생하는 이유는, 함수적 종속 관계를 여러 개 포함하고 있어 결과적으로 이행적 함수 종속이 생기기 때문이다.
제3정규형
- 릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제3정규형에 속한다.
- 고객 릴레이션에서 할인율이 기본키인 고객아이디에 함수적으로 종속됨과 동시에 등급을 통해서 고객아이디에 이행적으로 종속된다.
- 따라서 이상 현상이 발생하지 않도록 하려면 이행적 함수 종속이 나타나지 않도록 2개의 릴레이션으로 분해해야 한다.
- 고객 릴레이션은 기본키인 고객아이디가 등급을 직접 결정하므로 제3정규형에 속하고, 고객등급 릴레이션도 기본키인 등급이 할인율을 직접 결정하므로 제3정규형에 속한다.
보이스/코드 정규형
- 지금까지 살펴본 릴레이션들은 모두 기본키와 후보키를 하나씩 가지고 있었지만, 실제로는 하나의 릴레이션에 여러 개의 후보키가 존재할 수 있다.
- 이러한 경우에는 제3정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있다.
- 후보키를 여러 개 가지고 있는 릴레이션에 발생할 수 있는 이상 현상을 해결하기 위해 제3정규형보다 조금 더 엄격한 제약조건을 제시한 것이 보이스/코드 정규형이다.
- 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.
- 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만, 제3정규형에 속하는 릴레이션은 항상 보이스/코드 정규형에 속하는 것은 아니기 때문에 보이스/코드 정규형을 강한 제3정규형이라고도 한다.
- 강좌신청 릴레이션은 학생이 특강을 신청하면 해당 강좌의 교수에 대한 데이터를 저장한다.
- 한 학생이 특강을 여러 개 신청할 수 있지만 동일한 강좌를 여러 번 신청할 수는 없다.
- 교수 한 명이 특강을 하나만 담당할 수 있고, 하나의 특강은 여러 강사가 담당할 수 있다.
- 그러므로 튜플을 구별할 수 있는 후보키로는 [학생번호, 특강이름]과 [학생번호, 교수]가 있고, 이 중에서 [학생번호, 특강이름]을 기본키로 선정했다.
- 이때 후보키가 아닌 교수가 특강이름을 결정하므로 위의 릴레이션은 보이스/코드 정규형에 속하지 않으며, 아래와 같은 이상 현상이 발생할 수 있다.
이상 현상 | 설명 |
삽입 이상 | 교수가 특강을 담당하게 되었지만 이 강좌를 신청한 학생이 없다면, 이 내용을 릴레이션에 삽입할 수 없다. |
갱신 이상 | 교수가 담당하는 특강이 변경될 경우 해당 교수와 관련된 모든 튜플의 특강 속성의 값을 모두 변경하지 않으면 교수가 특강을 여러 개 담당하게 되어 모순이 발생한다. |
삭제 이상 | 학생이 특강을 취소해서 해당 튜플을 삭제하면, 해당 강좌를 맡고 있는 교수 정보도 함께 삭제된다. |
- 이러한 이상 현상은 후보키가 아니면서 함수 종속 관계에서 다른 속성을 결정하는 속성이 존재하기 때문이다.
- 따라서 모든 결정자가 후보키가 될 수 있도록 아래와 같이 2개의 릴레이션으로 분해해야 한다.
- 특강신청 릴레이션은 함수 종속 관계가 성립하지 않는 동등한 학생번호-교수 속성으로 구성하고, [학생번호, 교수]가 기본키의 역할을 담당한다.
- 특강교수 릴레이션은 함수 종속 관계를 포함하고 있고 특강이름이 유일한 후보키이지 기본키가 된다.
고급 정규형
- 제4정규형은 릴레이션이 보이스/코드 정규형을 만족하면서, 함수 종속이 아닌 다치 종속을 제거해야 만족할 수 있다.
- 제5정규형은 릴레이션이 제4정규형을 만족하면서 후보키를 통하지 않는 조인 종속을 제거해야 만족할 수 있다.
- 일반적으로는 제3정규형이나 보이스/코드 정규형에 속하도록 릴레이션을 분해한다.
'Computer Science > Database' 카테고리의 다른 글
NoSQL과 종류 (0) | 2022.03.29 |
---|---|
트랜잭션과 ACID (0) | 2022.02.22 |
JOIN의 종류 (0) | 2022.02.19 |
`서브쿼리와 뷰 (0) | 2022.02.19 |
테이블과 키 (0) | 2022.02.19 |