이상이란, 말 그대로 테이블에 문제가 생긴 상태를 의미한다.
쉽게 말하면 이러한 이상을 없애는 과정을 정규화라고 하며, 진찰 도구로 Functional Dependency(함수 종속성)을 사용하여 고치게 된다.
다음의 기본키가 (학번, 과목번호)인 수강 릴레이션을 예시로 들어보자.
총 세 가지 종류의 이상이 생기는 것을 발견 할 수 있다.
– 200번 학생이 'C123'의 등록을 취소하면, 3학년이라는 정보도 함께 삭제된다.
– 연쇄 삭제에 의한 정보의 손실
– 600번 학생이 2학년이라는 사실을 삽입하려면, 어떤 과목을 등록하지 않는 한 삽입이 불가능하다. (∵ 과목 번호가 기본 키)
– 원하지 않는 정보의 강제 삽입
– 400번 학생의 학년을 4에서 3으로 변경하려면, 학번이 400인 4개의 투플 모두를 갱신시켜야 한다.
– 중복데이타의 일부 갱신으로 정보의 모순성(inconsistency) 발생
정리해보면, 이상이 나타나는 원인은 애트리뷰트들 간에 존재하는 여러 종속관계를 하나의 릴레이션에 표현했기 때문이다.
그리고 바로 이러한 이상의 해결 방법이, 애트리뷰트들 간의 종속관계를 분석하여 여러개의 릴레이션으로 분해(decomposition)하는 정규화(normalization) 가 된다.
결국은, 중복성에 따른 여러가지 문제가 발생하는 것이며 함수 종속성을 분석해서 테이블을 분해하는 방식인 정규화로 정제 가능하다.
함수 종속(functional dependency)이란 데이터베이스의 릴레이션에서 두 개의 애트리뷰트 집합 간 제약의 일종이다.
어떤 릴레이션 R에서, X와 Y를 각각 R의 애트리뷰트 집합의 부분 집합이라 하자. 애트리뷰트 X의 값 각각에 대해 항상 애트리뷰트 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수 종속이라 하고, X → Y라고 표기한다.
이때 X를 결정자(determinant set)이라 하고, Y를 종속자(dependent attribute)라고 한다.
완전 함수 종속성은, 기본키 전체에 대해 종속성을 가지는 것을 의미한다. 따라서 하나라도 빼면 함수 종속성이 깨진다.
부분 함수 종속성은, 기본키 일부에 대해 종속성을 가지는 것을 의미한다. 따라서, 하나를 빼도 함수 종속성이 유지된다.
정규형(Normal Form)이란, 어떤 일련의 제약 조건을 만족하는 릴레이션을 말한다. 즉, 정규화된 상태로 즉 이상이 없는 상태를 말한다.
💡 정규화(Normalization)의 원칙
1) 무손실 표현
• 같은 의미의 정보 유지하면서, 더 바람직한 구조를 가져야함
2) 데이타의 중복성 감소
3) 분리의 원칙
• 독립적인 관계는 별개의 릴레이션으로 표현하며, 릴레이션 각각에 대해 독립적 조작이 가능
정규형은 제 5정규형까지 존재한다. 그 중 1,2,3
을 기본 정규형이라 하며 진찰 도구로 함수 종속성
을 사용한다.
제 1정규형이란, 🔥모든 도메인(애트리뷰트)이 원자값(더 이상 쪼개지지 않는 단위)로 된 릴레이션을 의미한다.
즉 1)애트리뷰트의 도메인이 오직 원자값만을 포함하고, 2)튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. 복합 애트리뷰트, 다중 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트를 허용하지 않는 형태인 것이다.
예를 들어, 만약 업무상으로 성과 이름을 나눠서 저장해야한다면 '임경호' 라는 데이터는 원자값을 만족하지 않고, '임' 과 '경호' 를 따로 저장해야 원자값을 만족하게 된다.
성적 애트리뷰트는 (학번, 과목번호)
에 종속되고 있으므로 완전 함수 종속성을 띄고 있다. 하지만 지도교수와 학과 애트리뷰트는 (학번)
에만 종속되고 있으므로 부분 함수 종속성을 띈다.
바로 이러한 부분 함수 종속이 문제가 되며, 테이블로 분리 시켜야 한다.
위의 테이블에서 나타나는 세 가지 이상을 살펴보자.
1) 삽입이상
500번 학생의 지도교수가 P4라는 사실의 삽입, 즉 어떤 교과목을 등록 하지 않는 한 삽입 불가능하다.
2) 삭제이상
200번 학생이 C123 과목의 등록을 취소하여 이 투플을 삭제할 경우, 지도 교수가 P2라는 정보까지 손실된다.
3) 갱신이상
400번 학생의 지도교수를 P1에서 P3로 변경할 경우 학번이 400인 4개 투플의 지도교수 값을 모두 P3로 변경해야 한다.
1NF 이상의 원인은, 바로 🌟기본키에 부분 함수 종속된 애트리뷰트가 존재한다는 것이다. 1)기본키로 식별되는 개체와 2)무관한 애트리뷰트 두가지 상이한 정보가 포함되어 있기 때문에 문제가 되는 것!
🛠1NF 이상의 해결방법은, 바로 프로젝션(두 테이블을 쪼개는 것)으로 릴레이션을 분해 (부분 함수 종속을 제거)하여 2NF 상태로 만드는 것이다.
제 2정규형이란, 1)1NF이고, 2)키에 속하지 않는 애트리뷰트들은 모두 기본키에 🌟완전 함수 종속된 상태🌟를 말한다.
1NF <-> 2NF 을 변환할때는 무손실 분해 가 이루어져야 한다. 즉, 프로젝션으로 분리된 릴레이션들은 자연 조인을 통해 원래의 릴레이션으로 복귀 가능하다. 단, 원래의 릴레이션에서 얻을 수 있는 정보는 분해된 릴레이션 들로부터도 얻을 수 있으나 그 역은 성립하지 않는다.(조인 과정에서 유실)
💡 무손실 분해 공식
R(A, B, C)
함수 종속성 A -> B : R1 (A,B) R2(A,C)
아래는 1번의 테이블을 제 2정규형 상태로 만든 결과이다. 모든 키에 대해 완전 함수 종속된 상태인 것을 알 수 있다.
하지만, 위의 테이블에서도 역시 세 가지 이상이 나타난다.
1) 삽입이상
어떤 지도교수가 특정 학과에 속한다는 사실의 삽입이 불가능하다.
2) 삭제이상
300번 학생의 투플을 삭제하면 지도교수 P3가 컴퓨터공학과에 속 한다는 정보 손실된다.
3) 갱신이상
지도교수 P1의 소속이 컴퓨터공학과에서 전자과로 변경된다면 학 번이 100과 400번인 두개의 투플을 모두 변경하여야 한다.
2NF 이상의 원인은, 🌟바로 이행적 함수 종속🌟이 존재하는 것이다. 이행적 함수 종속성이란, 한 테이블 내에서, transitive한 특성이 발견되는 경우를 말한다.
💡 함수의 특성 세가지
1)x -> x
: reflexive(자기 자신에 대해 성립, equal)
2)x -> y
,y -> x
성립 : symmentric(대칭, equal)
3)x -> y
,y -> z
성립하면x -> z
성립 : transitive(equal)
위의 예시에서 학번(x) -> 지도교수(y)
, 지도교수(y) -> 학과(z)
, 학번(x) -> 학과(z)
가 성립되기 때문에 이행적 함수 종속이 발생하였다고 할 수 있다.
🛠 2NF 이상의 해결 방법은, 프로젝션으로 릴레이션 분해(이행적 함수 종속을 제거)하여 3NF 형태로 만드는 것이다.
제 3정규형이란, 1)2NF이고, 🌟2)키가 아닌 모든 애트리뷰트들은 <기본키>에 이행적 함수 종속되지 않는 상태를 말한다. 역시나 제 2정규형과 제 3정규형 사이에는 무손실 분해가 이루어진다.
아래는 이행적 함수 종속이 생기지 않도록 테이블을 분해(프로젝션)한 결과이다.
'지도'가 학생지도와 지도교수학과 두개의 릴레이션으로 쪼개졌다.
BCNF의 정의는, 🌟릴레이션 R의 모든 결정자가 후보키🌟 이면 릴레이션 R은 BCNF에 속한 상태라고 말한다.
만약 결정자(함수 종속에서의 X, Determinant)인데 후보키가 아닌 것이 존재하면, unique하지 못하므로 결정자가 중복되버려 문제가 일어나는 것이다.
릴레이션 R이 BCNF에 속하면, R은 제1, 제2, 제3 정규형에 속하기 때문에 강한 제3정규형(strong 3NF)이라고도 한다. 예시를 들어보자.
아래는 수강과목 릴레이션으로, 후보키와 기본키 그리고 함수 종속은 다음과 같다.
후보키 : {학번,과목}, {학번,교수}
기본키 : {학번,과목}
함수종속 : {학번,과목} → 교수, 교수→ 과목
1) 삽입이상
교수 P5가 자료구조를 담당한다는 사실의 삽입은 학번(수강 학생) 이 있어야 가능하다.
2) 삭제이상
100번 학생이 자료구조를 취소하여 투플을 삭제하면 P2가 담당교수라는 정보도 삭제된다.
3) 갱신이상
P1이 프로그래밍 과목 대신 자료구조를 담당하게 되면 P1이 나타난 모든 투플을 변경하여야 한다.
👉즉 주요 원인은, 교수가 결정자이지만 후보키가 아닌 것이다.
수강과목 릴레이션을, 수강교수와 과목교수 두 개의 릴레이션으로 분리하면 문제가 해결된다.
참고자료
교수님 PPT
위키피디아:함수 종속
제 1정규화 설명