정규화
JeongSeulho
2025년 01월 20일
정규화
데이터 중복과 insertion
, update
, deletion
의 anomaly
를 최소화 하기 위해 일련의 normal form
에따라 relation
을 구성하는 과정
normal form이란 정규화되기 위해 준수해야 하는 규칙
이 각각의 규칙을 normal form(NF)이라고 함
정규화 과정
1NF
부터 시작하여 순차적으로 진행- 해당 규칙을 만족하도록 테이블 구조를 조정
- 앞 단계의 규칙을 만족해야 다음 단계로 진행 가능
예시를 통한 정규화 과정
- 임직원의 월급 계좌를 관리하는 테이블블
정책 설명
- 계좌는 국민은행 OR 우리은행
- 한 임직원은 2개 이상의 월급 계좌를 등록하고 월급 비율을 조정 가능
- 계좌마다 등급 존재
- 국민은행 : START -> PRESTIGE -> ROYAL
- 우리은행 : BRONZE -> SILVER -> GOLD
- 한 계좌는 2개 이상의 현금카드와 연동 가능
해당 테이블의 key, attribute 파악
super key
: tuple을 유니크하게 식별할 수 있는 속성 집합candidate key
: super key 중 최소한의 속성만으로 구성된 속성 집합{account_id}
,{bank_name, account_num}
primary key
: candidate key 중 식별자로 선택된 candidate key{account_id}
prime attribute
: candidate key에 포함된 속성account_id
,bank_name
,account_num
non-prime attribute
: candidate key에 포함되지 않은 속성
해당 테이블의 FD 파악
account_id
-> 나머지 모든 속성bank_name, account_num
-> 나머지 모든 속성class
->bank_name
(등급을 보면 어느 은행인지 알 수 있음)empl_id
->empl_name
1NF 설명 및 테이블 수정
attribute
의value
는 나눠질 수 없는 단일한 값이어야 함(배열 안됨)- 1NF 규칙 만족을 위해 테이블 수정
card_id
를 분리하여 튜플 추가
2NF 설명
- 모든
non-prime attribute
는 모든candidate key
에fully functionally dependent
해야 한다. - 1NF로 인하여 바뀐
candidate key
{account_id, card_id}
{bank_name, account_num, card_id}
- 1NF로 인하여 바뀐
non-prime attribute
{class}
,{ratio}
,{empl_id}
,{empl_name}
현재
{account_id, card_id}
가candidate key
이지만{account_id}
만으로도
non-prime attribute
인{class}
,{ratio}
,{empl_id}
,{empl_name}
를 유일하게 결정할 수 있음
마찬가지로{bank_name, account_num, card_id}
가candidate key
이지만{bank_name, account_num}
만으로도
non-prime attribute
인{class}
,{ratio}
,{empl_id}
,{empl_name}
를 유일하게 결정할 수 있음
따라서 현재 2NF 규칙을 만족하지 않음
2NF 테이블 수정
3NF 설명
- 모든
non-prime attribute
는 어떤candidate key
에도transitively functionally dependent
하지 않아야 한다.
transitive FD란
X
->Y
&&Y
->Z
일때X
->Z
를transitive FD
라고 함
단,Y
와Z
는candidate key
의 부분집합이 아니어야 함
- 또다른 설명으로는
non-prime attribute
가 다른non-prime attribute
에 FD가 없어야 한다.
현재
{account_id}
->{empl_id}
이고{empl_id}
->{empl_name}
이므로{account_id}
->{empl_name}
가 성립, 3NF 규칙을 만족하지 않음
또다른 설명으로non-prime attribute
인{empl_id}
와{empl_name}
사이에 FD가 있으므로 3NF 규칙을 만족하지 않음
3NF 테이블 수정
BCNF 설명
- 모든 유효한
non-trivial FD
인X
->Y
에 대해서X
는super key
이어야 한다.
non-trivial FD
란X
->Y
가 성립할때,X
가Y
의 부분집합이 아니어야 함을 의미
현재
{class}
->{bank_name}
은non-trivial FD
이지만{class}
가super key
가 아니므로 BCNF 규칙을 만족하지 않음
BCNF 테이블 수정
2NF 참고 사항
- 2NF는 모든
candidate key
가composite key
(원소 개수가 2 이상인 집합의 키)가 아니라면 2NF는 자동적으로 만족한다. - 즉, 모든
candidate key
의 원소 개수가 1이라면 2NF는 자동적으로 만족한다. candidate key
가 1개인 경우 항상fully FD
하고,partial FD
가 없으므로- 단, 어떤 속성의 값이 모두 같은 경우 예외
위에서
{empl_id}
->{empl_name, birth_date, position, salary, company}
이고
{}
->{company}
임
{}
(공집합)은{empl_id}
의 부분집합이므로{company}
는{empl_id}
에partially FD
임.
따라서 2NF를 만족하지 않음
비정규화
- 정규화된 테이블을 정규화되지 않은 테이블로 변환하는 과정
- DB의
과도한 조인
과중복 데이터
사이의trade-off
를 고려하여 비정규화 진행 - 일반적으로 실무에서는 3NF 또는 BCNF까지 정규화 진행