정규화
정규화란 ERD 내에서 중복요소를 찾아 제거해 나가는 과정을 말한다.
함수의 종속성을 이용해 속성들 간의 연관성을 분석하고, 데이터를 논리적으로 나누어 이상 현상(Anomaly)을 방지하는 것이다.
이상 현상(Anomaly)
정규화를 거치지 않으면 데이터베이스에 불필요한 데이터 중복이 발생하여 여러 문제가 생길 수 있다. 이를 이상 현상이라고 하며, 대표적으로 삽입 이상, 갱신 이상, 삭제 이상이 있다.
1. 삽입 이상 (Insertion Anomaly)
데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상이다.
2. 갱신 이상 (Update Anomaly)
데이터를 수정할 때 일부만 갱신되어 정보가 불일치하게 되는 현상이다.
3. 삭제 이상 (Deletion Anomaly)
데이터를 삭제할 때 의도치 않게 다른 데이터도 함께 삭제되는 현상이다.
정규화 과정
제1 정규화 (1NF)
제1 정규형은 모든 속성이 원자값(더 이상 나눌 수 없는 단일 값)을 가지도록 테이블을 변환하는 것이다. 즉, 각 열에 하나의 값만 포함되도록 한다.
원자값 (Atomic Value)
더 이상 나눌 수 없는 단일 값을 의미한다. 각 열이 단일 데이터를 포함하도록 만들어야 한다.
아무 정규화도 되지 않은 테이블이 있다. 어떻게 하면 될까?
학생ID | 이름 | 전화번호 |
---|---|---|
1 | 홍길동 | 010-1234-5678, 010-8765-4321 |
2 | 이영희 | 010-2345-6789 |
전화번호 속성을 원자값을 가지도록 분리하면 된다.
학생ID | 이름 | 전화번호 |
---|---|---|
1 | 홍길동 | 010-1234-5678 |
1 | 홍길동 | 010-8765-4321 |
2 | 이영희 | 010-2345-6789 |
제2 정규화 (2NF)
제1 정규형을 만족하면서, 부분 함수적 종속을 제거하는 과정이다. 기본키가 여러 속성으로 구성된 경우(복합키), 복합키의 일부에만 종속되는 속성을 제거하여 모든 속성이 복합키 전체에 완전 함수적 종속되도록 만든다.
종속
데이터베이스에서 속성이 다른 속성에 종속된다는 것은 어떤 속성의 값이 다른 속성의 값에 의해 결정된다는 의미다.
부분 함수적 종속 (Partial Functional Dependency)
기본키가 여러 속성으로 구성된 경우, 기본키의 일부에만 종속되는 속성을 의미한다.
완전 함수적 종속 (Full Functional Dependency)
기본키 전체에 종속되는 속성을 의미한다. 즉, 기본키의 모든 구성 요소를 사용해야 종속 관계가 성립한다.
기본키가 (학생ID, 강의 ID)인 테이블이 있다.
학생ID | 강의ID | 강의명 |
---|---|---|
1 | 101 | 데이터베이스 |
1 | 102 | 운영체제 |
2 | 101 | 데이터베이스 |
2 | 103 | 알고리즘 |
강의명은 강의ID에 의해 결정되며, 학생ID는 강의명을 결정하는 데 필요하지 않다.
즉, 강의명은 강의ID에만 종속되어 있고, 학생ID와는 아무런 종속 관계가 없다.
아래와 같이 모든 속성이 기본키 전체에 완전 종속되도록 부분 함수적 종속을 제거한다.
학생ID | 강의ID |
---|---|
1 | 101 |
1 | 102 |
2 | 101 |
2 | 103 |
강의ID | 강의명 |
---|---|
101 | 데이터베이스 |
102 | 운영체제 |
103 | 알고리즘 |
제3 정규화 (3NF)
제3 정규형은 제2 정규형을 만족하면서, 이행적 종속을 제거하는 과정이다. 모든 속성이 기본키에 직접적으로 종속되도록 해야 한다.
이행적 종속
이행적 종속이란 A -> B이고 B -> C인 관계가 있을 때, A -> C라는 종속 관계가 생기는 것을 말한다.
즉, 테이블의 키가 아닌 컬럼들은 기본키에 의존해야 하는데 겉으로는 그런 것처럼 보이지만 실제로는 기본키가 아닌 다른 일반 컬럼에 의존하는 컬럼을 말한다.
이 테이블의 기본키는 학생ID이다.
학생ID | 학과ID | 학과명 |
---|---|---|
1 | 1001 | 컴퓨터공학 |
2 | 1002 | 전자공학 |
3 | 1001 | 컴퓨터공학 |
4 | 1003 | 기계공학 |
A -> B이고 B -> C인 관계가 있을 때, A -> C라는 종속 관계가 생기는 것이라고 했다.
학과명은 학과ID와 되어있고 기본키인 학생ID에는 직접적으로 종속되어 있지 않다. 학과ID를 통해 간접적으로 종속되어 있는 것이다.
이행적 종속 관계를 제거해 학생 테이블, 학과 테이블로 분리한다.
학생ID | 학과ID |
---|---|
1 | 1001 |
2 | 1002 |
3 | 1001 |
4 | 1003 |
학과ID | 학과명 |
---|---|
1001 | 컴퓨터공학 |
1002 | 전자공학 |
1003 | 기계공학 |
반정규화
반정규화란 데이터베이스의 성능을 향상시키기 위해 정규화된 데이터 구조를 일부러 다시 통합하거나 중복시키는 과정을 의미한다.
반정규화 방법
반정규화 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 컬럼 추가 등이 있다.
1. 테이블 통합
조인이 자주 발생하는 두 개의 테이블을 하나로 합쳐 조인 연산의 부하를 줄이는 방법이다.
데이터 조회 성능이 향상되는 장점이 있지만 데이터 중복이 발생하고, 업데이트 시 여러 곳을 수정해야 할 수 있다.
2. 테이블 분할
테이블을 수직 또는 수평으로 분할하여 특정 상황에 최적화하는 방법이다.
수평 분할
하나의 테이블을 레코드(행) 기준으로 분리한다.
예를 들어 고객 테이블을 지역별로 나누어 서울 지역 고객과 부산 지역 고객을 각각 다른 테이블에 저장하면 특정 지역 데이터를 빠르게 조회할 수 있다.
수직 분할
하나의 테이블에 속성이 너무 많을 경우 속성(열)을 기준으로 테이블을 분리한다.
자주 조회되는 열과 그렇지 않은 열을 분리해 성능을 최적화한다.
특정 데이터에 대한 접근 성능이 향상된다는 장점이 있지만 분할된 테이블 간에 조인이 필요할 경우 수행 속도가 느려질 수 있다.
그러므로 검색에 중점을 두어 사용 빈도에 따라 테이블 분할 여부를 결정해야 한다.
3. 중복 테이블 추가
자주 조회되는 데이터를 별도의 중복 테이블에 저장하여 조회 성능을 향상시키는 방법이다.
특정 범위를 자주 조회하거나 대량의 범위를 자주 처리할 때 해당 범위를 중복 테이블로 처리한다면 조회 속도가 빨라질 수 있다.
중복 테이블을 추가하는 방법
- 집계 테이블의 추가: 여러 테이블의 데이터를 집계해서 사용하는 집계 데이터의 경우 각 원본 테이블에 트리거를 설정해 사용하며, 트리거 오버헤드에 유의한다.
- 진행 테이블의 추가: 이력 관리용으로 특정 데이터를 별도로 관리하는 테이블을 생성한다.
- 부분 테이블 추가 : 대량의 데이터가 있는 테이블에서 특정 범위의 컬럼만 자주 사용 되는 경우 해당 컬럼들로 중복된 테이블을 구성해서 사용한다.
4. 중복 컬럼 추가
자주 사용하는 속성을 테이블에 중복으로 추가하여 조인 연산을 줄이는 방법이다.
고객의 주소 정보를 조회하기 위해 주소 테이블과 고객 테이블을 자주 조인한다면 고객 테이블에 주소 컬럼을 추가해 빠르게 조회할 수 있다.
데이터의 일관성을 유지하기 어렵고, 데이터 수정 시 여러 테이블을 수정해야 하며, 추가적인 디스크 공간이 필요하다.
참고
📋 제 1-2-3 정규화 & 역정규화 기법 💯 정리
CS-study
반정규화 (De-Normalization)
'👶🏻 CS > Database' 카테고리의 다른 글
인덱스(B-Tree, B+Tree) (0) | 2024.11.19 |
---|---|
NoSQL이란? (0) | 2024.11.16 |
트랜잭션 - ACID 원칙, Problem 3가지 (0) | 2024.11.11 |