Normalization

bearMin·2024년 6월 22일

정규화란?

정규화의 정의는?

우선 정규화의 위키백과에 적혀있는 설명부터 확인을 해보자면 관계형 데이터베이스 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스 라고 한다.

중복을 최소화하게 데이터를 구조화하는 프로세스. 뭔가 감이 올 듯 말 듯해서 조금 더 다른 글들을 찾아봤다. 그러다가 정규화는 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다 라는 문장을 읽었다.

즉, 정리를 해보자면 정규화란 데이터 모델의 중복을 최소화하고 데이터의 일관성, 유연성을 확보하기 위한 목적으로 데이터를 분해하는 과정을 뜻하는 것이다.

이상현상이란?

위에서도 잠깐 나왔지만 이상 현상에 대해서 간략하게 설명을 하고 넘어가려 한다. 이상 현상이 무엇이길래 우리는 이 이상 현상을 제거하는 정규화 과정이 필요한 것일까?

이상 현상이란 불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 할 때 발생할 수 있는 부작용을 뜻한다.

이 이상 현상의 종류에는 삽입, 삭제, 수정이 있는데 하나씩 살펴보자면

  • 삽입 이상 : 데이터를 삽입했을 때 의도와는 상관없이 원하지 않는 값들도 함께 삽입이 되는 현상
  • 삭제 이상 : 데이터를 삭제했을 때 의도와는 상관없이 다른 정보들까지 연쇄적으로 삭제되는 현상
  • 수정 이상 : 데이터를 수정했을 때 의도와는 상관없이 데이터의 일부만 수정이 되어 데이터의 불일치가 일어나는 현상

이처럼 여러 이상 현상이 발생할 수 있기 때문에 정규화라는 작업을 통해서 테이블의 구성을 놀리적으로 변경하여 해결하고자 하는 것이다.

정규화의 장단점은?

정규화의 장점에는 무엇이 있을까?

  1. 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
  2. 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
  3. 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.

언제나 장점만 존재하지는 않는다. 이번엔 정규화의 단점에 대해 알아보자.

  1. 릴레이션의 분해로 릴레이션 간의 JOIN 연산이 많아진다.
  2. 질의에 대한 응답 시간이 느려질 수 있다.
  3. 데이터를 처리할 때 속도가 느려질 수도 있다.

이처럼 단점도 있기 때문에 정규화를 무조건적으로 적용하는 것이 아닌 상황에 따라 맞춰서 적용하는 것이 중요하다. 그 예로 조인이 많이 발생하여 성능 저하가 나타나면 반정규화를 적용할 수도 있다.

반정규화란 정규화된 데이터베이스에서 성능을 개선하기 위해 데이터의 중복을 허용하고 조인을 줄이는 방식으로 정규화의 과정과는 반대로 진행한다고 생각하면 좋다.


정규화 과정

제 1정규형(1NF)

테이블의 컬럼이 원자값을 갖도록 하는 것이다.

학생번호나이과목
11120C언어
22225데이터베이스, Java
33322C언어, 데이터베이스

이처럼 나무꾼과 거북이의 과목을 보면 두 개를 가지고 있다. 이렇게 된다면 어느 학생이 같은 과목을 듣는지 같은 검색이 힘들다. 검색이 불가능한 것은 아니지만 데이터를 꺼내와서 직접 비교하는 작업이 필요하다. 또한 과목에 대한 수정과 삭제가 불편할 수 있다.

학생번호나이과목
11120C언어
22225데이터베이스
22225Java
33322C언어
33322데이터베이스

위에 테이블처럼 하나의 속성에는 하나의 값만 가질 수 있도록 수정해주면 제 1정규형을 만족하는 테이블이 완성된다. 이렇게 하면 아까보다는 훨씬 검색과 수정의 부분에서 불편함이 줄어든다.

제 2정규형(2NF)

제 1정규형을 만족하면서 완전 함수 종속을 만족하도록 하는 것이다.

학생번호과목강의실성적
111C언어공학관 2144.0
222데이터베이스공학관 4274.5
222Java공학관 5173.5
333C언어공학관 2143.0
333데이터베이스공학관 4274.0

