데이터베이스 정규화 (Database normalization)

정규화는 데이터베이스의 자료에서 중복성 및 일치하지 않는 종속성을 제거하여 데이터베이스의 유연성을 높이는 동시에 데이터를 보호하도록 설계된 규칙에 따라 테이블을 만들고 해당 테이블 간의 관계를 설정하는 작업이다.

데이터가 중복되면 디스크 공간이 낭비되며 유지 관리상의 문제가 발생함. 여러 위치에 있는 데이터를 변경해야 하는 경우에는 모든 위치에서 데이터를 정확히 동일한 방식으로 변경해야 함. 고객 주소 데이터가 Customers 테이블에만 저장되어 있고 데이터베이스의 다른 위치에는 없다면 고객 주소 변경을 구현하기가 훨씬 쉬워질 것임.

그렇다면 "일치하지 않는 종속성"이란 무엇일까? 특정 고객의 주소를 찾으려는 사용자는 자연스럽게 Customers 테이블을 확인하지만 해당 고객에게 전화를 거는 직원의 급여를 이 테이블에서 확인하는 것은 적절하지 않을 수 있다. 직원의 급여는 직원에 관련/종속되므로 Employees 테이블로 이동해야 함. 일치하지 않는 종속성이 있는 경우 데이터를 찾을 수 있는 경로가 없거나 끊겨 있을 수 있으므로 데이터를 찾기가 어려울 수 있다.

데이터베이스 정규화 예제로 간략하게 정규화에 대한 설명을 하겠다.

제1 정규화

반복되는 필드가 없어야 함.

이름 암호 별명1 별명2 별명3
---------------------------------------------
A 12 바보 쪼다 천치
B 13 천재 오버 NULL
C 14 상식 NULL NULL
D 15 오리 NULL NULL

위와 같이 이렇게 설계 하지 않고 다음처럼 함.

이름 암호
--------------
A 12
B 13
C 14
D 15
id 이름 별명
---------------
1 A 바보
2 A 쪼다
3 A 천치
4 B 천재
5 B 오버
6 C 상식
7 D 오리

이렇게 설계해야 함.

제2 정규화

중복되는 데이터를 분리해야 함.

사번 이름 부서 부서장
---------------------------------------
10101 홍길동 총무과 이부장
10102 고길동 총무과 이부장
10103 박길동 인사과 박부장
10104 최길동 인사과 박부장

위와 같은 구조를 다음과 같이 설계함.

사번 이름 부서번호
-------------------------
10101 홍길동 1
10102 고길동 1
10103 박길동 2
10104 최길동 2
부서번호 부서 부서장
--------------------------------
1 총무과 이부장
2 인사과 박부장

제3 정규화

주 키에 의존적이지 않은 데이터를 분리함.

학번 이름 국어점수 국어타입 수학점수 수학타입
-------------------------------------------------------------------------
10101 홍길동 100 전공필수 80 교양선택

위와 같은 구조를 다음과 같이 함.

학번 이름
------------------
10101 홍길동
10102 고길동
과목 타입
------------------
국어 전공필수
영어 교양선택

형태로 바꾸어 준다.

정규화의 원칙 : More Table Less Column을 지향함.

- FK 이외에는 중복 컬럼을 허용하지 않아야 함. ⇒ 이 원칙을 지킬 경우 JOIN의 횟수가 늘어날 가능성이 높으므로= JOIN횟수를 줄이기 위해서 아주 많이 일어나는 Query의 속도를 빠르게 하기 위해 약간의 중복을 허용함.

정규화는 정규화 할 수록 테이블 조회 시 조인을 해야 하기때문에 성능이 떨어지는 부분이 있지만 보통 3정규화까는 함.

역정규화(Denormalization)