정규화 ?
-
DB시스템을 만지다보면 엄청나게 많은 테이블들이 얽혀있어 하나의 데이터를 수정했을때 여러문제가 생길 수 있는데, 정규화를 통해서 정해진 규칙대로 테이블을 쪼개게 되면, 문제점들을 사전에 해소할 수 있음.
-
가장 대표적인 문제점들로는 삭제이상(delete), 삽입이상(insert), 수정이상(update)
- 삭제이상은 지정된 테이블에서 데이터를 삭제하려고 하는데, 연결된 다른테이블에서도 데이터가 삭제되는 것이다.
- 삽입이상은 지정된 테이블에 데이터를 삽입하려고 하는데, 연결된 다른테이블에서도 데이터가 삽입되는 것이다.
- 수정이상은 원하는 데이터를 모두 수정하지 못하고, 일부 데이터만 수정되는 것이다.
이러한 문제점들을 해소하기 위해서 테이블을 쪼개는 것이다.
제1정규화
- 어떤 Relation에 속한 모든 Domain이 원자값만으로 되어 있다.
- 모든 attribute에 반복되는 그룹이 나타나지 않는다
- 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야한다.
릴레이션 = 테이블 = 앤티티 = 개체
행 = row = 레코드 = 투플
열 = 컬럼 = 필드 = 속성 = 어트리뷰트
원자값 (atomic value) : 더 이상 쪼갤 수 없는 값
-
1번은 그냥 한개의 릴레이션에 여러개의 값이 들어가면 안된다는 것이다.
ex ) 취미 : 등산, 골프 » 이러면 안된다는 것이다. -
2번은 위와같이 한개의 Relation에 여러개의 값이 들어가는 것을 막기위해 같은 그룹을 여러 개 만드는것이다. ex ) 취미1 : 등산, 취미2 : 골프 » 이러면 1번을 안하려고 억지로 릴레이션을 분리하는것이니깐 정규화 하는 의미가 없다.
-
3번은 1번,2번 case를 막기위해
내취미 : 등산, 내취미 : 골프
이런식으로 같은 릴레이션을 만들어 관련 데이터를 고유하게 식별하지 못하게 하면 안된다는 것이다. - 사실 그냥 반복그룹을 제거하되 그괴정에서 의미가 없는 방식으로 제거하지 말라는 것이다.
- 왜 정규화 하는지를 생각하면 제1정규화는
반복그룹제거
하나로 방식을 통일할 수 있다.
제2정규화
- 제2 정규화를 수행 했을 경우 테이블의 모든 컬럼이 완전 함수적 종속을 만족한다.
부분 함수적 종속을 모두 제거했다는 뜻이다.
- 함수적 종속 : x값에 따라 y값이 결정될 때 x->y로 표현하는데, 이를 y는 x에 대해 수적 종속이라고 한다.
예를들어 학번을 알면 이름을 알 수 있는데, 이 경우엔 학번이 x가 되고 이름이 y가 된다.
x를 결정자라고 하고, y를 종속자라고 한다.
즉 다시말해서, x가 바뀌었을 경우 y가 바뀌어야만 한다는 것이다.
함수적 종속에서 x의 값이 여러 요소일 경우, 즉 {x1,x2} -> y 일 경우, x1과 x2가 y의 값을 결정할 때 이를 완전 함수적 종속이라고 하고, x1,x2 중 하나만 y의 값을 결정할 때 이를 부분 함수적 종속이라고 한다.
위에서 model과 manufacture을 알면 model full name 필드를 아예 유지하지 않거나 참조하지 않아도 결정되기 때문에 {model,manufactor} -> model full name 이라고 할 수 있다. 하지만, {model, manufactor} -> manufactor country 에서 model과 manufacturer country는 아무런 연관 관계가 없기 때문에, manufacturer country는 manufacturer와만 종속관계에 있게 되고 이를 부분 함수 종속이라고 하게 되는 것이다. 아래의 그림을 보면 쉽게 이해할 수 있다.
위에서 부분 함수 종속을 제거 하게 되면, 아래와 같은 그림이 된다.
따라서, 부분 함수 종속을 제거한 이후의 테이블은 아래와 같고, 이는 제 2정규형을 만족한 테이블이다.
- 왜 정규화 하는지를 생각하면 제2정규화는
부분함수적종속성제거
하나로 방식을 통일할 수 있다.
제3정규화
- 테이블(Relation)이 제 3정규형을 만족한다는 것은 아래 두 가지 조건을 만족하는 것을 의미한다.
- Relation이 제 2정규화 되었다.(The relation is in second normal form)
- 기본 키(primary key)가 아닌 속성(Attribute)들은 기본 키에만 의존해야 한다.
위 테이블에서 {Tournament, Year}가 후보키가 된다. 하지만 Winner Date of Birth은 기본키가 아닌 속성인 Winner를 거쳐 {Tournament, Year}에 의존하고 있는 것을 알 수 있는데, 이는 3NF를 위반한 것이 된다. 따라서 테이블을 아래와 같이 둘로 나누어 주자
위 테이블은 3정규화를 만족한 상태이다.
- 왜 정규화 하는지를 생각하면 제3정규화는
이행적종속성
하나로 방식을 통일할 수 있다.