잘못 설계된 데이터베이스의 테이블에 데이터를 조작한다면 데이터 일관성이 훼손되는 현상이 발생합니다.
이렇게 테이블에 CRUD를 수행할 때 의도하지 않았던 부작용이 발생하는 현상을 이상현상 Anomaly
라고 부르며 이러한 이상현상이 발생한 테이블을 정상적으로 되돌리는 과정을 정규화
라고 합니다.
다음과 같은 테이블이 존재한다고 가정을 할 때 주로 발생하는 이상현상 세 가지는 다음과 같습니다.
학번(PK) | 이름 | 강의 |
---|---|---|
2501 | 김자바 | 데이터베이스 |
2502 | 박디비 | 데이터베이스 |
2503 | 이도커 | 운영체제 |
삭제이상
삭제이상
은 특정 데이터를 삭제하기 위해서는 다른 삭제할 필요가 없는 데이터까지도 삭제해야하는 문제.
2051 김자바
학생이 데이터베이스 수강신청을 취소하여 DELETE를 수행할 때, '데이터베이스'라는 값만 삭제되는 것이 아닌 학번, 이름에 대한 정보까지 삭제가 됩니다.
삽입이상
삽입이상
은 레코드 삽입 과정에서 NULL과 같은 값을 저장해야하는 문제.
만약 김자바 학생이 등록은 했지만 수강신청을 하지 않았을 경우, 강의 데이터에는 NULL 혹은 다른 불필요한 더미 값이 있어야지만 INSERT 연산이 가능합니다. 특히 NULL 값 삽입의 경우, NULL은 다른 자료형과 연산 방식이 다르기 때문에 주의해야합니다.
수정이상
수정이상
은 레코드를 수정할 때 동일한 데이터가 중복 저장된 모든 레코드들을 찾아서 일일이 수정하지 않으면 데이터 불일치가 발생하는 문제.
'데이터베이스'과목이 'DB 설계'라는 과목명으로 바뀐다면 '데이터베이스'라는 데이터를 가진 모든 행을 찾아서 일일이 강의명을 DB 설계로 변경해주어야합니다.
정규화
를 수행하기에 앞서 함수 종속성 FD, Functional Dependency
에 대해 알고 넘어가야합니다.
함수 종속성
은 릴레이션에서 속성 집합 X, Y에 대해 X가 Y를 결정한다
라고 할 때 X -> Y
라고 표기합니다.
이때 속성
X
는결정자 determinant
, 속성Y
는종속 속성 dependent attribute
라고 합니다.
학번(PK) | 이름 | 강의 | 강의실 |
---|---|---|---|
2501 | 김자바 | 데이터베이스 | 101 |
2502 | 박디비 | 데이터베이스 | 101 |
2503 | 이도커 | 운영체제 | 105 |
예를들어 위 테이블에서 '데이터베이스' 강의는 강의실 101호에서 열립니다. 그렇기 때문에 강좌 이름만 알고있다면 강의실 데이터엔 어떤 값이 오는 지 알 수 있습니다.(강의 -> 강의실
) 마찬가지로 학번을 알면 학생 이름도 알 수 있는 관계입니다. (학번 -> 이름
)
반면 강의만을 보고 학생 이름을 알 수는 없는 것과 같이 종속하지 않은 관계 또한 존재하고 있습니다.
구분 | 설명 | 표기 예시 |
---|---|---|
자명 종속성 (Trivial FD) | Y ⊆ X 일 때 성립 (항상 참) | {학번, 이름} → 이름 |
비자명 종속성 (Non-trivial FD) | Y ⊄ X 일 때 성립 | 학번 → 이름 학번 → 강의 학번 → 강의실 강의 → 강의실 |
완전 함수 종속성 (Full FD) | X가 최소 결정자일 때 (어떤 속성을 제거하면 종속이 깨짐) | 학번 → (이름, 강의, 강의실) |
부분 함수 종속성 (Partial FD) | X의 일부 속성만으로도 Y 결정 가능 | 해당 테이블은 기본 키가 단일 속성(학번)이라 부분 종속 없음 |
이행적 종속성 (Transitive FD) | X → Y, Y → Z 이면 X → Z | 학번 → 강의 및 강의 → 강의실 ⇒ 학번 → 강의실 |
부분 함수 종속성을 위한 추가 표기 예시
학번(PK1) 강의코드(PK2) 이름 강의 성적 2501 CS01 김자바 데이터베이스 A 2501 CS02 김자바 운영체제 B 2502 CS01 박디비 데이터베이스 B+ 2503 CS03 이도커 컴퓨터네트워크 A–
- 학번 → 이름
- 강의코드 → 강의
두 개의 부분 함수 종속성이 존재합니다. 기본키가 복합키이고, 키의 일부인 학번으로는 이름을, 강의 코드로는 강의 데이터가 결정됩니다.
대부분 이상현상의 발생 원인은 하나의 릴레이션에 두 개 이상의 정보를 담고 있기 때문입니다. 아까 예시에서 학생 릴레이션에 학생 정보와 수강신청 정보를 담았더니 여러 문제가 발생했었죠?
이처럼 이상현상을 제거하기 위해서는 릴레이션을 분해하게 되고, 릴레이션을 분해하여 이상현상을 없애는 과정을 정규화 Normalization
이라고 부릅니다.
정규화
는 함수 종속성 유형에 따라서 여러 단계로 나누어 차례대로 수행합니다. 정규화
의 단계를 정리해보면 다음과 같습니다.
정규형 | 요구 조건 | 해결 대상 이상 현상 |
---|---|---|
제1정규형 (1NF) | 모든 속성이 원자값(Atomic Value)을 가져야 함 | 반복 그룹·다중 값 삽입 이상 |
제2정규형 (2NF) | 1NF + 부분 함수 종속성(Partial FD) 제거 | 복합 키의 일부 종속으로 인한 삽입/삭제 이상 |
제3정규형 (3NF) | 2NF + 이행적 함수 종속성(Transitive FD) 제거 | 이행 종속으로 인한 수정 이상 |
BCNF (Boyce–Codd NF) | 모든 비자명 종속성(Non-trivial FD) 의 결정자가 슈퍼키여야 함 | 3NF에서 여전히 남는 결정자 이상 |
제4정규형 (4NF) | BCNF + 다치 종속성(Multi-valued Dependency) 제거 | 다치 종속으로 인한 중복 |
제5정규형 (5NF) | 4NF + 조인 종속성(Join Dependency) 제거 | 조인 시 정보 손실 방지 |
정규형이 높아질수록 이상현상이 줄어듭니다.
제 1정규형
단계에서는 다음과 같이 속성 값들을 원자형 값으로 만들어줍니다.
정규화 이전
이름 취미 김자바 프로그래밍, 음악 감상 박디비 축구 정규화 이후
이름 취미 김자바 프로그래밍 김자바 음악 감상 박디비 축구
제 2정규형
은 부분 함수 종속성을 제거하는 단계로 릴레이션의 기본키가 복합키인 경우 복합키의 일부분이 다른 속성의 결정자가 되는지를 판단합니다.
만약 다른 속성의 결정자가 된다면 복합키를 각각 기본키로 갖는 릴레이션들로 분해합니다.
부분 함수 종속성 예시에서
- 학번 → 이름
- 강의코드 → 강의
위와같은 부분 함수 종속성이 나왔는데 이들을 기준으로학생[학번, 이름], 강의[강의코드, 강의]
두 가지의 릴레이션으로 분해합니다.
제 3정규형
은 이행적 종속성을 제거합니다.
학번(PK) 이름 강의 강의실 2501 김자바 데이터베이스 101 2502 박디비 데이터베이스 101 2503 이도커 운영체제 105
학번 -> 강의, 강의 -> 강의실
함수 종속성이 결합되어 이행적 종속성이 성립됩니다.이를 분해하기 위해 키가 아닌 속성인
강의실
이 다른 키가 아닌 속성강의
에 의해 결정되지 않도록학생[학번, 강의 코드(FK), 이름], 강의[강의코드, 강의]
로 분해합니다.
BCNF
단계는 비자명 함수 종속 X->Y
에서 X
는 반드시 슈퍼키
가 되도록 합니다. 제 3정규형 단계 이후 모든 결정자가 슈퍼키가 되도록 릴레이션을 분해합니다.
제 4정규형
은 다치 종속성
을 제거하는 단계입니다.
다치 종속성
은 한 속성 X
값에 대해 속성 Y, Z
가 독립적으로 다중값을 갖는 것을 의미합니다.
다중값을 갖는 속성을 별개의 릴레이션으로 분해합니다.
제 5정규형
은 조인 종속성
을 제거하는 단계입니다.
조인 종속성
은 분해된 릴레이션에 JOIN
을 수행했을 때 원래 릴레이션을 완벽하게 복원하지 못하는 경우를 의미합니다.
더 작게 분해하여 JOIN
시 릴레이션이 완벽하게 조인되도록 보장하게 만들어줍니다.
대부분의 릴레이션은
BCNF
단계까지 수행한다면 이상현상이 발생하지 않게 됩니다.
모든 단계에서 분해된 릴레이션을 JOIN
했을 때 반드시 원래 릴레이션으로 복원되어야합니다. 그러기 위해서는 분해된 릴레이션들에 관계 유지를 위해 공통 속성을 한 개 이상 두어야하고, 이 공통 속성을 기준으로 JOIN
을 하게 됩니다.
공통 속성은 무손실 분해 판정 조건에 따라 결정해야 무손실 분해가 발생하게 됩니다.
(R₁ ∩ R₂) → R₁
에서 R₁의 키이거나 또는 (R₁ ∩ R₂) → R₂
에서 R₂의 키가 공통 속성으로 오는 경우에만 무손실 분해가 성립하게 됩니다.
제 5정규형은 무손실 분해를 유지하면서
조인 종속성
을 기반으로 분해를 수행하는 것이기 때문에 무손실 분해와는 차이가 있습니다.