본 내용은 한빛미디어의 데이터베이스 개론(3판)을 읽고 정리한 내용입니다.
속성(attribute)들 간의 종속성(dependency)을 분석해서 하나의 종속성이 하나의 릴레이션(relation)으로 표현되도록 분해해 나가는 과정을 정규화라 한다.
기본 원칙은 다음 3가지이다.
- 정보의 무손실
- 분해된 릴레이션이 표현하는 정보는 분해되기 전의 정보를 모두 포함하여야 하며, 더 바람직한 구조여야 한다.
- 분해된 릴레이션은 조인을 통하여 언제든 원래 릴레이션의 모습으로 복원할 수 있어야 한다.
- 중복성 감소
- 중복으로 인한 이상 현상을 제거한다.
- 테이블의 분리
- 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리하여 표현해야 한다.
정규형은 기본 정규형과 고급 정규형으로 나뉜다. 일반적으로는 기본 정규형인 1차 정규화, 2차 정규화, 3차 정규화, BCNF 정도까지만 수행한다.
1. 1차 정규화
- 모든 속성의 도메인은 원자값으로 구성되어 있어야한다. 어떠한 속성도 여러개의 값을 가져서는 안 된다.
RDB에서 릴레이션은 모든 속성이 원자 값을 가지는 특성이 있다. 그러므로 1차 정규형을 만족해야지 RDB의 릴레이션이 될 자격을 가진다.
2. 2차 정규화
- 모든 속성은 기본키에 완전 함수 종속이어야 한다.
기본키가 둘 이상의 속성으로 구성되어 있다고 했을때, 어떠한 속성도 기본키를 구성하는 속성 중 일부에만 함수 종속이어서는 안 된다. 즉, 부분 함수 종속을 제거해야 한다.
따라서 부분 함수 종속이 발생하는 속성과 결정자를 별도의 테이블로 분리해야 한다.
3. 3차 정규화
- 기본키가 아닌 모든 속성이 기본키에 이행 함수 종속이 되지 않아야 한다.
릴레이션을 구성하는 속성 집합 X, Y, Z가 있을 때, X -> Y를 결정하고, Y -> Z를 결정하면 논리적으로 X -> Z가 성립한다. 이때, 속성 집합 Z가 속성 집합 X에 이행 함수 종속 되어 있다 한다.
이름 | 좋아하는 게임 | 출시연도 |
게이머 | 엘든링 | 2022 |
위와 같은 테이블이 있을 때, 이름은 좋아하는 게임을 결정하며, 게임은 출시연도를 결정하게 된다.
출시연도는 사용자의 이름에 의해 결정되는 것이 아니기 때문에 별도의 테이블로 분리해야만 한다.
이름 | 좋아하는 게임 |
게이머 | 엘든링 |
게임 | 출시연도 |
엘든링 | 2022 |
4. BCNF(보이스-코드 정규화)
- 모든 결정자는 후보키에 속해야 한다.
하나의 릴레이션에는 여러 개의 후보키가 존재할 수 있다.
고객아이디 | 인터넷강좌 | 담당강사번호 |
회원A | 오픽 | P001 |
위의 테이블에서 {고객아이디, 인터넷강좌} 속성 집합은 담당강사번호를 함수적으로 결정한다.
그러나 한 명의 강사가 오직 하나의 인터넷강좌를 담당한다면 담당강사번호 가 인터넷강좌 속성을 함수적으로 결정하게 된다.
따라서 위의 테이블은 아래와 같이 분리되어야 한다.
고객아이디 | 담당강사번호 |
회원A | P001 |
담당강사번호 | 인터넷강좌 |
P001 | 오픽 |
따라서 더 이상 후보키가 아닌 결정자가 존재하지 않아 BCNF를 만족하게 된다.
'Database' 카테고리의 다른 글
[MySQL] InnoDB 스토리지 엔진 아키텍처 (0) | 2024.06.09 |
---|---|
[MySQL] MySQL 엔진 아키텍처 (0) | 2024.06.09 |
[MySQL] 옵티마이저의 데이터 처리 방식 (2) | 2024.05.15 |
MySQL, Spring 프로젝트 연동시 예약어 문제 (0) | 2023.04.12 |
함수 종속 (0) | 2023.03.19 |