Post

DB - 정규화

데이터베이스 스터디 4주차에서 학습하고 정리한 내용입니다.

1. 정규화(Normalization)

정규화는 데이터의 중복을 제거하거나 최소화하고 데이터 종속이 논리적으로 표현되도록 데이터를 재구성하는 과정이다. 이 과정을 수행함으로써 데이터 이상 현상이 제거된다.


2. 제 1 정규형(First Normal Form, 1NF)

제 1 정규형은 릴레이션 내 모든 데이터가 스칼라 값만 가지고 데이터 그룹을 속성으로 가질 수 없다.

제 1 정규형 위반 사례

  • 제 1 정규형을 위반한 첫 번째 사례(student 테이블)
student_idSubject_name
1Algorithm, Network
2Database
3Network, Database
  • 제 1 정규형을 위반한 두 번째 사례(student 테이블)
student_idsubject_name_1subject_name_2
1AlgorithmNetwork
2DatabaseNone
3NetworkDatabase

위의 두 테이블은 모두 제 1 정규형을 위반하고 있다. 이렇게 테이블을 구성했을 때 문제점은 다음과 같다.

  1. 데이터 조회 시 복잡하다. 특히 첫 번째 테이블의 경우 추가적인 문자열 파싱이 필요할 수 있다.
  2. 유연성이 떨어진다. 특히 두 번째 테이블의 경우 수업을 3개 이상 듣는 학생이 있다면 새로운 컬럼을 추가하는 작업이 필요하다.
  3. 삽입 이상이 발생한다. 특히 두 번째 테이블의 경우 2번 튜플처럼 듣는 과목이 하나일 때 ‘None’이라는 불필요한 값을 추가해야 한다.
  4. 갱신 이상이 발생한다. Network을 Computer Network로 변경하고 싶다면 모든 튜플들 내 Network을 변경하지 않으면 데이터가 불일치 되는 문제가 발생한다.
  5. 삭제 이상이 발생한다. 1번 학생을 삭제할 때 Algorithm이란 과목도 함께 삭제가 된다.

이 제 1 정규형을 만족하지 않을 때 가장 큰 문제는 데이터를 조회하고 조작하기 어렵다는 점이다.

제 1 정규형 도입

  • 제 1 정규형을 도입한 student 테이블
student_idsubject_name
1Algorithm
1Network
2Database
3Network
3Database

1 정규형을 도입하면 문자열 처리 등의 과정이 생략되어 데이터 조회와 조작이 간편해진다. 하지만 1 정규형을 도입한 것 만으로는 이상 현상이 해결되지 않아 추가적인 정규화 과정이 필요하다.


3. 제 2 정규형(2NF)

제 2 정규형은 제 1 정규형을 만족하면서 후보 키가 아닌 모든 속성이 후보 키에 대해 완전 함수적 종속이어야 한다.

제 2 정규형 위반 사례

  • 제 2 정규형을 위반한 student 테이블
student_idstudent_namesubject_idsubject_namescore
1Kim1DatabaseA0
1Kim2AlgorithmB0
2Park2AlgorithmA0
2Park3NetworkB+

이 경우 student_id, subject_id -> subject_name을 만족하지만 student_id를 제외한 subject_id -> subject_name 또한 함수 종속성을 만족한다. 이 때 subject_name이라는 후보 키가 아닌 속성이 후보 키 (student_id, subject_id)에 대해 부분 함수적 종속을 만족하므로 제 2 정규형을 위반한다. 이렇게 테이블을 구성하면 제 1 정규형에 비해 데이터를 조회하고 조작하기는 쉬워졌지만 여전히 여러 이상 현상들이 나타날 수 있다.

  1. 삽입 이상이 발생한다. 아직 학생이 없는 과목을 개설할 때 학생 정보에 의미없는 값을 추가해야 한다.
  2. 갱신 이상이 발생한다. Algorithm의 과목 이름을 변경할 때 모든 이름을 변경하지 않으면 데이터 불일치가 발생한다.
  3. 삭제 이상이 발생한다. Kim의 데이터를 삭제할 때 Database에 대한 정보가 함께 삭제될 수 있다.

