[DB] 정규화란?
01. 정규화는 왜 생겼을까?
한 릴레이션에 여러 엔티티의 속성들을 혼합하게 되면, 정보가 중복 저장됩니다.
이는 갱신 이상을 발생시키며, DB의 저장 공간을 낭비하게 됩니다.
이러한 문제를 해결하기 위한 기법이 정규화입니다.
💡 갱신 이상
[1] Insertion anomalies
원하지 않는 자료 삽입, 삽입하는데 자료가 부족해 삽입이 되지 않음
[2] Deletion anomalies
하나의 자료만 삭제하고 싶지만, 해당 자료가 포함된 튜플 전체가 삭제되어 원하지 않는 정보 손실 발생
[3] Modification anomalies
정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않음.
02. 정규화(Normalization)란?
정규화 (Normalization)의 기본 목표는 테이블 간의 중복된 데이터를 허용하지 않겠다! 라는 것입니다.
중복된 데이터를 허용하지 않음으로써 ‘무결성’을 유지할 수 있으며 DB의 저장 용량을 줄일 수 있습니다.
더해서, 목적은 주로 두 가지 입니다.
- 불필요한 데이터 (data redundancy)를 제거
- 데이터 저장을 논리적으로 한다. → 테이블의 구성이 논리적이고 직관적이어야 한다.
예를 들어, 정규화를 안 했을 때 문제점에 대해 말해보겠습니다.
위 테이블은 정규화 과정을 거치지 않아 문제가 많은 테이블입니다.
따라서 데이터 핸들링 시 다양한 이상 현상이 발생하게 되겠죠?
- Update : Adam의 address가 변경되었을 때, 여러줄의 데이터를 갱신해야 합니다. 따라서 데이터의 불일치가 발생할 수 있습니다.
- Insert : 만약 학생이 아무 과목도 수강하지 않는다면, Subject_opted는 NULL값이 들어갑니다.
- Delete : 만약 Alex 학생이 과목 수강을 취소하면, Alex의 레코드가 아예 테이블에서 지워집니다.
이러한 이상 현상을 방지하고자, 테이블의 구성을 논리적으로 변경하여 해결하는 기법이 바로 정규화입니다.
정확하게 말하자면, 테이블의 컬럼들을 나누어 좋은 작은 테이블로 분해하는 작업을 말합니다.
03. 정규화의 법칙(Normalization Rule)
정규화의 법칙은 1차 정규화, 2차 정규화, 3차 정규화, BCNF, 4차 정규화, 5차 정규화로 나눌 수 있습니다.
실무적으로 4, 5차 정규화까지 하는 경우는 많지 않다고 합니다.
03-1. 1차 정규화
1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 합니다.
이를 컬럼이 ‘원자값(Atomic Value)’를 갖는다고 합니다.
예를 들어 위의 표는 Adam의 Subject가 두개이기 때문에 1차 정규형을 만족하지 않습니다.
위의 정보를 표현하기 위해서 한개의 로우를 더 만들게 됩니다.
결과적으로 1차 정규화를 함으로써, 불필요한 데이터(redundancy)는 더 증가함을 볼 수 있습니다.
데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있습니다.
03-2. 2차 정규화
2차 정규형은 테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 합니다.
다시 말하자면, 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 의미입니다.
위 테이블을 보면 기본키는 Student, Subject 두 개로 볼 수 있습니다.
이 두 개가 합쳐져야만 하나의 로우를 구분할 수 있기 때문입니다.
하지만 Age의 경우 Student 컬럼에만 종속되어 있습니다
(= Student 컬럼의 값을 알면, Age의 값을 알 수 있습니다.)
따라서 Age가 두 번 들어가는 것은 불필요한 것으로 볼 수 있습니다.
이를 해결하기 위한 방법은 밑의 사진처럼 테이블을 쪼개는 방법이 있습니다.
Student Table
Subject Table
이렇게 테이블을 쪼개게 되면, 두 테이블 모두 2차 정규형을 만족하게 됩니다.
또한 삽입/ 삭제/ 갱신 이상을 겪지 않게 됩니다.
하지만 조금 더 복잡한 테이블의 경우, 갱신 이상을 겪기도 합니다.
이를 해결하는 것이 3차 정규화입니다.
03-3. 3차 정규화
위와 같은 데이터 구성을 생각해봅시다.
Student_id가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족합니다.
하지만 이 데이터의 Zip 컬럼을 알면, Street, City, State를 결정할 수 있습니다.
또한 여러명의 학생들이 같은 Zip 코드를 갖는 경우에 중복된 데이터가 생길 수 있습니다.
정리하면 3차 정규화는 기본키를 제외한 속성들 간에 이행적 함수 종속이 없는 것 입니다.
다시 말하자면, 기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정할 수 없는 것 입니다.
3차 정규화는 2차 정규화와 마찬가지로 테이블을 분리하여 해결할 수 있습니다.
이렇게 두 개의 테이블로 나눔으로써, 3차 정규형을 만족할 수 있습니다.
이를 통해 데이터가 논리적인 단위 (학생, 주소)로 나뉘어질 수 있고, 데이터의 redundancy도 줄어든 것을 확인할 수 있습니다.
03-4. BCNF
BCNF (Boyce and Codd Normal Form)은 3차 정규형을 조금 더 강화한 버전으로 볼 수 있습니다.
이는 3차 정규형으로 해결할 수 없는 이상현상들을 해결할 수 있습니다.
BCNF란 3차 정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다.
위 그림을 보면, 후보키는 슈퍼키 중에서 최소성을 만족하는 키 인데, 이 경우 (학생, 과목)입니다.
(학생, 과목)은 로우를 유일하게 구분할 수 있습니다.
하지만 이 테이블의 경우, 교수가 결정자 입니다. (교수가 한 과목만 강의할 수 있다고 가정)
즉 교수가 정해지면 과목이 결정됩니다.
하지만 교수는 후보키가 아닙니다.
→ 이 경우에 BCNF를 만족하지 못한다고 합니다.
즉 3차 정규형은 만족하되, BCNF는 만족하지 못하는 경우는 ‘일반 컬럼이 후보키를 결정하는 경우’ 입니다.
위의 테이블에서는 데이터가 중복되고 갱신 이상이 발생합니다.
예를 들어 Mr. Sim이 강의하는 과목명이 바뀌었다면 두개의 로우를 갱신해야 합니다.
이를 해결하기 위해서는 마찬가지로 테이블을 분리합니다.
03-5. 선행 조건
각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖습니다.
- 모든 제 2 정규형 테이블은 제 1 정규형을 갖는다
- 모든 제 3 정규형 테이블은 제 2 정규형을 갖는다
- 모든 BCNF 정규형 테이블은 제 3 정규형을 갖는다.
수많은 정규형이 있지만 대부분의 관게 데이터베이스 설계의 목표는 각 릴레이션이 3NF (or BCNF)를 갖게 하는 것입니다.
04. 정규화의 장 & 단점
장점
[1] 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있습니다.
[2] 데이터베이스 구조 확장 시, 재 디자인이 최소화됩니다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시,
해당 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. - 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만 미치게 되어 응용 프로그램의 생명을 연장시킨다.
[3] 더욱 의미있는 데이터 모델을 제공합니다.
- 정규화된 테이블들과 정규화된 테이블들의 관계들은 현실 세계에서의 개념들과 그들간의 관계를 반영한다.
단점
[1] 테이블 분해로 인한 join 연산이 많이 발생합니다.
- 질의에 대한 응답 시간이 느려질 수 있습니다.
단점에 따라서 정규화된 테이블은 조회를 하는 SQL 문장에서 join이 많이 발생합니다.
이로 인한 성능 저하가 나타나는 경우에는 반정규화를 적용하는 전략이 필요합니다.
05. 반정규화(De-normalization)
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해
중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나입니다.
- 디스크 I/O 량이 많아 조회 시 성능 저하
- 테이블끼리의 경로가 너무 멀어 join으로 인한 성능 저하가 예상
- 컬럼을 계산하여 조회할 때 성능이 저하될 것이 예상
위의 경우에 반정규화를 수행하게 됩니다.
→ 일반적으로 대부분 ‘조회’에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려합니다.
05-1. 반정규화의 대상
- 자주 사용되는 테이블에 접근하는 프로세스의 수가 가장 많고,
항상 일정한 범위만을 조회하는 경우 - 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
- 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우
05-2. 반정규화 과정에서 주의할 점
반정규화를 과도하게 적용하다보면 데이터의 무결성이 깨질 수 있습니다.
또한 입력/수정/삭제 질의문에 대한 응답 시간이 늦어질 수 있습니다.
따라서 정규화와 반정규화를 적절히 사용하는 것이 중요합니다. 😊
댓글남기기