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

[Database] 정규화 (Normalization)

by 나는 유찌 2020. 6. 9.

 

 

 

정규화란? (Normalization)


관계형 데이터베이스의 설계에서 중복을 최소화하여 데이터를 구조화 하는 프로세스입니다.

정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있습니다.

 

 

 

 

정규화의 목적


① 데이터베이스의 변경 시 이상현상(갱신, 삽입, 삭제)을 제거합니다. 테이블 수정 시,  원치 않은 부작용이 발생하는 것을 제거합니다.

데이터베이스의 구조 확장 시 디자인을 다시하는 것을 최소화 합니다. 데이터베이스와 연동된 응용 프로그램에 최소한의 영향을 주어 응용 프로그램의 생명을 연장합니다.

③ 각 릴레이션에 중복된 종속성을 여러개의 릴레이션에 분할합니다.

④ 어떠한 릴레이션이라도 데이터베이스 내에서 표현이 가능하게 합니다.

⑤ 효과적인 검색 알고리즘을 생성할 수 있게 합니다.

 

 

* 이상현상

- 갱신 : 갱신 시, 다른 튜플의 데이터는 갱신되지 않아 일관성이 없어지게 된다.

- 삽입 : 원하지 않는 데이터가 삽입됩니다.

- 삭제 : 필요한 데이터까지 삭제가 됩니다.

 

 

 

 

정규화의 순서


1NF -> 2NF -> 3NF -> BCFN -> 4NF -> 5NF -> 6NF

 

3NF까지 오면 대부분 이상현상이 없다고 생각할 수 있습니다.

또한, 상위 정규화까지 진행이 되었다면 그 하위 정규화는 당연히 충족한다고 볼 수 있습니다.

예를들어, 3NF까지 진행되었다면 1,2NF는 당연하게 충족이 된다는 뜻입니다.

 

 

 

 

 

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


표준 요구사항

① 각 테이블에서 중복을 제거합니다.

② 각각 관계된 데이터 모임을 위하여 분리된 테이블을 만듭니다.

③ 각각 관계된 데이터 모임을 기본키로 식별합니다.

 

 

 

예를들어, 1NF를 지키지 않는 경우를 먼저 보겠습니다.

 

<TV 프로그램>

번호

프로그램명

출연자

1

무한도전

유재석, 박명수

2

런닝맨

김종국, 이광수, 송지효

3

1박2일

강호동, 이수근

TV 프로그램이라는 릴레이션이 있습니다.

한 프로그램에 출연하는 사람은 많은데 이를 표현하기 위해 '출연자' 칼럼에 데이터를 2개 또는 3개씩 넣은 것을 볼 수 있습니다.

이는 제1정규화에 위배 됩니다.

행 도메인에는 1개의 값만 허용하기 때문입니다.

 

 

 

그렇다면 이를 1정규화에 위배되지 않도록 구성하려면 어떻게 구성해야 할까요?

 

<TV 프로그램>

번호

프로그램명

1

무한도전

2

런닝맨

3

1박2일

 

<출연 연예인>

번호

이름

1

유재석

2

김종국

3

강호동

1

박명수

 

릴레이션을 'TV 프로그램'과 '출연 연예인'으로 나누었습니다.

이렇게 2개로 나눔으로써 하나의 칼럼에 2개 이상의 데이터가 들어가지 않음을 확인하여 제1정규화를 만족하게 됩니다.

 

 

 

 

 

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


제1정규화에 속하면서 기본키가 아닌 모든 속성이 기본키에 부분 함수 종속이 아닌 완전 함수 종속이 된 것을 말합니다.

이게 무슨 소리냐면 키에 해당하지 않는 모든 값들은 키에 종속되어야 한다는 뜻입니다.

 

 

예제를 통해 알아보도록 하겠습니다.

 

<TV 프로그램>

출연자

프로그램명

방영요일

유재석

무한도전

강호동

1박2일

박명수

무한도전

유재석

런닝맨

 

 

'TV 프로그램'이라는 릴레이션에서의 키는 '출연자 + 프로그램명'(복합키)입니다. 

키에 해당하지 않는 '방영요일'은 프로그램이 어떤것인지 알아야 알 수 있습니다.

복합키 2가지 중에 1개에만 종속적인 것을 알 수 있습니다.

 

 

 

 

그럼 이런 부분 함수 종속성을 제거하려면 어떻게 구성해야 할까요?

 

출연자

프로그램

유재석

무한도전

강호동

1박2일

박명수

무한도전

유재석

런닝맨

 

 

 

프로그램

방영요일

무한도전

런닝맨

1박2일

 

이렇게 테이블을 나누어주면 제2정규화에 위배되지 않게 됩니다.

 

 

 

 

 

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


제 2 정규형에 속하면서 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않는 것을 말합니다.

 

 

요구사항

제 2 정규형을 만족합니다.

테이블 내 모든 속성이 기본키에만 의존하고, 다른 키에 의존하지 않습니다.

 

 

 

 

예를들어, 카페 발주 시스템이라고 생각하고 나쁜 예를 들어보겠습니다.

 

이름(PK)

가격

카테고리

판매여부

원두

5000

원두

Y

냉동딸기

5000

봄시즌

N

냉동수박

5000

여름시즌

Y

 

 

재료의 이름을 기본키로 설정합니다.

각 재료의 값을 알려면 이름을 알아야하고, '원두'라는 카테고리에 '원두'를 넣고, '봄시즌'이라는 카테고리에 '냉동딸기'를 넣습니다. 여름이 오면 봄시즌 재료들은 발주를 불가능하게 하기 위해 판매여부를 설정합니다.

 

여기서 '판매여부'는 '카테고리'에 따라서 설정되도록 하기 때문에 기본키인 재료의 이름에 종속이 되지 않습니다.

 

 

 

 

이름(PK)

가격

카테고리

원두

5000

원두

냉동딸기

5000

봄시즌

냉동수박

5000

여름시즌

 

 

카테고리

판매여부

원두

Y

봄시즌

N

여름시즌

Y

 

이렇게 테이블을 2개로 나누어주면 제3정규형에 위배되지 않고 넘어갈 수 있습니다.