정규화(Normalization)란!?
정규화는 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이 됩니다.
이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 됩니.
이를 단계별로 구분하여 정규형이 높아질수록 이상현상은 줄어들게 됩니다.
이상현상(Anomaly)이란?
이상현상이란, 테이블 내의 데이터들이 불필요하게 중복되어 테이블을 조작할 때 발생되는 데이터 불일치 현상입니다.
이상현상은 크게 삽입이상,삭제이상,갱신이상 3가지로 분류됩니다.
- 삽입 이상(insertion anomalies) - INSERT
- 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말합니다. - 삭제 이상(deletion anomalies) - DELETE
- 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말합니다. - 수정(갱신)이상(modification anomalies) - UPDATE
정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말합니다.
정규화 과정 및 종류
- 1NF (제 1 정규형) - 도메인 원자값
- 2NF (제 2 정규형) - 부분적 함수 종속 제거
- 3NF (제 3 정규형) - 이행적 함수 종속 제거
- BCNF (보이스코드 정규형) - 결정자이면서 후보키가 아닌 것 제거
- 4NF (제 4 정규형) - 다치 종속 제거
- 5NF (제 5 정규형) - 조인 종속성 이용
정구형 숫자가 올라갈수록(그림에서 안쪽으로 갈 수록) 점점 더 엄격해지며 하나의 단계는 전단계의 대한 모든 조건을 만족해야합니다.
4NF 와 5NF 까지 모두 만족시키려면 릴레이션 수가 너무 많아지면서 관리하기 어려워집니다.
때문에 BCNF까지만 정규화시키는 방법을 많이 사용하며 이 포스팅에서도 BCNF만 다루려고 합니다.
정규화 원칙 & 장/단 점
원칙
- 정보의 무손실 : 분해된 릴레이션이 표현하는 정보는 분해되기 전의 정보를 모두 포함해야 합니다.
- 최소 데이터 중복 : 이상 현상을 제거, 데이터 중복을 최소화
- 분리의 원칙 : 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리해서 표현
장점
- 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있습니다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 됩니다.
- 한 테이블의 데이터 용량이 최소화되는 효과가 있습니다.
단점
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아집니다.
- 질의에 대한 응답시간이 느려질 수도 있습니다.
- 만약 조인이 많이 발생하여 성능저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있습니다.
제 1 정규형
릴레이션에 속한 모든 속성의 도메인이 원자값(Atomic Value)으로만 이루어져 있어야합니다.
속성의 도메인이 원자 값으로만 이루어져있어야 한다?
- 간단하게 말하면 필드의 값이 한개만 있어야 한다고 생각하면 쉽습니다.
id 1번 튜플의 name은 두개의 값을 가지고있습니다. 이는 원자값으로 이루어지지않았음을 의미하고 아래와 같이 정규화 할 수 있습니다.
제 2 정규형
기본키가 아닌 모든 속성이 기본키에 완전함수 종속되어야 합니다.
기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것을 뜻합니다.
이것을 이해하려면 함수종속성과 완전함수종속 & 부분함수종속 에 대한 이해가 필요합니다.
함수종속성(functional dependency)이란?
함수와 같이 어떠한 값을 통해 종속 관계에 있는 다른 값을 유일하게 결정할 수 있다는 것
many-to-one 의 관계를 보면 one이 many를 결정합니다. 이것을 의미한다고 보면 이해가 쉽습니다.
[ 이때 one을 결정자(Determinant), many를 종속자(Dependant)라고 합니다. ]
완전함수종속 이란?
모든 칼럼이 기본키에 완전함수 종속이 되어야 합니다.
== 모든칼럼이 부분함수종속이 존재하면 안됩니다.
부분함수종속 이란?
종속자가 기본키의 특정 속성에만 종속되는것을 의미합니다.
정리
- 기본키가 여러개일경우 모든 기본키에 종속된것을 완전함수종속
- 일부분에만 종속된것을 부분함수종속 이라고합니다.
예제 Table
- 교수이름
- 교수이름은 학생이름과 관련없이 수강과목에만 관련이 있습니다.
- 이를 교수이름에 종속되었다고 하며 학생이름에는 종속되지 않았기에 부분함수종속 이라고 합니다. - 성적
- 성적을 정하는것은 수강과목 + 학생이름입니다.
- 수강과목만 있다면 누구의 성적인지 알지 못하며 학생이름만 있다면 어느과목에 성적인지 알지 못합니다.
- 이렇게 모든 기본키에 종속된것을 완전함수종속 이라고 합니다.
제 2 정규형 만족 시키기
제 3 정규형
기본키를 제외한 속성들간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
- 이행 종속 이란?
- 기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정하는 것
- A->B이고 B->C일 때 A->C를 만족하는 것/ 즉, A를 보고 C를 알 수 있는 것
결국 한 종속자에 결정자가 2개이상인것을 의미합니다.
제 3 정규형 만족시키기
보이스코드 정규형
모든 결정자가 후보키 집합에 속해야 한다.
'SQL' 카테고리의 다른 글
[Database]MySQL 인덱스 (0) | 2022.10.07 |
---|---|
[Database] 트랜잭션(Transaction) 과 ACID (0) | 2022.09.14 |
이게 바로 개막장 ERD다. (0) | 2022.06.01 |
JOIN - 테이블을 합치게 해준다 (0) | 2022.05.12 |
SQL SELECT / DML (0) | 2022.05.12 |