본문 바로가기
데이터베이스

[DB] 정규화란?

by 검은도자기 2022. 7. 28.

정규화란?

데이터의 중복을 줄이고 무결성 (정확성, 일관성)을 지키기 위해 데이터를 구조화하는 과정

 

 

정규화를 왜 사용할까?

한 테이블에 관련이 없는 속성들을 혼합하게 되면 테이블 내에 불필요하게 중복된 데이터가 쌓이게 됩니다. 이로 인하여 테이블에 이상 현상들이 발생하게 되는데, 이 현상을 해결하기 위해 정규화를 사용합니다.

정규화는 함수 종속성을 기준으로 데이터를 구조화하기 때문에 먼저 함수 종속성에 대해서 알아보겠습니다.

 

 

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

  • 테이블 안의 특정 속성 값에 의해 다른 속성 값을 결정하는 종속 관계

 

예시

  • 테이블을 구성하는 두 개의 속성 X, Y가 있을 경우 속성 X의 값을 통해 속성 Y의 값을 바로 식별할 수 있거나, 속성 X값에 따라 속성 Y값이 달라질 때  “X가 Y를 함수적으로 결정한다.” 또는 "Y가 X에 함수적으로 종속되어 있다"라고 하며, X를 결정자, Y를 종속 자라고 부릅니다.

 

함수 종속성의 종류

  • 함수 종속성은 크게 완전 함수 종속과 부분 함수 종속, 이행적 함수 종속으로 나뉩니다.
  • 완전 함수 종속(FFD, Full Functional Dependency) : 기본키를 구성하는 모든 속성에 종속되는 경우
  • 부분 함수 종속(PFD, Partial Functional Dependency) :기본키를 구성하는 속성의 일부에 종속되거나, 기본키가 아닌 다른 속성에 종속되는 경우

 

 

정규화의 종류

  • 정규화의 종류로는 제1 정규화 ~ 제6정규화까지 존재하며, 진행하고 있는 프로젝트의 목적에 따라 정규화의 레벨이 점점 높아집니다.

 

 

제1정규화(1NF, First Normal Form) : 도메인의 원자성

  • 테이블의 모든 속성에 하나의 값을 갖도록 테이블을 분해하는 과정

 

예시

이벤트 참여 테이블(정규화 전)

  • 이벤트 참여 테이블은 5개의 속성으로 구성되어 있고 [고객 아이디, 이벤트 번호] 속성 집합이 기본키 역할을 합니다.
  • 고객 한 명이 하나의 등급과 할인율을 가질 수 있으므로 고객 아이디가 등급과 할인율을 유일하게 결정합니다.
  • 그리고 등급에 따라 할인율이 결정되며, [고객 아이디, 이벤트 번호] 속성 집합이 당첨 여부 속성을 유일하게 결정합니다.
  • 위 테이블에 대해 제1 정규화를 진행할 경우 아래와 같은 테이블로 변경이 됩니다.

이벤트 참여 테이블(정규화 후)

 

제1 정규형에서는 어떠한 이상현상이 발생할까?

  • 삽입 이상: 새로  추가한 고객이 이벤트에 참여하지 않는다면, 테이블의 기본키를 구성하는 이벤트 번호 속성이 NULL 값이므로 개체 무결성 제약조건을 위반하여 이상현상이 발생합니다.
  • 갱신 이상: 고객 아이디가 apple인 고객의 등급이 골드에서 플레티넘으로 변경되면 세 투플의 등급 속성의 값을 플레티넘으로 변경해야 합니다. 만약 일부 투플만 등급 속성의 값을 변경하면 동일한 고객이 두 개의 등급 값을 가져 데이터 일관성을 유지할 수 없게 됩니다.
  • 삭제 이상: 고객 아이디가 orange인  고객이 E006 이벤트에 참여한 기록을 삭제해달라고 요구하면 이 투플을 삭제해야 합니다. 그런데 이 투플을 삭제하면 이벤트와 관련이 없는 데이터, 즉 orange 고객의 등급과 할인율 같은 고객 정보도 함께 삭제되므로 이 고객과 관련해 꼭 필요한 데이터도 유지할 수 없게 됩니다.

 

 

