suyeonme

[데이터베이스] 정규화(Normalization)란? 본문

프로그래밍👩🏻‍💻/Database

[데이터베이스] 정규화(Normalization)란?

suyeonme 2023. 5. 14. 15:50

정규화(Normalization)란?


관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 일반적으로 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함한다. -- 데이터베이스 정규화, 위키피디아

 

테이블을 분해하는 단계에 따라서 정규화의 단계가 나뉜다. 실무에서는 대체로 1정규화~2정규화까지의 과정을 거친다.

  1. 1정규형(1NF)
  2. 2정규형(2NF)
  3. 3정규형(3NF)
  4. BCNF(Boyce-Codd Normal Form)
  5. 4정규형(4NF)
  6. 5정규화(5NF)

정규화를 공부하기 전에, 먼저 함수적 종속 관계에 대해서 알아야한다.


함수적 종속(Functional Dependency)이란?

릴레이션 R에 대해서 X와 Y는 각각 속성의 부분집합이다. X의 값을 알면 Y의 값을 식별할 수 있고, X의 값에 의해서 Y의 값이 달라진다면 Y는 X에 함수적 종속이라고 한다.

  • X → Y
  • X는 결정자(determinant), Y는 종속자(dependent)

완전 함수적 종속(Full Functional Dependency)이란?

종속자가 기본키에만 종속되며, 기본키가 여러 속성으로 구성되어있을 경우, 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우이다. 즉, 기본키중 특정한 컬럼에만 종속된 컬럼이 존재하지 않아야한다.(기본키의 부분집합이 결정자가 되어서는 안됨)

 

아래의 릴레이션의 경우, 이름, 나이, 지역은 회원번호에 완전 함수 종속되어있다. 회원번호가 기본키(Primary Key)이므로, 회원번호를 알아야 이름, 나이, 지역 속성을 구별할 수 있기때문이다. => 종속자가 기본키에만 종속된 경우

  • 결정자(determinant): 회원번호
  • 종속자(dependent): 이름, 나이, 지역
  • 종속 관계: {회원번호 → 이름, 나이, 지역}
회원번호 이름 나이 지역
1 강수연 27 서울
2 원빈 35 부산

아래의 릴레이션의 경우, 수량은 고객_id, 상품_id에 종속되어있다. 고객_id와 상품_id를 알아야 수량을 구별할 수 있기때문이다. => 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우

  • 결정자(determinant): 고객_id, 상품_id
  • 종속자(dependent): 주문상품, 수량, 가격
  • 종속 관계: {고객_id, 상품_id → 수량}, {상품_id → 주문상품}, {고객_id, 상품_id, 수량 → 가격}
고객_id 상품_id 주문상품 수량 가격
1 a 과자 1 1500
2 b 아이스크림 2 4000

제 1정규화(1NF, First Normal Form)

테이블의 컬럼이 원자값(Atomic Value)을 갖도록 테이블을 분해한다.

 

정규화가 이루어지지 않은 테이블

이름이 원빈인 레코드의 직업 컬럼은 2개의 값을 가지고 있으므로, 원자값을 갖지 않는다.

이름 직업
강수연 개발자
원빈 연예인, 사업가

정규화가 이루어진 테이블

이름 직업
강수연 개발자
원빈 연예인

제 2정규화(2NF, Second Normal Form)

1정규화를 만족한 테이블에 대해서, 테이블의 모든 컬럼이 완전 함수적 종속(Full Functional Dependency)을 만족하도록 테이블을 분해한다. 즉, 모든 컬럼에 대해서 부분 함수 종속 관계를 완전 함수 종속 관계로 만드는 것이다.

 

아래 릴레이션의 경우, 기본키는 (이름, 취미)로 이루어진 복합키이다. 나이 컬럼은 기본키 중 이름에 종속되어있다. 따라서 이름 컬럼을 알면, 나이의 값을 알 수 있으므로, 나이를 별도의 테이블로 분리한다.

 

정규화가 이루어지지 않은 테이블

이름 나이 취미
강수연 28 스쿠버다이빙
원빈 35 독서
강수연 28 등산
강동원 36 요리

정규화가 이루어진 테이블

이름 취미
강수연 스쿠버다이빙
원빈 독서
강수연 등산
강동원 요리

 

이름 나이
강수연 28
원빈 35
강동원 36

제 3정규화(3NF, Third Normal Form)

제 2정규화를 만족한 테이블에 대해서, 이해적 종속을 없애도록 테이블을 분해한다. 기본키 이외의 컬럼이 다른 컬럼을 결정할 수 없다.

이행적 종속(Transitive functional Dependency)이란?

A -> B이고 B -> C가 성립하는 경우, A -> C가 성립하는 경우를 의미한다.

 

정규화가 이루어지지 않은 테이블

여러 레코드에서 동일한 지역 번호를 가지면 도시가 결정되어 중복된 데이터가 생길 수 있다.

이름 나이 도시 지역번호
강수연 28 서울 02
원빈 35 인천 032
강동원 36 서울 02

정규화가 이루어진 테이블

이름 나이
강수연 28
원빈 35
강동원 36
도시 지역번호
서울 02
인천 032
제주 064

 

'프로그래밍👩🏻‍💻 > Database' 카테고리의 다른 글

[Redis] Redis의 command 정리  (0) 2022.08.28
Comments