데이터의 중복을 최소화하여 anomaly방지, 일관성을 보장하여 데이터베이스의 품질을 보장하고 성능을 향상.
데이터베이스 내 데이터들이 불필요하게 중복되어 릴레이션 조작 시 예기치 못한 곤란한 현상이 발생한다. 이를 anomaly(이상)라 하며, 삽입 이상, 삭제 이상, 갱신 이상이 있다.
: 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블 분해.
이름 | 취미 |
---|---|
세정 | 필라테스, 드럼 |
예진 | 필라테스 |
수현 | 요가, 요리 |
승주 | 테니스 |
이런 테이블이 존재할 때 세정과 수현은 여러개의 취미를 가지고 있으므로 제1정규형을 만족하지 못한다.
이를 분해하여 제1 정규화를 진행한 테이블은,
이름 | 취미 |
---|---|
세정 | 필라테스 |
세정 | 드럼 |
예진 | 필라테스 |
수현 | 요가 |
수현 | 요리 |
승주 | 테니스 |
이렇게 표현할 수 있다.
: 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해.
기본키가 아닌 모든 속성이 기본키에 대해 완전 함수적 종속을 만족한다.
함수적 종속?
데이터들이 어떤 기준값에 의해 종속되는 것.
ex) <수강> 릴레이션이 (학번, 이름, 과목명)으로 되어있을 때 학번이 결정되면 과목명에 상관없이 항상 같은 이름이 대응된다.
학번에 따라 이름이 결정될 때 이름을 학번에 함수 종속적이라고 한다.(학번->이름)
완전 함수적 종속?
어떤 속성이 기본키에 대해 완전히 종속적인 경우
부분 함수적 종속?
어떤 속성이 기본키의 일부에 대해 종속적인 경우
[수강강좌] 테이블
학생번호 | 강좌이름 | 강의실 | 성적 |
---|---|---|---|
1 | 필라테스 | A101 | 4.0 |
2 | 드럼 | A103 | 3.0 |
3 | 필라테스 | A101 | 4.0 |
4 | 테니스 | A106 | 3.0 |
5 | 드럼 | A103 | 3.5 |
6 | 테니스 | A106 | 3.5 |
이 테이블에서 기본키는 (학생번호, 강좌이름) 의 복합키.
(학생번호, 강좌이름) 기본키는 (성적)을 결정.
(강좌이름)은 (강의실)을 결정.
=> 기본키의 부분키인 (강좌이름)이 결정자이기 때문에 기존의 테이블에서 (강의실)을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
[수강] 테이블
학생번호 | 강좌이름 | 성적 |
---|---|---|
1 | 필라테스 | 4.0 |
2 | 드럼 | 3.0 |
3 | 필라테스 | 4.0 |
4 | 테니스 | 3.0 |
5 | 드럼 | 3.5 |
6 | 테니스 | 3.5 |
[강의실] 테이블
강좌이름 | 강의실 |
---|---|
필라테스 | A101 |
드럼 | A103 |
테니스 | A106 |
: 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해.
기본키가 아닌 모든 속성이 기본키에 대해 이행종속을 만족하지 않음
이행종속?
A->B, B->C가 성립할 때 A->C 성립.
[계절학기] 테이블
학생번호 | 강좌이름 | 수강료 |
---|---|---|
1 | 필라테스 | 20000 |
2 | 드럼 | 15000 |
3 | 필라테스 | 20000 |
4 | 테니스 | 25000 |
5 | 드럼 | 15000 |
6 | 테니스 | 25000 |
(학생번호)는 (강좌이름) 결정.
(강좌이름)은 (수강료) 결정.
따라서 (학생번호, 강좌이름) 테이블과 (강좌이름, 수강료) 테이블로 분해해야한다.
이행적 종속을 제거하는 이유?
예를 들어 1번 학생이 수강 강좌를 드럼으로 변경한 상황에서 이행적 종속이 존재하면,
1번 학생은 드럼을 20000원의 수강료로 듣게 된다.
강좌 이름에 맞게 수강료를 다시 변경할 수 있으나 번거롭다!
따라서 (학생번호)를 통해 (강좌이름)을 참조, (강좌이름)으로 (수강료)참조하도록 테이블 분해해야하며 그 결과는 다음과 같다.
[계절수강] 테이블
학생번호 | 강좌이름 |
---|---|
1 | 필라테스 |
2 | 드럼 |
3 | 필라테스 |
4 | 테니스 |
5 | 드럼 |
6 | 테니스 |
[수강료] 테이블
강좌이름 | 수강료 |
---|---|
필라테스 | 20000 |
드럼 | 15000 |
테니스 | 25000 |
: 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해.
[특수수강] 테이블
학생번호 | 특강이름 | 강사 |
---|---|---|
1 | 필라테스 | 이땡땡 |
2 | 드럼 | 김띵띵 |
3 | 필라테스 | 이땡땡 |
4 | 테니스 | 박똥똥 |
5 | 드럼 | 김띵띵 |
6 | 테니스 | 박똥똥 |
특수수강 테이블에서 기본키는 (학생번호, 특강이름).
그리고 이 기본키는 (강사)를 결정.
또한 여기서 (강사)는 (특강이름)을 결정.
문제는 (강사)가 (특강이름) 결정하는 결정자지만 후보키가 아니다.
따라서 BCNF 정규화를 만족시키기 위해 위 테이블을 다음과 같이 분해해야 한다.
[특강신청] 테이블
학생번호 | 강사 |
---|---|
1 | 이땡땡 |
2 | 김띵띵 |
3 | 이땡땡 |
4 | 박똥똥 |
5 | 김띵띵 |
6 | 박똥똥 |
[특강강사] 테이블
특강이름 | 강사 |
---|---|
필라테스 | 이땡땡 |
드럼 | 김띵띵 |
테니스 | 박똥똥 |
대부분의 릴레이션에서는 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 BCNF까지 정규화 한다고 한다.
: BCNF만족. 다치종속 제거
다치종속?
A->B일 때 하나의 A값에 여러 개의 B값 존재하면 다치 종속성 가진다고 한다.
A ->>B로 표시.
최소 세개의 컬럼이 존재 - 컬럼 A, B, C가 있고 A와 B 사이 다치 종속성이 있을 때 B와 C가 독립적이다.
학생번호 | 수강강의 | 취미 |
---|---|---|
1 | 자료구조 | 필라테스 |
1 | 알고리즘 | 드럼 |
2 | 데이터베이스 | 필라테스 |
2 | 운영체제 | 요가 |
위 테이블에서 (학생번호) 하나에 (수강강의) 여러개와 (취미) 여러개가 종속된다.
이 경우 (학생번호)를 기준으로 값을 조회하면 다음과 같이 중복이 발생한다.
학생번호 | 수강강의 | 취미 |
---|---|---|
1 | 자료구조 | 필라테스 |
1 | 자료구조 | 드럼 |
1 | 알고리즘 | 필라테스 |
1 | 알고리즘 | 요가 |
(수강강의)와 (취미)는 서로 관계가 없다.(독립적)
그러나 같은 테이블의 (학생번호)라는 컬럼에 다치 종속되어버려 중복이 발생하고 있다.
이는 다음과 같이 분해할 수 있다.
학생번호 | 수강강의 |
---|---|
1 | 자료구조 |
1 | 알고리즘 |
2 | 데이터베이스 |
2 | 운영체제 |
학생번호 | 수강강의 |
---|---|
1 | 필라테스 |
1 | 드럼 |
2 | 필라테스 |
2 | 요가 |
여전히 다치 종속성을 가지나 두개 이상의 컬럼이 하나의 컬럼에 다치 종속되지는 않으므로 제4 정규형 만족.
: 제4 정규화 만족. 조인종속 제거.
하나의 릴레이션을 여러개의 릴레이션으로 무손실 분해했다가 다시 결합할 수 있으면 조인 종속.
A 릴레이션을 B와 C로 분해했다가 다시 조인했을 때 그대로 A가 되면 A는 조인 종속성이 있다고 한다.
https://mangkyu.tistory.com/110
https://code-lab1.tistory.com/270