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

[DB] 정규화(Normalization)

by Deeppago 2022. 2. 6.
-목차-

1. 정규화(Normalization)란?

2. 제1 정규형

3. 제2 정규형

4. 제3 정규형

5. BCNF(Boyce-Codd) 정규형

6. 정규화에는 어떠한 장점이 있는가?

    6.1 정규화의 단점은 없는가?

    6.2 반정규화

1. 정규화(Normalization)란?

한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다. 또 중복된 정보로 인해 갱신 이상이 발생하게 된다. 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다.

 

정규화의 목적

  • 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
  • 무결성을 지키고, 이상 현상을 방지한다.
  • 테이블 구성을 논리적이고 직관적으로 할 수 있다.
  • 데이터베이스 구조를 확장에 용이해진다.

갱신 이상

  • 삽입 이상(insertion anomalies) : 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말한다.
  • 삭제 이상(deletion anomalies) : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.
  • 수정(갱신) 이상(modification anomalies) : 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말한다.

정리하자면 정규화란 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업이다. 좀 더 구체적으로는 불만족스러운 나쁜 릴레이션의 애트리뷰트들을 나누어서 좋은 작은 릴레이션으로 분해하는 작업을 말한다. 정규화 과정을 거치게 되면 정규형을 만족하게 된다. 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 제1 정규형, 제2 정규형, 제3 정규형, … 등이 존재한다.

 

‘나쁜' 릴레이션은 어떻게 파악하는가?

엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성(Functional Dependency)을 판단한다. 판단된 함수적 종속성은 좋은 릴레이션 설계의 정형적 기준으로 사용된다. 즉, 각각의 정규형마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의되고, 그 정규형을 만족하지 못하는 정규형을 나쁜 릴레이션으로 파악한다.

 

함수적 종속성이란 무엇인가?

함수적 종속성이란 애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건의 일종이다. X와 Y를 임의의 애트리뷰트 집합이라고 할 때, X의 값이 Y의 값을 유일하게(unique) 결정한다면 "X는 Y를 함수적으로 결정한다"라고 한다. 함수적 종속성은 실세계에서 존재하는 애트리뷰트들 사이의 제약조건으로부터 유도된다. 또한 각종 추론 규칙에 따라서 애트리뷰트들 간의 함수적 종속성을 판단할 수 있다.


2. 제1 정규형

애트리뷰트의 도메인이 오직 원자 값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. 즉, 복합 애트리뷰트, 다중 값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.

아래 그림은 제1 정규형을 만족하는 릴레이션이다(모든 애트리뷰트의 값이 오직 하나의 값만 가진다). 수강지도 릴레이션의 제약 조건, 즉 함수 족속 다이어그램은 아래와 같고 기본키는 복합 애트리뷰트{ 학번, 과목 번호 }라고 가정하자.

수강지도 릴레이션의 함수 종속 다이어그램

 

수강지도 릴레이션

 

함수 종속 다이어그램이 나타내는 함수 종속의 의미는 다음과 같다.

학번과 과목 번호의 조합으로 학생이 등록한 과목의 성적을 식별할 수 있으며, 한 학생은 한 사람의 지도 교수를 가질 수 있고, 한 학과에만 속한다. 또 각 지도교수는 어느 한 학과에만 속한다.

 

수강지도 릴레이션에서 볼 수 있는 것과 같이 이 릴레이션은 불필요하게 많은 데이터의 중복을 포함하게 되어 문제를 야기시킨다.

 

  • 삽입 이상
    • 이 릴레이션에서는 어느 특정 학생이 어떤 교과목을 등록할 때까지는 그 학생의 지도교수가 누구라는 사실을 삽입할 수 없다. 왜냐하면 기본키 { 학번, 과목 번호 }에서 과목 번호가 널 이라면 엔티티 무결성 제약에 의해 허용되지 않기 때문이다.
  • 삭제 이상
    • 만약 학번이 200인 학생이 교과목 C123의 등록을 취소하면 학생의 지도교수가 P2라는 정보까지 잃어버리게 된다.
  • 갱신 이상
    • 이 릴레이션에서는 어떤 학생에 대한 지도교수 애트리뷰트 값이 여러 번 중복되는데, 이것은 갱신 문제의 원인이 된다. 즉, 학번이 400인 학생의 지도교수가 P1에서 P3로 변경되었다면, 학번 400이 나타난 모든 튜플을 찾아 지도교수를 갱신해주어야 한다 만약 그렇지 않으면 데이터의 일관성이 깨지게 된다.

 

이러한 문제가 발생하는 원인은 릴레이션에서 키가 아닌 애트리뷰트들이 기본키에 완전 함수 종속되지 못하고 부분 함수 종속이 되기 때문이다.  따라서 이러한 문제는 릴레이션을 두 개의 릴레이션으로 분할하여 부분 함수 종속을 제거하여 해결할 수 있다. 이것이 제2 정규화이다.

 


3. 제2 정규형

모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X -> Y라고 가정했을 때, X의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보 키에 대해 결정되는 릴레이션 형태를 말한다.

 

 

지도 릴레이션과 수강 릴레이션의 함수 종속 다이어그램

 

지도 릴레이션과 수강 릴레이션

