본문 바로가기

Dev.Basic/데이터베이스

[DB] 정규화는 왜 하는 것인가?

정규화는 왜 하는 것인가?


#1. 정규화는 어떤 배경에서 생겨났는가?
한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다. 또 중복된 정보로 인해 갱신 이상이 발생하게 된다. 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다.

1-1. 갱신 이상에는 어떠한 것들이 있는가?
삽입 이상(insertion anomalies)
원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말한다.

삭제 이상(deletion anomalies)
하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.

수정(갱신)이상(modification anomalies)
정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말한다.



#2. 그래서 정규화란 무엇인가?
관계형 데이터베이스에서 중복을 최소화하기 위해서 데이터를 구조화하는 작업이다. 좀 더 구체적으로는 불만족스러운 ‘나쁜’ 릴레이션의 애트리뷰트들을 나누어서 ‘좋은’ 작은 릴레이션으로 분해하는 작업을 말한다. 정규화 과정을 거치게 되면 정규형을 만족하게 된다. 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 제 1정규형, 제 2정규형, 제 3정규형, … 등이 존재한다.

2-1. ‘나쁜' 릴레이션은 어떻게 파악하는가?
엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성을 판단한다. 판단된 함수적 종속성(Functional Dependency)은 좋은 릴레이션 설계의 정형적 기준으로 사용된다. 즉, 각각의 정규형마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의되고, 그 정규형을 만족하지 못하는 정규형을 ‘나쁜' 릴레이션으로 파악한다.

2-2. 함수적 종속성이란 무엇인가?
함수적 종속성이란 애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건의 일종이다. X와 Y를 임의의 애트리뷰트 집합이라고 할 때, X의 값이 Y의 값을 유일하게(unique) 결정한다면 “X는 Y를 함수적으로 결정한다”라고 한다. 함수적 종속성은 실세계에서 존재하는 애트리뷰트들 사이의 제약조건으로부터 유도된다. 또한 각종 추론 규칙에 따라서 애트리뷰트들간의 함수적 종속성을 판단할 수 있다.
cf> 애트리뷰트들의 관계로부터 추론된 함수적 종속성들을 기반으로 추론 가능한 모든 함수적 종속성들의 집합을 폐포라고 한다.

2-3. 각각의 정규형은 어떠한 조건을 만족해야 하는가?
Default 1. 분해의 대상인 분해 집합 D는 무손실 조인을 보장해야 한다.
Default 2. 분해 집합 D는 함수적 종속성을 보존해야 한다.

제 1 정규형
애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. 즉, 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.

제 2 정규형
모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X->Y 라고 가정했을 때, X의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

제 3 정규형
어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X->Y, Y->Z의 경우에 의해서 추론될 수 있는 X->Y의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.

BCNF(Boyce-Codd) 정규형
여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다.
복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다.
비주요 애트리뷰트가 후보키의 일부를 결정하는 함수적 종속성을 분해하는 과정을 말한다.

각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.
모든 제 2 정규형 릴레이션은 제 1 정규형을 갖는다.
모든 제 3 정규형 릴레이션은 제 2 정규형을 갖는다.
모든 BCNF 정규형 릴레이션은 제 3 정규형을 갖는다.

수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.



#3. 어떠한 장점이 있는가?
1. 데이터베이스 변경 시 이상 현상(Anomaly) 제거
위에서 언급했던 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.

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

3. 사용자에게 데이터 모델을 더욱 의미있게 제공
정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.



#4. 단점은 없는가?
정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것이다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.
느려지는 경우의 대표적인 예로는 JOIN연산에 있다. 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN연산)이 많아진다. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다.


#4-1. 단점에서 미루어보았을 때 어떠한 상황에서 정규화를 진행해야 하는가? 단점에 대한 대응책은?
조희를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

반정규화(De-normalization, 비정규화)
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복의 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다. 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다.일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

4-2. 무엇이 반정규화의 대상이 되는가?
1. 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
2. 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
3. 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

4-3. 반정규화 과정에서 주의할 점은?
반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다. 즉 정규화로부터 얻은 이점이 사라지게 된다. 데이터베이스의 성능을 판단하는 두 척도인 입력/삭제/수정에 대한 성능과 조회에 대한 성능 두 경우는 서로 trade-off가 존재하게 되는 것이다.

4-4. 다른 대책은 없는가?
복잡한 쿼리문에 대해서는 VIEW를 통해서 쿼리의 미숙함을 해결할 수 있지 않을까?
조회 성능을 위해 반정규화를 진행하기 전에 클러스터링 또는 인덱스를 적용하여 해결할 수 있는지를 먼저 검토한다.


end

'Dev.Basic > 데이터베이스' 카테고리의 다른 글

SQL Injection이란 무엇인가  (0) 2017.03.30
[NoSQL] Intro. NoSQL이란  (0) 2017.03.08
RDB 성능 이슈 3. INDEX의 원리와 종류  (0) 2016.12.11
RDB 성능 이슈 2. Transaction  (0) 2016.12.09
RDB 성능 이슈 1. Index란  (0) 2016.11.28