본문 바로가기

데이터베이스/SQLD

[SQLD] 정규화

728x90

정규화란?

모델링된 데이터베이스에서 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 수행하는 과정에서 데이터의 일관성이 깨질 수 있습니다. 이를 데이터베이스 이상현상(Anomaly)이라고 합니다.

데이터베이스 이상현상 예시:

  • 삽입 이상: 데이터를 삽입할 때 원치 않은 정보까지 삽입될 때 발생합니다.
  • 갱신 이상: 중복 저장된 데이터 중 하나만 갱신하고 다른 하나를 갱신하지 못했을 때 발생합니다.
  • 삭제 이상: 원치 않은 정보까지 삭제될 때 발생합니다.

이러한 문제를 해결하기 위해 데이터 중복을 최소화하고 잘 조직된 상태로 분해하는 과정을 정규화라고 합니다.

정규화를 하면 CRUD 성능은 좋아지며, SELECT 성능은 좋아질 때도 있지만 많은 JOIN이 발생할 수 있어 대부분 성능이 하락하게 됩니다. SELECT 성능을 다시 좋게 하기 위해 반정규화를 할 수 있습니다.

 

제1정규화

모든 속성은 속성값을 1개만 가져야 하며, 비슷한 속성이 반복되지 않는 상태를 제1정규화라고 합니다. 이러한 상태를 속성의 원자성이 확보되었다라고 합니다. 하나의 속성이 여러 개의 속성값을 가지거나 비슷한 속성이 반복되면 이를 별도의 테이블로 분리합니다.

예시: 학생 수강신청

학번 학생이름 수강과목
2001234 홍길동 A, B, C, D
2004321 김철수 B, D, E, F, G

 

수강과목 속성의 속성값이 여러 개가 있습니다.

제1정규화 적용:

학번 학생이름
2001234 홍길동
학번 수강과목
2001234 A
2001234 B
2001234 C
2001234 D
2004321 B
2004321 D
2004321 E
2004321 F
2004321 G

 

이와 같이 속성에 속성값이 여러 개가 있다면 제1정규화를 해주어야 합니다.

하나의 엔티티 내에서 주식별자와 속성의 관계는 1:1의 관계가 되어야 합니다. 만약 1

의 관계가 성립한다면 제1정규화 대상입니다.

 

 

 

제2정규화

주식별자가 2개 이상으로 구성된 복합식별자인 경우, 혹은 일반 속성이 주식별자의 일부만 종속성을 가질 때 제2정규화를 해주어야 합니다. 엔티티의 속성은 주식별자에게 완전한 종속적인 관계여야 합니다. 일부만 종속성을 가지고 있을 때 이를 부분 함수종속성이라고 합니다.

함수종속성이란?

테이블의 모든 일반 속성은 주식별자에 완전하게 종속적이어야 하며, 이를 완전 함수종속성이라고 합니다. 즉, 제2정규화는 부분 함수종속성을 제거하는 과정입니다.

제2정규화 예시:

학생ID 과목ID 교수명
1 101 홍길동
2 102 김철수
1 103 이영희

 

위 테이블에서 교수명은 과목ID에만 종속적입니다. 이를 제2정규화하면:

학생 테이블:

학생ID 학생이름
1 홍길동
2 김철수

과목 테이블:

과목ID 교수명
101 홍길동
102 김철수
103 이영희

 

학생-과목 매핑 테이블:

 

학생ID 과목ID
1 101
2 102
1 103

 

 

 

 

제3정규화

주식별자가 아닌 일반 속성 간에 함수종속성이 있을 때 이를 이행 함수종속성이라고 합니다. 이행 함수종속성이 제거된 상태를 제3정규화라고 합니다.

제3정규화 예시:

원래 테이블:

직원ID 부서ID 부서명
1 10 인사부
2 20 재무부
3 10 인사부

 

부서명이 부서ID에 종속적이므로 이를 제3정규화하면:

직원 테이블:

직원ID 부서ID
1 10
2 20
3 10

부서 테이블:

 

부서ID 부서명
10 인사부
20 재무부

 

 

 

정리

정규화 :

데이터의 중복을 최소화하고, 일관성을 유지하기 위해 데이터를 구조화하는 과정.

데이터베이스 이상현상 :

데이터의 삽입, 갱신, 삭제 시 데이터의 일관성이 깨지는 현상.

제1정규화 :

모든 속성이 원자 값을 가져야 하며, 속성의 값이 더 이상 나눌 수 없는 단일 값을 가져야 한다.

제2정규화 :

주식별자가 2개 이상인 경우, 모든 속성이 주식별자에 완전히 종속되어야 하며, 부분 함수종속성이 없어야 한다.

제3정규화 :

주식별자가 아닌 일반 속성 간의 함수종속성을 제거하여 이행 함수종속성이 없어야 한다.

함수종속성 :

테이블의 속성 간에 한 속성의 값이 다른 속성의 값을 결정하는 관계.

728x90

'데이터베이스 > SQLD' 카테고리의 다른 글

[SQLD] 서브 쿼리  (0) 2024.08.14
[SQLD] NULL 속성  (0) 2024.08.13
[SQLD] 트랜잭션  (0) 2024.08.02
[SQLD] Entity와 속성  (0) 2024.07.26
[SQLD] 모델링  (0) 2024.07.24