정규화
개념
- 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정
- 이상현상(삽입이상, 삭제이상, 갱신이상)을 방지하기 위해 작은 단위로 분리하는 과정
- 무결성을 유지할 수 있으며, DB의 저장용량 역시 줄일 수 있다.
- 정규화를 할 경우 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만, 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다.
이상현상(Anomaly)
종류
1. 삽입 이상(Insertion Anomaly)
- 데이터 삽입 시 의도와 다른 값들도 삽입되는 현상
- 불필요한 데이터를 추가해야 테이블에 삽입할 수 있는 현상
2. 갱신 이상(Update Anomaly)
- 속성값 갱신 시 일부 튜플만 갱신되어 모순이 발생하는 현상
- 일부만 변경하여 데이터가 불일치하는 모순이 발생하는 현상
3. 삭제 이상(Delete Anomaly)
- 데이터 삭제 시 의도와 다른 값들도 함께 삭제되는 현상
- 튜플 삭제로 인해 다른 데이터까지 함께 삭제되는 현상
함수 종속성(Functional dependency)
- 어떤 릴레이션 R에서, X와 Y를 각각 R의 속성(Attribute) 집합의 부분 집합이라 할때, 속성 X의 값 각각에 대해 시간에 관계없이 항상 속성 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수 종속이라 하고, X -> Y라고 표기한다.
이때 X를 결정자(determinant set)이라 하고, Y를 종속자(dependent attribute)라고 한다.
함수 종속성 종류
1. 완전 함수 종속(Full Functional Dependency)
- 어떤 속성 A가 속성 집합 B에 완전히 함수 종속한다고 할 때, A는 B의 모든 부분에 의존하고, B의 어떤 부분만으로는 A를 결정할 수 없을 때, 이를 완전 함수 종속이라고 함

기본키가 '회원번호'로 되어 있다. 여기서 '이름', '나이', '거주지역' 속성은 기본키인 '회원번호'를 알아야 식별 가능하다. 따라서 '이름', '나이', 거주지역'은 '회원번호'에 완전 함수 종속된 관계이다.
2. 부분 함수 종속(Partial Functional Dependency)
- 어떤 속성 A가 속성 집합 B의 부분 집합으로 결정될 때, A는 B의 부분 집합에 부분 함수 종속한다고 함

기본키가 '고객ID'와 '상품코드' 속성으로 구성되어 있으며, '주문상품'은 기본키 중 '상품코드'만 알아도 식별할 수 있다. 이 경우에는 '주문상품' 속성은 기본키에 부분 함수 종속된 관계이다.
3. 이행 함수 종속(Transitive Functional Dependency)
- 속성 A가 속성 B에 함수 종속하고, B가 속성 C에 함수 종속할 때, A가 C에 함수 종속한다고 할 수 있는데, 이를 이행 함수 종속이라고 한다.

'상품번호'를 알면 '소분류'를 알 수 있고, '소분류'를 알면 '대분류'도 알 수 있다.
따라서 '상품번호'를 알면 '대분류'를 알 수 있으므로 이행 함수 종속 관계이다.
즉 X -> Y이고 Y -> Z일때 X -> Z인 관계를 이행 함수 종속이라고 한다.
제 1 정규형
조건
- 모든 속성은 반드시 하나의 값만 가져야 한다(테이블의 칼럼(도메인)이 원자값이여야 한다.)
- 유사한 속성이 반복되는 경우도 1차 정규화의 대상이 된다.
제 1 정규화 대상 테이블
1. 도메인이 원자값이 아닌 경우

하나의 '직업' 속성에 다수의 데이터가 들어가 있다.
즉, 도메인이 원자값이 아니다.
이 테이블의 문제점은, 하나의 속성이 다중값을 가질 때 데이터를 꺼내 쓰려면 불필요한 Split을 사용해야 하는 식의 번거로움이 생길 수 있다.
제 1 정규화 했을 때


2. 유사한 속성이 반복되는 경우

유사한 속성인 '사이트1, 사이트2, 사이트3'이 하나의 테이블에서 여러 컬럼으로 반복되고 있다.
즉, 이 테이블은 유사한 속성이 반복된다.
이 테이블의 경우 문제점은 데이터가 늘어날 때 계속해서 속성을 추가해야 하고 반대로 모든 인스턴스가 추가된 속성의 개수만큼 속성값을 가지고 있지 않을 수도 있으므로 공간의 낭비가 발생할 여지가 있다.
제 1 정규화 했을 때


제 2 정규형
조건
- 제 1 정규형(1NF)를 만족하는 테이블에서 아래 조건이 추가로 만족해야 한다.
- 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
- 부분 함수 종속 관계가 제거되어야 한다.
부분 함수 종속 관계일 때

일반속성인 '음료명'이 주식별자(주문번호, 음료코드) 중 음료코드 속성에만 종속되어 있다.
따라서 부분 함수 종속 관계이다.
이 테이블은 주문이 되지 않은 음료는 입력을 할 수 없는 이상 현상과, 음료명이 변경될 경우 해당 음료에 대한 주문 데이터가 모두 변경되어야 하는 이상 현상이 발생할 수 있다.
제 2 정규화 했을 때


제 3 정규형
조건
- 제 2 정규형(2NF)를 만족하는 테이블에서 아래 조건을 추가로 만족해야 한다.
- 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
- 이행 함수 종속 관계(X -> Y, Y -> Z일 때, X -> Y를 만족하는 관계)가 제거되어야 한다.
일반속성이 주식별자가 아닌 다른 일반속성에 종속될 때,

이 테이블은 주식별자가 '일련번호'인데, 일반속성인 '소속사명'이 다른 일반속성인 '소속사코드'에 종속된다.
제 3 정규화를 했을 때


이행 함수 종속 관계일 때

이 테이블은 '학생번호'가 '강좌이름'을 결정하고, '강좌이름'이 '수강료'를 결정하고 있다. 즉 이 테이블은 X -> Y, Y -> X 이면서 X -> Z 관계를 성립하므로, 이행 함수 종속 관계에 있다.
제 3 정규화를 했을 때


BCNF 정규형
조건
- 제 3 정규형을 만족하는 테이블에서 아래 조건을 추가로 만족해야 한다.
- 모든 결정자가 후보키가 되도록 테이블이 분리되어 있어야 한다.
모든 결정자가 후보키가 아닐 때

이 테이블에서 기본키는 (학생번호, 강좌이름)이다.
그리고 기본키(학생번호, 강좌이름)는 교수를 결정하고 있다.
또한 교수는 강좌이름을 결정하고 있다.
그런데 문제는 교수가 강좌이름을 결정하는 결정자이지만, 후보키가 아니라는 점이다. 때문에 이 테이블은 BCNF 정규형을 만족하지 않는다.
BCNF 정규화를 했을 때


반정규화, 비정규화(De-Normalization)
개념
- 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정
- 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며, 데이터 정합성 이슈가 발생할 수 있다.