제 2 정규형 도입

  • student 테이블
student_idstudent_name
1Kim
2Park
  • subject 테이블
subject_idsubject_name
1Database
2Algorithm
3Network
  • score 테이블
student_idsubject_idscore
11A0
12B0
22A0
23B+

제 2 정규형을 도입한 결과 중복되는 데이터를 제거하여 기존 테이블의 갱신 이상, 삽입 이상 및 삭제 이상 문제를 해결할 수 있다. 하지만 제 2 정규형은 특정한 상황에서 여전히 이상 현상이 발생할 수 있다. 이를 해결하기 위해 제 3 정규형을 도입할 수 있다.


4. 제 3 정규형(3NF)

제 3 정규형은 제 2 정규형을 만족하면서 후보 키가 아닌 모든 속성이 후보 키에 대하여 이행적 함수 종속성이 없어야 한다.

제 3 정규형 위반 사례

  • address 테이블
idstatecitystreet_name
1NYNew York CityBroadway
2CALos AngelesSunset Boulevard
3ILChicagoMichigan Avenue
4TXHoustonWestheimer Road
5CALos AngelesHollywood Boulevard
6NYNew York CityFifth Avenue
7CASan FranciscoLombard Street

제 2 정규형을 도입하더라도 테이블 내 이행적 함수 종속성이 있는 경우 여전히 이상 현상이 발생할 수 있다. 이 테이블은 기본 키가 단일 속성이므로 기본 키의 부분 집합이 존재하지 않는다. 따라서 기본 키에 대한 부분 함수적 종속은 없으므로 제 2 정규형이 적용되어 있음을 확인할 수 있다.

이 때 id -> city, city -> state 함수 종속성을 만족하면서 id -> state 함수 종속성을 만족한다. 이 경우 기본 키가 아닌 속성인 state와 city가 기본 키에 대해 이행적 함수 종속성을 만족한다. 이행적 함수 종속성은 키가 아닌 속성들 간의 종속성이 존재하므로 데이터가 중복될 가능성이 높다.

  1. 삽입 이상이 발생한다. state와 city만 존재하는 데이터를 넣을 때 street_name에 의미 없는 값을 추가해야 한다.
  2. 갱신 이상이 발생한다. 한 city의 이름이 변경될 때 모든 이름을 변경하지 않으면 데이터 불일치가 발생한다.

이와 같이 이상 현상이 발생할 수 있으므로 정규형을 통해 이행적 함수 종속성을 제거해야 한다.

제 3 정규형 도입

  • state 테이블
idstate
1NY
2CA
3IL
4TX
  • city 테이블
idstate_idcity_name
11New York City
22Los Angeles
32San Francisco
43Chicago
54Houston
  • street 테이블
idcity_idstreet_name
11Broadway
21Fifth Avenue
32Sunset Boulevard
42Hollywood Boulevard
53Lombard Street
64Michigan Avenue
75Westheimer Road

이렇게 이행적 함수 종속성을 제거하는 과정으로 제 3 정규형을 만족하도록 할 수 있다. 제 3 정규형을 도입하기 전과 달리 데이터 중복이 존재하지 않아 갱신 이상이 발생하지 않는다. 또한 삽입 이상도 발생하지 않는다.

하지만 제 3 정규형도 아주 특이한 상황에서 이상 현상이 발생할 수도 있다. 이 때 이상 현상을 제거하기 위해 BCNF, 4NF, 5NF를 도입할 수 있지만 정규화가 고도화될 수록 성능이 저하될 수 있으므로 이를 고려하여 도입해야 한다. 또한 성능과 데이터 무결성의 이점을 비교하여 성능이 더 우선시 될 경우 제 3 정규형 이전의 정규형도 의도적으로 위반할 수 있다.


Reference

홍봉희 편저, 데이터베이스 SQL 프로그래밍 ‘MySQL 실습’, 부산대학교출판문화원

This post is licensed under CC BY 4.0 by the author.

© . Some rights reserved.

Using the Chirpy theme for Jekyll.