본문 바로가기
프로그래밍/컴알못 공부

컴알못의 데이터베이스 공부 (정규화)

by Lihano 2022. 1. 7.
반응형

정규화

필요성

데이터베이스의 하나의 통합된 스키마를 설계하는 것을 데이터베이스 설계라고 합니다.

정규화는 올바른 스키마를 정의하기 위한 방법입니다.

 

잘못된 데이터베이스를 설계하면 이상현상이라는 부작용이 발생할 수 있습니다.

이상현상이란 대부분 데이터 중복으로 발생하는 데이터베이스 오류입니다.

여러 종류의 이상현상이 존재합니다.

  1. 삽입 이상 : 데이터를 삽입하기 위해 불필요한 데이터를 입력하는 경우를 말합니다. 기본키에 대한 정의를 잘못해서, 기본키에 대한 정보가 없는 상황에 데이터를 추가하기 위해 NULL값이 허용되지 않는 기본키에 아무런 정보나 마구 써넣는 경우도 여기에 해당됩니다.
  2. 갱신 이상 : 데이터를 갱신했는데 중복된 데이터가 많아서 데이터의 일부만 갱신되고 일관성이 깨지는 현상을 말합니다. 예를 들어 내 이름이 들어간 튜플이 몇백개인데 내 이름을 수정할 때 몇백개나 되는 튜플에 수정사항이 전부 적용되지 않았을 경우를 예로 들 수 있겠네요.
  3. 삭제 이상 : 어떤 튜플을 삭제할 때 의도하지 않았던 데이터까지 지워버리는 경우를 말합니다. 제 개인 정보가 들어간 튜플에 제 학교의 지역과 전화번호 정보도 함께 들어있는데, 제 개인정보를 삭제한 후 제 학교의 정보에 어디에도 접근하지 못하는 경우가 여기에 해당할 수 있을 것 같습니다.

릴레이션이란 연관있는 속성들의 집합입니다.

릴레이션 안에 포함될 속성들을 잘 선택하지 않으면 중복성이 발생하여 심각한 문제를 초래할 수도 있습니다.

중요한 건 릴레이션을 어떻게 나누느냐입니다. 이상현상은 하나의 릴레이션에 너무 많은 정보를 표현하려고 할 때 발생하거든요.

즉, 정규화란 릴레이션을 분해하는 작업입니다.

 

함수종속성

릴레이션 안의 연관성을 분석할 수 있는 척도가 함수 종속성입니다.

함수종속성이란 같은 릴레이션 안에 하나의 속성값이 다른 속성값을 결정하는 종속 관계를 의미합니다.

예를 들어, 어떤 릴레이션의 스키마가 {학번, 이름, 주소, 학년, 성별}이라면 이름, 주소, 학년, 성별은 학번에 좌지우지되는 속성들입니다.

학번이 같다면 이름, 주소, 학년, 성별도 당연히 같을테니까요.

이렇게 학번을 통해서 다른 속성들을 결정할 수 있습니다.

학번 → (이름, 주소, 학년, 성별)

이처럼 유일성을 가진 기본키는 다른 속성들을 결정하므로 결정자가 됩니다.

그리고 결정되는 나머지 속성들은 종속자가 됩니다.

※ 종속관계는 A 값에 의해서 B의 값이 오직 하나만 대응될 때를 의미합니다. A 속성이 1일 때 B의 값이 10일 수도 100일 수도 있다면 이건 종속 관계가 아닙니다.

 

완전함수종속

기본키인 결정자가 그룹일 때, 결정자의 모든 속성을 통해야만 다른 속성이 결정될 때 완전함수종속이라고 합니다. 물론, 결정자가 단일 속성이라면 자동적으로 완전함수종속입니다.

부분함수종속

결정자가 그룹일 때 하나의 속성이 결정자 그룹의 일분 속성을 통해서도 결정 가능할 때 이를 부분함수종속이라고합니다.

(학번, 과목번호) → (학점, 성별, 강의교수)
학번 → 성별
과목번호 → 강의교수

 

함수 종속성은 데이터베이스가 항상 유지해야하는 필수 조건입니다.

 

정규형의 종류

정규화란 릴레이션의 분해과정입니다.

릴레이션 내의 함수 종속성이 없는 속성들을 분리하여 별도의 릴레이션으로 해체하는 과정입니다.

 

정규화는 여러 단계를 거쳐 진행됩니다.

정규형이란 정규화 과정에 릴레이션이 만족해야하는 특별한 조건을 말합니다.

어느 단계의 정규형이 요구하는 충족 조건을 만족하면 그 릴레이션은 해당 수준의 정규형을 충족함을 의미합니다.

정규형은 5단계까지 있으며, 대부분의 경우는 3단계를 만족을 하면 충분한 정규화가 이루어졌다고 봅니다.

 

제1정규형

가장 낮은 수준의 정규형입니다.