이처럼 C언어, 데이터베이스는 듣는 학생은 각각 다르지만 같은 강의실에서 강의를 한다. 이를 다르게 표현해보면 이름과 과목으로 성적을 확인할 수 있지만 강의실은 과목만으로 확인할 수 있다. 이처럼 기본키가 (이름, 과목)인 테이블에서 (과목) 이라는 부분키로 강의실을 결정할 수 있는 것을 부분 종속이라고 한다. 이 부분 종속이 없는 경우를 완전 함수 종속이라고 한다.

이 부분 종속이 문제가 되는 이유는 데이터의 갱신 때문이다. 만일 나무꾼의 C언어 강의실이 공학관 314호로 바뀌었다고 할 때 홍길동의 C언어 강의실 역시 공학관 314호로 바꿔주어야 한다. 하지만 나무꾼의 C언어 강의실만 바뀌었을 경우 데이터 불일치가 일어나게 된다. 이는 이상 현상 중 갱신 이상에 해당하는 문제이다.

학생번호과목성적
111C언어4.0
222데이터베이스4.5
222Java3.5
333C언어3.0
333데이터베이스4.0

과목강의실
C언어공학관 214
데이터베이스공학관 427
Java공학관 517

이를 해결하기 위해 위에처럼 (이름, 과목) → (성적) 을 만족하는 테이블과 (과목) → (강의실) 을 만족하는 테이블로 분리하여 관리를 해주는 것이 좋다. 이렇게 관리를 할 경우 강의실이 변경이 되어도 과목을 통해서 조회를 하면 되기 때문에 데이터 불일치를 줄일 수 있다.

제 3정규형(3NF)

제 2정규형을 만족하면서 테이블에 대해 이행적 함수 종속을 없애도록 하는 것이다.

아이디등급할인율
111Bronze15%
222Gold40%
333Silver20%

위의 테이블을 살펴보면 (아이디) → (등급), (등급) → (할인율), (아이디) → (등급) 을 만족하는 것을 알 수 있다. 이처럼 X → Y, Y → Z 일 때, X → Z를 만족하는 경우이행적 함수 종속이라고 한다.

이렇게 되면 문제가 되는 점은 무엇일까?

만일 아이디 111을 삭제할 경우 Bronze 등급의 할인율이 15%라는 정보 역시 삭제가 된다. 혹은 Vip라는 등급을 입력하고 싶을 때 Vip 등급을 가진 유저 아이디가 null 값이 되므로 삽입이 불가능하다.

이처럼 이행적 함수 종속이 문제가 되는 이유는 키가 아닌 속성이 다른 속성을 결정하기 때문이다.

아이디등급
111Bronze
222Gold
333Silver

등급할인율
Bronze15%
Gold40%
Silver20%

이를 방지하기 위해서 위처럼 테이블을 (아이디) → (등급), (등급) → (할인율) 을 만족하도록 분리해서 관리를 해준다면 새로운 등급의 추가도 쉽고 아이디를 삭제해도 등급과 할인율에 대한 정보가 그대로 유지가 된다.

보이스-코드 정규형(BCNF)

제 3정규형을 만족하면서 테이블에 대한 모든 결정자가 후보키가 되도록 하는 것이다.

학생번호과목교수
111C언어홍길동
222데이터베이스나무꾼
222Java거북이
333C언어홍길동
333데이터베이스달팽이
  • 각 교수는 한 과목만 맡을 수 있다.
  • 한 학생은 여러 과목을 수강할 수 있다.
  • 같은 과목을 여러 교수가 맡을 수 있다.

다음과 같은 가정하에 위의 테이블을 살펴보면 교수는 한 과목만 맡을 수 있기 때문에 과목 속성에 대한 결정자가 된다. 하지만 교수의 정보만으로는 튜플을 식별할 수 없다. 즉 후보키가 될 수 없기 때문에 보이스-코드 정규형을 만족하지 않는다.