제2정규화(2NF, Second Normal Form) : 부분 함수적 종속 제거

  • 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 과정

 

완전 함수 종속이란?

  • 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미합니다.

 

예시

  • 이벤트 참여 테이블은 제1 정규형에 속하지만 기본키인 [고객 아이디, 이벤트 번호]에 완전 함수 종속되지 않는 등급, 할인율 속성이 존재하므로 제2 정규형에 속하지 않습니다.
  • 등급, 할인율 속성이 관련 없는 이벤트 번호, 당첨 여부 속성과 같은 테이블에 존재하지 않도록 2개의 테이블로 분해하면 분해된 고객 테이블과 이벤트 참여 테이블은 모두 제2 정규형에 속하게 됩니다.
  • 이벤트 참여 테이블은 함수 종속성을 단 하나만 포함하므로 이상 현상이 더는 발생하지 않으나 고객 테이블은 부분 함수 종속 대신 완전 함수 종속성을 아직도 여러 개 포함하고 있어 이상 현상이 발생할 수 있습니다.

 

제2 정규형에서는 어떠한 이상현상이 발생할까?

  • 삽입 이상: 새로운 등급과 할인율에 대한 정보는 해당 등급에 속하는 고객이 있어야 고객 테이블에 삽입할 수 있습니다. 다이아 등급에 속하는 고객이 없으면 기본키가 널 값이므로 개체 무결성 제약조건을 위반합니다.
  • 갱신 이상: 등급에 대한 할인율이 변경되면 해당 등급에 관련된 모든 속성에서 할인율 투플 값을 똑같이 변경해야 합니다. 그렇지 않으면 같은 등급에 대해 할인율이 여러 개 존재하는 데이터 불일치의 문제가 발생하게 됩니다.
  • 삭제 이상: 고객 탈퇴로 인해 고객 테이블에서 투플의 삭제가 발생하면 등급과 할인율에 대한 정보까지 삭제됩니다. 

 

 

제3 정규형(3NF, Third Normal Form) : 이행 함수적 종속 제거

  • 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 과정

 

이행 함수 종속(transitive FD)이란?

  • 테이블을 구성하는 세 개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X → Y와 Y → Z가 존재하면 논리적으로 X → Z가 성립하는데, 이를 속성 집합 Z가 속성 집합 X에 이행적으로 함수 종속되었다고 합니다.

 

예시

  • 고객 테이블은 제2 정규형에 속하지만 기본키인 [고객 아이디]가 등급을 결정하고 등급이 할인율을 결정하는 함수 종속 관계가 있습니다. 이 관계로 인해 [고객 아이디]가 할인율을 결정하는 이행적 함수 종속 현상이 발생하게 되기에 고객 테이블은 제3 정규형에 속하지 않습니다.
  • 따라서 이행적 함수 종속이 나타나지 않도록 [고객 아이디, 등급] 테이블과 [등급, 할인율] 2개의 테이블로 분해하면 이행적 함수 종속 현상이 해결됨과 동시에 제3 정규형이 됩니다.

 

 

장점

  • 새로운 속성의 추가로 인해 DB 구조를 확장하는 경우, 구조의 변경을 최소화할 수 있습니다.
  • 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있습니다

 

단점

  • 릴레이션의 분해로 인해 릴레이션간의 Join 연산이 많아져 응답 시간이 오히려 느려질 수도 있습니다.

 

 

마무리

오늘은 정규화에 대하여 공부한 내용을 정리해보았습니다. 정규화에 대하여 공부를 해보니 DB 설계에 있어서 필수적인 부분 중 하나라는 사실을 다시 한번 깨닫게 되었습니다. 그리고 "DB 설계 시 정규화 레벨을 어디까지 해야 할까?"라는 고민이 추가되었네요. 아직 부족하거나 틀린 부분이 있을 수도 있으니 주의하시면 좋을 거 같습니다.

이번 포스팅은 마무리하면서 다음 포스팅에서 뵙겠습니다.

 

 

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

[DB] 관계(Relationship)란?  (0) 2022.06.26
[DB] DBMS의 키(key)의 개념과 종류  (0) 2022.06.06
인덱스(Index)란?  (0) 2021.11.10
트랜잭션이란?  (0) 2021.10.28