정규화

Bam·2025년 5월 10일
0

Database

목록 보기
33/39
post-thumbnail

이상현상

잘못 설계된 데이터베이스의 테이블에 데이터를 조작한다면 데이터 일관성이 훼손되는 현상이 발생합니다.

이렇게 테이블에 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)이름강의성적
2501CS01김자바데이터베이스A
2501CS02김자바운영체제B
2502CS01박디비데이터베이스B+
2503CS03이도커컴퓨터네트워크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정규형

제 1정규형 단계에서는 다음과 같이 속성 값들을 원자형 값으로 만들어줍니다.

정규화 이전

이름취미
김자바프로그래밍, 음악 감상
박디비축구

정규화 이후

이름취미
김자바프로그래밍
김자바음악 감상
박디비축구

제 2정규형

제 2정규형은 부분 함수 종속성을 제거하는 단계로 릴레이션의 기본키가 복합키인 경우 복합키의 일부분이 다른 속성의 결정자가 되는지를 판단합니다.

만약 다른 속성의 결정자가 된다면 복합키를 각각 기본키로 갖는 릴레이션들로 분해합니다.

부분 함수 종속성 예시에서

  • 학번 → 이름
  • 강의코드 → 강의
    위와같은 부분 함수 종속성이 나왔는데 이들을 기준으로 학생[학번, 이름], 강의[강의코드, 강의] 두 가지의 릴레이션으로 분해합니다.

제 3 정규형

제 3정규형은 이행적 종속성을 제거합니다.

학번(PK)이름강의강의실
2501김자바데이터베이스101
2502박디비데이터베이스101
2503이도커운영체제105

학번 -> 강의, 강의 -> 강의실 함수 종속성이 결합되어 이행적 종속성이 성립됩니다.

이를 분해하기 위해 키가 아닌 속성인 강의실이 다른 키가 아닌 속성 강의에 의해 결정되지 않도록 학생[학번, 강의 코드(FK), 이름], 강의[강의코드, 강의]로 분해합니다.

BCNF Boyce-Codd NF

BCNF 단계는 비자명 함수 종속 X->Y에서 X는 반드시 슈퍼키가 되도록 합니다. 제 3정규형 단계 이후 모든 결정자가 슈퍼키가 되도록 릴레이션을 분해합니다.

제 4정규형

제 4정규형다치 종속성을 제거하는 단계입니다.
다치 종속성은 한 속성 X 값에 대해 속성 Y, Z가 독립적으로 다중값을 갖는 것을 의미합니다.

다중값을 갖는 속성을 별개의 릴레이션으로 분해합니다.

제 5정규형

제 5정규형조인 종속성을 제거하는 단계입니다.
조인 종속성은 분해된 릴레이션에 JOIN을 수행했을 때 원래 릴레이션을 완벽하게 복원하지 못하는 경우를 의미합니다.

더 작게 분해하여 JOIN 시 릴레이션이 완벽하게 조인되도록 보장하게 만들어줍니다.

대부분의 릴레이션은 BCNF 단계까지 수행한다면 이상현상이 발생하지 않게 됩니다.

무손실 분해

모든 단계에서 분해된 릴레이션을 JOIN했을 때 반드시 원래 릴레이션으로 복원되어야합니다. 그러기 위해서는 분해된 릴레이션들에 관계 유지를 위해 공통 속성을 한 개 이상 두어야하고, 이 공통 속성을 기준으로 JOIN을 하게 됩니다.

공통 속성은 무손실 분해 판정 조건에 따라 결정해야 무손실 분해가 발생하게 됩니다.

(R₁ ∩ R₂) → R₁에서 R₁의 키이거나 또는 (R₁ ∩ R₂) → R₂에서 R₂의 키가 공통 속성으로 오는 경우에만 무손실 분해가 성립하게 됩니다.

제 5정규형은 무손실 분해를 유지하면서 조인 종속성을 기반으로 분해를 수행하는 것이기 때문에 무손실 분해와는 차이가 있습니다.

0개의 댓글