정규화(Normalization)

gang_shik·2022년 5월 17일
0

Database

목록 보기
5/9

정규화(Normalization)

  • 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 함

  • 정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것임

  • 정규화된 결과를 정규형이라고 하며, 정규형은 기본 정규형, 고급 정규형으로 나뉨

  • 기본 정규형 : 제 1 정규형, 제 2 정규형, 제 3 정규형, BCNF(보이스/코드 정규형)

  • 고급 정규형 : 제 4 정규형, 제 5 정규형

  • 정규화의 장점은 이상 현상의 발생 가능성을 줄이지만, 단점으로는 연산 시간이 증가함

제 1 정규형

  • 릴레이션에 속한 모든 속성의 도메인이 더 이상 분해되지 않는 원자값으로만 구성된 정규형임

  • 위의 릴레이션이 제 1 정규형으로 아래와 같이 변경됨

제 2 정규형

  • 릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형에 속함

  • 제 1 정규형에 속하는 릴레이션이 제 2 정규형을 만족하게 하려면, 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 거쳐야함

  • 완전 함수 종속 : 어떤 속성이 기본키에 대해 완전히 종속일 때

  • 부분 함수 종속 : 어떤 속성이 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는 속성 중 일부만 종속될 때

  • 위의 릴레이션에서 Manufacturer와 Model이 키가 되고, 이를 통해 Model Full Name을 알 수 있음

  • Manufacturer Country는 Manufacturer에 종속적이지만, Model과는 연관관계가 없어서 제 2 정규화 조건을 만족 못함(부분 함수 종속)

  • 그래서 이를 아래와 같이 릴레이션을 분리할 수 있음

  • 이러면 이제 각 릴레이션은 완전 함수적 종속 상태가 됨

제 3 정규형

  • 릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형에 속함

  • 이행적 함수 종속

    • A -> B, B -> C인 경우 A -> C가 성립될 때

    • 즉 A를 알면 B를 알고 그를 통해 C를 알 수 있는 경우를 의미

  • 위 릴레이션에서 Tournament와 Year가 기본키가 됨, Winner는 두 기본키로 구성된 복합키에 종속됨

  • 여기서 Winner Date of Birth는 기본키가 아닌 Winner에 종속됨

  • 이는 제 3 정규형을 위배하는 이행적 함수 종속이므로 이를 아래와 같이 분리할 수 있음

  • Winner Dates of Birth라는 독립된 릴레이션을 두어 Winner가 기본키가 되고 Date of Birth가 기본키에 의존하도록 제 3 정규형 조건을 만족함

BCNF

  • 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 BCNF에 속함

  • 하나의 릴레이션에 여러개의 후보키가 존재할 수도 있는데, 이런 경우는 제 3 정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있음, 이러한 이상현상을 해결하기 위해 제 3 정규형보다 좀 더 엄격한 제약조건을 제시한 것이 BCNF임

  • 위와 같이 제 3 정규형을 만족하여도 이상현상이 발생하는 경우가 있음

  • 이때 새로운 교수가 특정 과목을 담당할 때 새로운 정보를 추가할 때 적어도 한 명 이상의 수강 학생이 필요한 삽입 이상이 생기고

  • 학번 100이 C234 과목을 취소하면 P2가 C234 과목을 담당한다는 정보도 삭제되는 삭제 이상

  • 마지막으로 P1의 과목이 변경되면 P1인 행을 모두 찾아 변경시켜주어야 하는 갱신 이상이 나타남

  • 위와 같은 이상 현상이 발생하는 것은 결정자가 후보키로 취급되고 있지 않기 때문임

  • 여기서 결정자란 한 값이 다른 값을 고유하게 결정할 수 있게 하는 것을 의미하는데 여기서 그 결정자가 후보키가 아님을 의미함

  • 후보키는 슈퍼키 즉, 유일성을 만족하는 키 중 최소성을 갖는 키인데 위의 릴레이션에선 (학번,과목명), (학번,담당교수)가 후보키가 됨(담당교수만으로 후보키가 될 수 없음)

  • 하지만 후보키가 아님에도 과목명을 결정할 수 있기 때문에 담당 교수가 결정자에 속함

  • 그래서 이를 해결하기 위해서 모든 결정자는 후보키가 되도록 릴레이션을 아래와 같이 분해해서 BCNF를 만족할 수 있음

고급 정규형

  • 제 4 정규형 : 릴레이션이 BCNF를 만족하면서, 함수 종속이 아닌 다치 종속(MVD : Multi Valued Dependency)를 제거해야 만족할 수 있음

다치 종속?

다치 종속

다치 종속은 두 개의 독립된 속성이 1:N 관계로 대응하는 관계를 의미함

아래와 같이 하나의 회원번호에 주문도서가 하나가 아닌 상태를 다치 종속이라고 볼 수 있음

하지만 이로 인해 위의 테이블에서 회원번호와 이름이 중복되는 값이 만들어지는데 이것이 바로 다치 종속이 생겼다고 볼 수 있고 이를 제거하는 것이 제 4 정규형이라고 볼 수 있음

아래와 같이 제 4 정규형으로 두 개의 릴레이션으로 분리할 수 있음

  • 제 5 정규형 : 릴레이션이 제 4 정규형을 만족하면서 후보키를 통하지 않는 조인 종속(JD : Join Dependency)을 제거해야 만족할 수 있음

조인 종속?

조인 종속

조인 종속이란 하나의 릴레이션을 여러개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생겨지는 것을 말함

일례로 아래와 같은 관계가 있음

여기서 한 명의 개발자는 여러 언어를 가질 수 있고 하나의 언어는 여러 개발자에 속할 수 있음

그리고 하나의 자격증은 여러 개발자에 속할 수 있고 한 명의 개발자가 여러 자격증을 소지할 수 있음

마지막으로 하나의 언어는 여러 자격증에 속할 수 있고 하나의 자격증은 여러 언어를 가질 수 있는 상태임

여기서 잘못된 조인을 통해 조인 종속이 발생하면 아래와 같이 됨

여기선 개발자와 자격증, 개발자와 언어는 관계가 있지만 자격증과 언어는 관계가 없음, 이렇게 연관성이 없는 조인이 발생한 것임, 조인 종속이 발생함

이를 제거하고 처리하면 제 5 정규형이 됨 아래와 같이 위에서 말한 관계대로 개발자 & 자격증, 개발자 & 언어, 자격증 & 언어로 묶여서 조인을 해서 릴레이션을 구성해서 조인 종속을 제거함

  • 실제로 데이터베이스를 설계할 때 모든 릴레이션이 무조건 제 5 정규형에 속하도록 분해해야 하는 것은 아님, 오히려 그렇게 되면 비효율적인 경우가 많음

  • 일반적으로 제 3 정규형이나 BCNF에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상이 발생하는 문제를 해결한다고 함

profile
측정할 수 없으면 관리할 수 없고, 관리할 수 없으면 개선시킬 수도 없다

0개의 댓글