[Database] 3. 정규화

1. 정규화란?

1.1. 정규화의 배경

- 관계형 데이터베이스가 등장하면서 데이터 모델링에 새로운 접근 방식이 도입됨

- 이 접근 방식은 데이터를 테이블로 구성하고, 각 테이블의 구조를 정의하여 데이터 중복을 최소화하고 데이터 무결성을 보장하는 것

- 하나의 테이블에 여러 엔티티의 속성들을 혼합하게 되면 정보가 중복 저장되고, 저장 공간을 낭비하게 됨

- 또한 중복된 정보로 인해 이상 현상이 발생하게 됨

- 이러한 문제를 해결하기 위해 데이터베이스 설계 과정에서 정규화 과정을 거침

이상 현상이란?

- 데이터를 삽입, 삭제, 수정할 때 발생하는 논리적 오류

- 삽입 이상: 새로운 학생이 추가되면 수강 정보가 NULL 값으로 채워짐

- 삭제 이상: 수강 정보를 삭제하면 학생 정보도 함께 삭제됨

- 갱신 이상: 학생이 여러 과목을 수강할 때, 수정되는 학생 정보가 일부 튜플에만 반영됨

 

1.2. 정규화의 개념

- 관계형 데이터베이스 설계에서 중복을 최소화하고 데이터의 무결성을 유지하기 위한 작업

- 좀 더 구체적으로는, 불만족스러운 나쁜 릴레이션의 속성들을 나누어 좋고 작은 릴레이션으로 분해하는 작업을 의미함

 

함수 종속성이란?

- 나쁜 릴레이션인지의 여부는, 속성 간에 함수 종속성을 판단해서 구분함

- 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존 관계

   A -> B (A는 B의 결정자이고, B는 A에 종속된다.)

 

1.3. 정규화의 목적

데이터 중복 최소화

- 데이터베이스 내에서 데이터 중복을 최소화하여 저장 공간을 절약하고 데이터 일관성을 유지함

 

데이터 무결성 보장

- 데이터베이스 내에서 일관성과 무결성을 유지하며 오류를 방지하고 데이터의 신뢰성을 확보함

 

쿼리 성능 향상

- 정규화를 통해 데이터를 논리적으로 구조화하면 쿼리의 성능을 향상시킬 수 있음

 

유지 보수 용이성

- 정규화된 테이블은 데이터 구조가 논리적이며 일관적으로 정의되어 있어 유지 보수가 용이함

 

1.4. 정규화의 장단점

장점

- 데이터 일관성 및 무결성을 보장해 데이터의 신뢰성을 높일 수 있음

- 중복을 줄여 저장 공간을 절약할 수 있음

- 불필요한 쿼리 제거로 성능을 향상할 수 있음

 

단점

- 테이블을 여러 개로 나누기에 JOIN 연산이 많아지고, 이로 인해 쿼리 복잡성과 응답 시간이 증가할 수 있음

- 더 많은 인덱스가 필요할 수 있기에 인덱스 유지 및 공간 사용량을 증가시킬 수 있음

 

1.5. 반정규화

- 정규화된 데이터 모델을 일부러 중복 데이터를 포함하도록 변경하는 작업

- 정규화데이터 중복을 최소화하고 데이터 무결성을 유지하기 위함이고,
   반정규화성능 향상을 목적으로 데이터 중복을 허용하는 반대 개념임

 

반정규화의 목적

쿼리 성능 향상

- 다수의 조인 연산으로 인해 쿼리의 성능이 저하될 수 있는데, 이런 상황에서 반정규화를 통해 데이터를 중복 저장하여 조인 연산을 줄이고 쿼리 성능을 향상시킬 수 있음

 

읽기 중심 애플리케이션

- 읽기 연산이 쓰기 연산보다 훨씬 많은 애플리케이션인 경우, 데이터 중복을 허용하여 읽기 성능을 최적화할 수 있음

 

복잡한 쿼리 간소화

- 복잡한 쿼리를 단순화하기 위해 반정규화를 할 수 있으며, 이로 인해 쿼리 작성이 간단해짐

 

2. 정규화 과정

정규형이란?

- 특정 조건을 만족하는 릴레이션의 스키마 형태를 의미함

- 정규화 과정을 거치게 되면 정규형을 만족하게 됨

 

2.1. 제 1 정규형

- 모든 도메인이 더 이상 분해될 수 없는 원자 값으로만 이루어진 상태

- 즉, 한 칸에는 하나의 데이터만 들어가도록 한 형태

1NF

 

2.2. 제 2 정규형

- 1NF를 만족하면서, 부분 함수적 종속성이 없어야 하는 상태

- 즉, 기본 키에 속하지 않는 속성이 기본 키 전체(복합 키)에 종속되어야 하는 형태

- 현재 테이블의 주제와 관련 없는 속성을 다른 테이블로 분리한 형태

2NF

- 가격은 Composite primary key인 (회원번호, 프로그램) 중 프로그램 속성에만 종속되어 있음

- 수강등록현황 테이블과는 관련 없는 가격 속성을 떼어내 2개의 테이블로 분리함

 

2.3. 제 3 정규형

- 2NF를 만족하면서, 기본 키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태

- 즉, 기본 키가 아닌 속성에 종속된 속성은 다른 테이블로 분리된 상태

3NF

- 강사 속성은 기본 키가 아니므로, 강사에 종속된 속성인 출신대학 속성을 떼어내 2개의 테이블로 분리함 

 

- 일반적으로 관계형 데이터베이스 테이블이 3NF까지 만족한다면 '정규화되었다'라고 함

- 3NF 테이블의 대부분이 삽입, 삭제, 수정 이상이 없으며 3NF라면 대부분이 BCNF, 4NF, 5NF임

 

2.4. BCNF 정규형

- 3NF를 만족하면서, 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키인 상태

- 즉, 후보 키가 아닌 속성이 후보 키를 결정하는 형태가 되면 안되는 상태 (모든 함수 종속성이 후보 키에 대해 성립해야 함)

 

 

참고자료

https://mangocode.tistory.com/114

https://www.youtube.com/watch?v=Y1FbowQRcmI 

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94