위 그림에서 수강 릴레이션은 간단한 구조로서 더 이상 문제점이 없지만, 지도 릴레이션은 복잡한 상호 함수 종속 관계를 나타내고 있다. 학과는 학번에 완전 함수 종속이면서 지도교수를 통해 이행적 함수 종속이 되고 있다. 이행적 함수 종속은 데이터 변경 이상의 원인이 된다.

 

  • 삽입 이상
    • 어떤 지도교수가 어떤 특정 학과에 속한다는 사실만을 삽입할 수 없다. 지도받는 학생이 없다면 기본키가 널이 되기 때문이다.
  • 삭제 이상
    • 어떤 학생이 지도교수 관계를 취소하여 투플이 삭제되면, 부수적으로 그 지도교수가 어떤 학과에 속해 있다고 하는 정보까지도 불가피하게 삭제된다.
  • 갱신 이상
    • 어느 지도교수의 학과가 변경되면, 그 지도교수가 들어 있는 투플의 학과 값을 모두 변경시켜 주어야 한다. 즉, 지도교수 P1의 학과가 컴퓨터에서 전자로 바뀐다면 학번 100과 400에 있는 학과의 값을 모두 변경시켜야 한다.

위와 같은 문제를 해결하기 위해서는 이행적 함수 종속을 제거하여 두 개의 릴레이션으로 분해하면 해결된다. 이것이 제3 정규화이다.

 


4. 제3 정규형

어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X → Y, Y → Z의 경우에 의해서 추론될 수 있는 X → Z의 종속관계를 말한다. 

 

아래 그림은 위의 제2 정규형을 만족하는 지도 릴레이션을 제3 정규형을 만족하도록 분해한 것이다.

일반적으로 A를 키로 가진 릴레이션에서 이행적 함수 종속 A → B, B → C이고 A → C일 때 분해는 {A, B}, {B, C}로 분해하는 것이 올바른 분해이다. 만약 학번 → 지도교수, 학번 → 학과로 분해하였다면 지도교수가 어떤 학과에 속한다는 사실을 삽입할 수 없게 된다.

학생지도 릴레이션과 지도교수학과 릴레이션의 함수 종속 다이어그램

 

학생지도 릴레이션과 지도교수학과 릴레이션

 


5. BCNF(Boyce-Codd) 정규형

여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제3 정규형을 보완하는데 의미가 있다. 릴레이션의 모든 식별자가 후보 키가 되도록 분해하는 과정을 말한다.

각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.

  • 모든 제2 정규형 릴레이션은 제1 정규형을 갖는다.
  • 모든 제3 정규형 릴레이션은 제2 정규형을 갖는다.
  • 모든 BCNF 정규형 릴레이션은 제3 정규형을 갖는다.
  • 제3 정규형을 갖는 모든 릴레이션은 BCNF에 속하지 않을 수 있다.

수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.

 

그러면 제3 정규형이지만 BCNF가 아닌 릴레이션을 살펴보고 왜 문제가 되는지 알아보자.

아래 그림을 보자.

 

수강과목 릴레이션(기본키 : {학번, 과목})
수강과목 릴레이션의 함수 종속 다이어그램

위의 수강과목 릴레이션은 제1 정규형이며 키에 완전 종속이 아닌 애트리뷰트도 없고 또 이행 종속이 없으므로 제2 정규형 이면서 제3 정규형이다. 그러나 BCNF는 아니다. 왜냐하면 결정자 교수 애트리뷰트가 후보 키로 취급되고 있지 않기 때문이다. 그러면 이 수강 과목 릴레이션에서 발생하는 변경 이상을 알아보자.

 

  • 삽입 이상
    • 교수 P5가 자료구조를 담당하게 되었을 때 이 사실만을 삽입할 수 없다. 기본 키인 수강생의 학번이 누락되었기 때문
  • 삭제 이상
    • 학번이 100인 학생이 자료구조 과목을 취소하여 튜플이 삭제된다면 이때 교수 P2가 자료구조 과목을 담당하고 있다는 정보마저 없어져 버리게 된다.
  • 갱신 이상
    • 교수 P1의 담당 과목이 프로그래밍에서 자료구조로 변경되었다면 이 릴레이션에서 P1인 모든 튜플에 대해 자료구조로 변경해 주어야 한다.

이와 같은 이상의 원인은 사실상 애트리뷰트 교수가 결정자이지만 후보 키로 취급하고 있지 않다는 데 있다. 따라서 이 문제의 해결은 프로젝션을 통해 다음과 같이 수강교수 릴레이션과 과목교수 릴레이션으로 분해하는 것이다.

 

수강교수 릴레이션과 과목교수 릴레이션 및 그 함수 종속 다이어그램

 

이 수강교수 릴레이션과 과목교수 릴레이션은 BCNF에 속한다. 이 BCNF는 제3 정규형에서 일어날 수 있는 변경 이상의 문제들을 제거했다는 것을 알 수 있다. 

 


6. 정규화에는 어떠한 장점이 있는가?

  1. 데이터베이스 변경 시 이상 현상(Anomaly) 제거 위에서 언급했던 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.
  2. 데이터베이스 구조 확장 시 재 디자인 최소화 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.
  3. 사용자에게 데이터 모델을 더욱 의미 있게 제공 정규화된 테이블들과 정규화된 테이블들 간의 관계들은 현실 세계에서의 개념들과 그들 간의 관계들을 반영한다.

 

6.1 정규화의 단점은 없는가?

릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다. 조금 덧붙이자면, 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것이다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

 

6.2 반정규화

조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능 저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

 

반정규화(De-normalization, 비정규화)

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다. 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

 

무엇이 반정규화의 대상이 되는가?

  1. 자주 사용되는 테이블에 액세스 하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  2. 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  3. 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

 

반정규화 과정에서 주의할 점은?

반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.( 정규화 정도가 낮은 릴레이션에서 발생하는 문제 )

 


참고 자료

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database

데이타베이스 시스템과 오라클

 

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

NoSQL  (0) 2022.02.07
[DB] 트랜잭션(Transaction)  (0) 2022.02.06
[DB] 인덱스(Index)  (0) 2022.02.06
데이터베이스(DataBase)  (0) 2022.02.05

댓글