[DB] 정규화

szlee·2023년 11월 27일
0

데이터베이스

목록 보기
3/8

정규화

데이터의 중복을 최소화하여 anomaly방지, 일관성을 보장하여 데이터베이스의 품질을 보장하고 성능을 향상.

  • 무결성 유지
  • DB 저장 용량 줄일 수 있다.



Anomaly

데이터베이스 내 데이터들이 불필요하게 중복되어 릴레이션 조작 시 예기치 못한 곤란한 현상이 발생한다. 이를 anomaly(이상)라 하며, 삽입 이상, 삭제 이상, 갱신 이상이 있다.

  • 삽입 이상 : 릴레이션에 데이터 삽입 시 의도하지 않은 값도 함께 삽입
  • 삭제 이상 : 릴레이션에서 한 튜플 삭제 시 의도하지 않은 값도 함께 삭제
  • 갱신 이상 : 릴레이션에서 튜플에 있는 속성값 갱신 시 일부 튜플의 정보만 갱신되어 정보에 모순이 생김.











정규화 원칙

  • 정보의 무손실
  • 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리
  • 데이터의 중복 감소





정규화 과정

[제1 정규화]

: 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블 분해.

이름취미
세정필라테스, 드럼
예진필라테스
수현요가, 요리
승주테니스

이런 테이블이 존재할 때 세정과 수현은 여러개의 취미를 가지고 있으므로 제1정규형을 만족하지 못한다.

이를 분해하여 제1 정규화를 진행한 테이블은,

이름취미
세정필라테스
세정드럼
예진필라테스
수현요가
수현요리
승주테니스

이렇게 표현할 수 있다.



[제2 정규화]

: 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해.
기본키가 아닌 모든 속성이 기본키에 대해 완전 함수적 종속을 만족한다.


함수적 종속?
데이터들이 어떤 기준값에 의해 종속되는 것.
ex) <수강> 릴레이션이 (학번, 이름, 과목명)으로 되어있을 때 학번이 결정되면 과목명에 상관없이 항상 같은 이름이 대응된다.
학번에 따라 이름이 결정될 때 이름을 학번에 함수 종속적이라고 한다.(학번->이름)

완전 함수적 종속?
어떤 속성이 기본키에 대해 완전히 종속적인 경우

부분 함수적 종속?
어떤 속성이 기본키의 일부에 대해 종속적인 경우

[수강강좌] 테이블

학생번호강좌이름강의실성적
1필라테스A1014.0
2드럼A1033.0
3필라테스A1014.0
4테니스A1063.0
5드럼A1033.5
6테니스A1063.5

이 테이블에서 기본키는 (학생번호, 강좌이름) 의 복합키.
(학생번호, 강좌이름) 기본키는 (성적)을 결정.
(강좌이름)은 (강의실)을 결정.
=> 기본키의 부분키인 (강좌이름)이 결정자이기 때문에 기존의 테이블에서 (강의실)을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.

[수강] 테이블

학생번호강좌이름성적
1필라테스4.0
2드럼3.0
3필라테스4.0
4테니스3.0
5드럼3.5
6테니스3.5

[강의실] 테이블

강좌이름강의실
필라테스A101
드럼A103
테니스A106


[제3 정규화]

: 제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


[BCNF 정규화]

: 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해.

[특수수강] 테이블

학생번호특강이름강사
1필라테스이땡땡
2드럼김띵띵
3필라테스이땡땡
4테니스박똥똥
5드럼김띵띵
6테니스박똥똥

특수수강 테이블에서 기본키는 (학생번호, 특강이름).
그리고 이 기본키는 (강사)를 결정.
또한 여기서 (강사)는 (특강이름)을 결정.
문제는 (강사)가 (특강이름) 결정하는 결정자지만 후보키가 아니다.
따라서 BCNF 정규화를 만족시키기 위해 위 테이블을 다음과 같이 분해해야 한다.

[특강신청] 테이블

학생번호강사
1이땡땡
2김띵띵
3이땡땡
4박똥똥
5김띵띵
6박똥똥

[특강강사] 테이블

특강이름강사
필라테스이땡땡
드럼김띵띵
테니스박똥똥

대부분의 릴레이션에서는 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 BCNF까지 정규화 한다고 한다.



[제4 정규화]

: 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 정규형 만족.



[제5 정규화]

: 제4 정규화 만족. 조인종속 제거.


하나의 릴레이션을 여러개의 릴레이션으로 무손실 분해했다가 다시 결합할 수 있으면 조인 종속.
A 릴레이션을 B와 C로 분해했다가 다시 조인했을 때 그대로 A가 되면 A는 조인 종속성이 있다고 한다.









https://mangkyu.tistory.com/110
https://code-lab1.tistory.com/270

profile
🌱

0개의 댓글