위의 테이블이 문제가 되는 이유는 제 3정규형을 만족함에도 불구하고 여전히 학생번호가 222이고 과목이 데이터베이스인 컬럼을 삭제할 경우 나무꾼이라는 교수가 데이터베이스 과목을 맡고 있다는 데이터 역시 삭제가 되기 때문이다. 또한 홍길동 교수의 과목명이 변경되었을 경우 일부만 수정될 우려가 여전히 존재한다.

학생번호교수
111홍길동
222나무꾼
222거북이
333홍길동
333달팽이

교수과목
홍길동C언어
나무꾼데이터베이스
거북이Java
달팽이데이터베이스

위와 같이 테이블을 (학생번호) → (교수), (교수) → (과목) 으로 테이블을 분리해서 관리할 경우 데이터의 갱신과 삭제가 용이해진다.


주의할 점

일반적 정규화의 과정은 여기까지만 사용이 되며 이 아래 정규형들은 주로 사용이 되진 않는다. 그 이유는 데이터 중복을 줄이고 이상 현상이 발생하는 문제를 해결하는 것은 BCNF까지만으로도 충분하기 때문이며, 그 이상의 정규화를 진행할 경우 오히려 성능의 감소로 인해 비효율적인 테이블의 분리가 될 수 있기 때문이다.

하지만 지금은 정규화에 대한 공부를 하는 것이니 계속 이어서 정규형에 대한 설명을 진행해보도록 하겠다!


제 4정규형(4NF)

보이스-코드 정규형을 만족하면서 다치 종속을 제거하는 것이다.

교수과목교재
홍길동C언어C언어 기초
나무꾼데이터베이스데이터베이스 실습
거북이JavaJava 기초
달팽이데이터베이스데이터베이스 이론

위 테이블의 키는 모든 속성인 (교수, 과목, 교재) 이다. 즉, 모든 결정자가 후보키이기 때문에 BCNF를 만족한다. 그러나 위의 테이블은 과목이 정해지면 여러 개의 (교수, 교재) 가 결정될 수 있다. 이는 종속이 되지 않는 건 아니지만 일대일 매칭은 아니라는 것이며, 이러한 형태의 종속을 다치 종속이라고 한다.

이를 나타내는 방법은 (과목) ->> (교재 | 교수) 이다.

과목교재
C언어C언어 기초
데이터베이스데이터베이스 실습
JavaJava 기초
데이터베이스데이터베이스 이론

과목교수
C언어홍길동
데이터베이스나무꾼
Java거북이
데이터베이스달팽이

이처럼 다치 종속되는 두개의 속성을 각각 분리하여 (과목) → (교재), (과목) → (교수) 로 테이블로 나타낼 수 있다.

제 5정규형(5NF)

제 4정규형을 만족하면서 조인 종속을 제거하는 것이다.

과목교수교재
C언어홍길동C언어 기초
데이터베이스나무꾼데이터베이스 실습
데이터베이스나무꾼데이터베이스 이론
Java거북이Java 기초
데이터베이스달팽이데이터베이스 실습
데이터베이스달팽이데이터베이스 이론

위의 테이블은 4NF 테이블에 대해 조인 연산을 수행한 것이다. 이처럼 제 4정규형을 만족하기 전과 다른 결과가 나오는 것을 알 수 있다. 이처럼 하나의 릴레이션을 여러 개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터의 손실이 없고 필요없는 데이터가 생기는 것조인 종속이라고 한다.

위의 결과에서는 필요없는 데이터가 추가적으로 생겼으므로 제 5정규형을 만족하지 않는다.

과목교재
C언어C언어 기초
데이터베이스데이터베이스 실습
JavaJava 기초
데이터베이스데이터베이스 이론

과목교수
C언어홍길동
데이터베이스나무꾼
Java거북이
데이터베이스달팽이

교수교재
홍길동C언어 기초
나무꾼데이터베이스 실습
거북이Java 기초
달팽이데이터베이스 이론

위의 결과처럼 2개의 테이블로 분해하는 것이 아닌 3개의 테이블로 분해하여 제 5정규형을 만족하도록 할 수 있다.

profile
소소한 공부기록

0개의 댓글