📌 정규화
✅ 도부이결다조
✅ 함수적 종속성
- f(x)=y
- 함수적 종속이라는 표현은 수학의 함수에서 유래
- y는 x의 값에 의해 결정되는 관계로서, y는 x에 종속적이고, 이를 수학적인 표현에서는 y는 x에 함수종속적이다 라고 표현
- 정규화 관련해서 빈번히 사용되는 표현으로서, a가 b에 함수종속적이다 하면 b의 값에 의해 a가 결정됨을 의미
- 예시)
- 학번과 학부
- 학번 -> 학부
- 즉, 학번에 따라 학부가 결정되므로, 학부는 학번에 함수 종속적
- 등록금과 학부
- 학부 -> 등록금
- 학부에 따라 등록금이 결정되므로, 등록금은 학부에 함수 종속적
정규화 적용 전 테이블 모습
✅ 1차 정규화(도메인 분해)
- 모든 열의 값이 원자적이어야 함. 즉, 각 열에는 하나의 값만 있어야 함을 의미
- 하나의 컬럼에 여러 원자값이 존재시, 조회조건을 통한 조회 어려움 발생
- 수정/삭제가 발생할때 특정 데이터를 찾아 수정/삭제의 어려움
- FK 및 index 지정이 불가능함
- 즉, 1차 정규화는 여러 원자값의 컬럼을 쪼개는 과정
-> STUDENT_ID, COURSE_ID 다중 컬럼 키여야 유일하게 구별 가능
✅ 2차 정규화(부분종속 제거)
- 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 상태를 의미
- 복합키로 이루어진 기본키 중에 특정 키에도 종속적이면 2차 정규화가 안된 상황
- 2차 정규화를 위한 방법
- 기본키가 아닌 키에 부분적으로 종속돼 있는 특정 컬럼값을 제거
- 기본키에 종속적이지 않다면 해당 테이블에 어울리지 않는 컬럼이라는 생각 필요
- 사실상 해당 테이블에 어울리지 않는 컬럼 분리 작업
- 불필요한 컬럼을 제거하면 공간 효율적
키워드 : 복합키(다중 컬럼 키)
STUDENT_ID에 종속적인 다른 컬럼(STUDENT_NM, DEPARTMENT, FEES)이 존재
= STDENT_ID만 있으면 STUDENT_NM, DEPARTMENT, FEES 값 확인이 가능하다
-> 다른 테이블로 분리 -> 분리될 때 PK키 하나를 가져감
ex)
STUDENT_NM은 STUDENT_ID 정보만 있어도 조회할 수 있음
= 학생 이름은 학번이 있으면 조회 가능 => 분리 대상
GRADE는 STUDENT_ID 혹은 COURSE_ID 중 하나만 있으면 확인할 수 없음
= 성적은 학생 이름만 알고 있으면 조회 불가능, 과목명만 알고 있어도 조회 불가능 => 분리 비대상
= ( STUDENT_ID, STUDENT_ID ) 복합키에 의해서만 구분됨
2차 정규화를 마치고, 학생 수가 늘어나면 DEPARTMENT와 FEES에 엄청난 중복이 발생됨 -> 중복 제거해야 함!
✅ 3차 정규화(이행종속(transitive depency)제거)
-
- X ->Y 이고 Y->Z 이면 X->Z 가 성립. Z가 X에 이행적으로 함수 종속
- 모든 속성이 기본키에 이행적 함수 종속이 되지 않아야 함
- 즉, 이행종속이 되는 부분종속을 제거해야 하는 특성상, 부분종속과 구분 이 어려운 부분
- 만약 학번이 PK. pk -> 학부, 학부 -> fees. 즉, pk -> fees가 되어 fees가 pk에 이행종속적
키워드 : PK를 제외한 컬럼들이 자기들끼리 의존관계
-> 다른 테이블로 분리 -> 분리될 때 PK키 하나를 가져가지 않고 컬럼들만 떼감 (기본키와 종속 관계가 없기 떄문)
✅ BCNF 정규화 (결정자이면서 후보키가 아닌 것 제거)
- 결정자이면서 후보키가 아닌 것 제거
- 후보키 집합에 속하지 않은 결정자가 존재하면 BCNF 위반
- 후보키란 테이블 내에 유일성을 가질 수 있는 key 중 하나
- BCNF(Boyce and Code Normal Form)은 제 3 정규형을 조금 더 강화시킨 개념
과목별담당교수는 후보키가 아닌데 과목명을 결정짓는 결정자다
= 학생수강관련정보 테이블에서 담당교수가 맡는 과목명이 바뀌면 수강생 수만큼 과목명이 다 변경된다
갱신에 있어서 문제가 발생할 수도 있음 => 분리
BCNF 정규화로 우측 두 테이블로 나눌 경우, 담당교수의 과목명이 바뀌어도 학생에게 영향을 주지 않는다.
✅ 4차 정규화 (다치 종속 제거)
하나의 릴레이션에서 여러 속성과의 관계가 1:N 관계인 경우
-> 학생이 과목과도 1:N이고, 동호회화도 1:N인 경우 분리
✅ 5차 정규화 (조인 종속 제거)
- 하나의 릴레이션을 여러 개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생기는 것
- 하나의 컬럼이 두 개 이상의 컬럼에 종속적일 경우 발생하는 문제
- 만약 홍길동이 C언어를 택하게 되면 무조건 야구부도 가입이 된다면?
- 학생+과목이 프레임워크를 결정짓는 raw 데이터가 있다면 다치종속을 제거하더라도 조인종속성 이슈 발생
- 이 경우, 과목, 프레임워크 테이블을 하나 더 만들어 3테이블 조인 필요
학생+과목, 프레임워크+학생 2개의 테이블을 다시 JOIN하게되면 분해 전 결과와 다르다. => 조인 종속성 위반
과목, 프레임워크 테이블을 하나 더 만들어 3테이블 조인을 해야 동일한 결과가 나온다
'Back-End 공부 > Database' 카테고리의 다른 글
[Database] 고가용성 DB서버 구성 방법 (클러스터링, 레플리카, 샤딩) (1) | 2023.11.27 |
---|---|
[Database] 데이터 모델링(개념적, 논리적, 물리적) (1) | 2023.11.24 |
[Database] DB Dump로 백업, 복구하기 (0) | 2023.11.22 |
[Database] 사용자 관리, 사용자 권한부여(GRANT, REVOKE) (0) | 2023.11.22 |
[Database] DB 동시성 이슈(Dirty Read, Non-Repeatable Read, Phantom Read) (2) | 2023.11.22 |