어떤 릴레이션 R에 속한 모든 속성의 도메인이 원자값만을 갖는다면  제1정규형(1NF)에 속합니다.

 데이터베이스는 모든 속성이 원자값을 가져야하므로, 정상적인 데이터베이스라면 당연히 제1정규형은 충족한셈입니다.

 

하나의 샘플을 가져왔습니다.

(학번, 과목번호, 학점, 학년, 학과, 학과장)

어느 릴레이션의 속성들의 리스트입니다.

기본키는 (학번과 과목번호)의 그룹입니다.

 

함수 종속성을 살펴보면 다음과 같습니다.

(학번, 과목번호) → 학점
학번 → 학년
과목번호 → 학과
과목번호 → 학과장
과목개설학과 → 학과장

보면 너무 많은 함수종속성이 존재함을 알 수 있습니다.

이렇게 함수종속성이 많다면 위에서 언급한 이상현상을 야기할 수도 있습니다.

그렇기 때문에 정규화를 더 진행하여 함수종속성을 제거해주어야합니다.

그 어떤 정보의 손실도 없이 릴레이션을 분해하는 것을 무손실 분해라고 합니다.

이렇게 분해된 릴레이션은 조인을 통해서 얼마든지 복원가능해야합니다.

조인을 통해서 복원해야하니까 분해할 때는 결정자를 공통속성으로 포함해서 분해해야합니다.

그래야 나중에 외래키로 결합가능해요.

 

제2정규형

제1정규형보다 한단계 높은 수준의 정규형입니다.

어떤 릴레이션 R이 제1정규형이고 기본키에 속하지 않는 모든 속성이 기본키에 완전 함수 종속이면 제2정규형에 속합니다.

부분함수종속을 제거하는 것 같네요.

즉, 기본키의 일부 속성이 결정자인지를 검사하며, 기본키가 단일 속성이라면 당연히 제2정규형입니다.

("학번" "과목번호" 학점)
("학번" 학년)
("과목번호" 학과 학과장)

제2정규형에 따라 분해한 결과입니다.

하지만 여전히 문제는 존재합니다.

세번째 릴레이션의 함수 종속성을 분석해보면 다음과 같습니다.

과목번호 → 학과
과목번호 → 학과장
학과 → 학과장

이처럼 기본키 이외의 결정자가 존재합니다.

이와 같은 경우를 이행적 함수 종속성이라고 합니다.

이 역시 데이터베이스의 이상현상을 야기할 위험을 내포하고 있습니다.

 

제3정규형

제3정규형은, 어떤 릴레이션 R이 제2정규형이며 기본키에 속하지 않는 모든 속성이 기본키에 이행적 함수 종속이 아니면 제3정규형에 속합니다.

즉, 제3정규형은 기본키가 아닌 일반 속성이 결정자여선 안됩니다.

이를 토대로 분해한다면 다음과 같이 분해해야겠군요.

("학번" "과목번호" 학점)
("학번" 학년)
("과목번호" 학과)
("학과" 학과장)

대부분의 데이터베이스가 여기까지 정규형을 만족시킵니다.

하지만 다음과 같은 경우를 생각해봅시다.

("학번" "과목번호" 학점 교수)

이런 경우 위 속성들의 족송성은 다음과 같습니다.

(학번, 과목번호) → 학점
(학번, 과목번호) → 교수
교수 → 과목번호

이런 경우의  종속성이 존재한다고 하면 이건 제3정규형을 만족하기는 합니다.

과목당 담당하는 교수는 여러명이지만 교수는 한과목만 담당한다는 제약을 설정했기 때문입니다.

문제는 종속자인 일반속성이 기본키의 일부 속성을 결정한다는 겁니다.

드문 경우지만 이런 경우가 발생한다면 이상현상이 발생할 수도 있습니다.

 

보이스코드정규형

위에서 언급한 제3정규형의 문제를 보완하기 위한게 보이스코드정규형입니다.

그래서 강한 제3정규형이라고도 부릅니다.

릴레이션 R의 모든 결정자가 후보키이면 릴레이션 R은 보이스코드 정규형에 속합니다.

기본키 속성이 기본키 속성이 아닌 일반 속성에 종속적일 때 보이스코드정규형에 위배됩니다.

 모든 결정자를 후보키로 만들어야합니다.

("학번" "교수" 학점)
("교수" 과목번호)

그렇다면 이런 식으로 분리가 가능할 것 같습니다.

제4정규형

결정자가 특정 속성 값 하나가 아니라 여러 개의 값 집합을 결정하는 다치 종속성을 제거합니다.

BCNF를 만족하는 릴레이션 R에 대해서 함수 종속이 아닌 다치 종속성을 제거하면 제4정규형에 속합니다.

 

제5정규형

제4정규형을 만족하는 릴레이션 R에 대해서 후보키를 통한 조인종속만 가능하다면 제5정규형에 속합니다.

 

 

반응형

댓글