본문 바로가기

CS ﹒ Algorithm/Database

데이터베이스 (9) 설계 5 - 정규화와 역정규화의 이론과 예시

 

정규화란 무엇인가?

 

정규화는 Anomaly가 발생할 우려가 있는 테이블의 Relation을 분해하여 Anomaly를 제거하거나 미연에 방지하는 과정이다.

이는 단계별로 구별되어 있으며 정규화가 진행될수록 이상 Anomaly(이상 현상)은 줄어든다.

또한 정규화는 테이블을 세분화하여 확장성과 유지보수에 용이한 데이터베이스를 설계할 수 있도록 돕는다.

 

다만 정규화는 장점만 존재하는 것이 아니다. 만약 데이터베이스에 저장되는 데이터가 엄청나게 많다면 세분화된 관계 설정으로 인해 데이터 질의 응답 속도가 느려질 수 있다. 특히나 JOIN의 경우. (이것은 정말 데이터가 잘 설계되었음에도 불구하고 데이터가 너무너무너무 많은 경우를 가정한 것이다. 일반적인 경우에서 데이터베이스가 느리다면 정규화가 아니라 다른 문제일 확률이 높다.)

 

이런 경우 역정규화를 적용하여 고의적으로 정규화를 느슨하게 할 수 있다.

 

이 글에서는 정규화의 3단계까지와 역정규화에 대해 다룰 것이다.

(일반적으로 사용되는 정규화 과정은 3단계까지이다.)

 

 

직접 한 땀 한 땀 만든 이 테이블을 기준으로 정규화를 진행할 예정이다.

 

 

 

1. 제 1 정규화

 

제 1 정규화의 원칙은 다음과 같다.

(1) 모든 속성(== Column, Attribute)은 단 하나의 값을 가져야 한다.

(2) 값은 반드시 원자성(ATOM)을 가져야 한다. 더 이상 쪼갤 수 없는 단 하나의 값(ATOMIC VALUE)를 가져야 한다.

 

제 1 정규화의 대상은 다음과 같다.

(1) 다가 속성이 사용된 테이블. (하나의 레코드를 분할 시 여러 개의 레코드로 분할된다.)

(2) 복합 속성이 사용된 테이블. (하나의 컬럼을 분할 시 여러 개의 컬럼으로 분할된다.)

(3) 유사 속성(컬럼)이 반복되는 테이블.

.. 등등 거의 비슷한 부분이다.

 

여기서 주문 상품 테이블을 을 분리하는 것까지 해주는 게 맞는데 다가 속성을 분리하는 것을 보여주기 위해 다음 단계로 넘겼다.

 

 

 

2. 제 2정규화

- 두 개 이상의 키가 존재하는 테이블에서 발생한다.

- 테이블의 모든 속성이 후보 식별자 전체에 종속되어야 한다.

- 일반 속성(컬럼)이 후보 식별자 전체에 종속되지 않고 일부에 종속된다면 2 정규형이 아니다.

 

+ 어렵게 말하기 : 모든 비 식별자 속성은 후보 식별자 속성 함수에 종속되어야 한다.

 

복합키를 가진 테이블이 있을 때 키를 가지지 않은 다른 속성들은 해당 복합키에 모두 종속되던가, 혹은 분리되어야 한다.

 

 

 

3. 제 3 정규화

 

- 식별자가 아닌 일반 속성(컬럼)간에 종속성이 존재해서는 안된다.

- 3 정규형이 대상이 되는 속성을 "이행 종속성"이라고 한다.

 

위 사례에서 고객명과 닉네임을 3 정규화 대상으로 보는 것이 맞는가에 대해 고민했는데, 아닌 것 같아서 그냥 새로운 사례를 하나 더 만들었다.

 

위의 경우 학교가 PK가 아닌데 학교 이름에 전공 이름이 종속되고 있다.

이럴 경우 각각을 마스터 테이블로 만들고 관계형 테이블로 관계를 맺어줘야할 것이다.

 

 

 

 

 

 

4. 역정규화

 

지금까지 열심히 정규화를 해서 데이터베이스를 설계했는데, 막상 데이터가 계속 쌓이니 너무 정규화가 잘 된 나머지 성능이나 편의성이 더 안 좋아졌다는 판단을 하게된다면 역정규화라는 선택지를 고려해볼 수 있다.

다만 역정규화를 찾기 이전에 데이터베이스 튜닝 (1:1 매칭 등)을 먼저 고려하는 것이 좋다.

ex ) 회원의 데이터가 너무 많이 쌓였을 경우, 회원들을 가입 년도를 기준으로 다른 테이블에 배치하고 1:1 관계로 기준 테이블을 만들어 관리한다.

 

 

이건 크게 설명할 게 없고 위에서 한 걸 다시 돌려보내면 된다.

 

고객명과 연락처를 나눴는데, 상상 이상으로 인원이 많아져서 수천만건의 데이터베이스가 쌓여 JOIN으로 고객 아이디 한 번 불러오는데 엄청난 시간이 걸린다고 가정해보자.

모든 경우를 다 고려했음에도 방법이 이것 밖에 없다면 다시 테이블을 합치는 역정규화를 시도하는 것도 하나의 방법이다.