임용/데이터베이스

Chapter 07 데이터 종속성과 정규화

뚜비히히 2023. 4. 18. 19:01

7.1 데이터의 논리적 표현

  • 각 릴레이션은 어떤 애트리뷰트들로 구성해야 하는가를 결정하는 것이 곧 릴레이션 스키마(relation schema)의 설계가 된다.
  • 기본적으로 고려해야 될 사항에는 애트리뷰트들 사이에 존재하는 관계성(relationshiop), 즉 데이터 종속성(data dependency), 효율적인 데이터 처리, 그리고 데이터의 일관성 유지 등이 포함되어야 한다. 
  • 데이터 중복(data redundancy)은 데이터 관리상의 여러 가지 치명적이 문제를 야기시킨다. 이러한 곤란한 현상을 이상(anomaly)이라 하는데 특별히 릴레이션의 데이터 값을 변경하려 할 때 이 현상이 일어나게 된다.

수강 릴레이션

(1) 삭제 이상

  • 만일 학번 200인 학생이 과목 'C123'의 등록을 취소한다고 하자. 자연히 학번 200인 튜플에서 과목 번호 C123을 삭제해야 되는데 과목 번호는 기본 키 값의 일부이기 때문에 과목 번호만 삭제하지 못하고 튜플 전체를 삭제해야 된다. 그러면 결과적으로 이 튜플이 삭제될 때 이 학생이 3학년이라는 정보까지도 함께 삭제될 것이다. 왜냐하면 이 튜플은 이 학생의 학년 정보를 가지고 있는 유일한 튜플이기 때문이다. 
  • 한 튜플을 삭제함으로써 유지해야 될 정보까지도 삭제되는 연쇄 삭제(triggered deletion) 현상이 일어나게 되어 정보 손실(loss of information)이 발생하게 되는데 이러한 현상을 삭제 이상(deletion anomaly)이라고 한다. 

(2) 삽입 이상

  • 만일 새로 전입한 학생에 대해 학번이 600이고 학년이 2라는 사실만을 이 릴레이션에 삽입하려 한다고 하자. 그러나 이 학생이 최소한 하나의 과목을 등록하지 않는 한 이 삽입은 성공할 수 없다. 왜냐하면 학번과 과목 번호는 이 릴레이션의 기본 키인데 과목 번호 값이 없으면 키 값이 널이 되는 튜플을 삽입하는 것이 되어 허용되지 않기 때문이다. 
  • 데이터를 삽입하려고 할 때 불필요하고 원하지 않는 데이터도 함께 삽입해야만 되고 그렇지 않으면 삽입이 되지 않는 현상을 삽입 이상(insertion anomaly)이라 한다. 

(3) 갱신 이상

  • 학번 400인 학생의 학년을 4에서 3으로 변경시킨다고 하자. 이 변경을 위해서는 이 릴레이션에 학번 400이 나타나 있는 튜플 4개에 대해 학년의 값을 전부 갱신시켜야 한다. 만일 일부 튜플만 변경시킨다면 학번 400인 학생의 학년은 3과 4, 즉 두 가지 값을 갖게 되어 일관성이 없게 된다.
  • 중복된 튜플에서 일부 튜플의 애트리뷰트 값만을 갱신시킴으로써 정보의 모순성(inconsistency)이 생기는 현상갱신 이상(update anomaly)이라 한다. 

 

  • 애트리뷰트 간에 존재하는 여러 가지 데이터 종속 관계를 무리하게 하나의 릴레이션으로 표현하려는 데서 이상들이 발생하게 된 것이다.
  • 이상 문제의 해결은 이러한 애트리뷰트들 간의 종속성(dependency)을 분석해서 하나의 릴레이션에는 기본적으로 하나의 종속성이 표현되도록 분해하면된다. 이러한 분해(decomposition) 과정을 정규화(normalization)라 한다. 

 

스키마 설계

  • 애트리뷰트를 수집합고 이들 간에 존재하는 제약조건(데이터 종속성)을 식별한 다음에
  • 이 제약조건을 기본으로 해서 애트리뷰트들을 릴레이션으로 그룹 짓는 것이다.
  • 이 과정에서 만들어진 릴레이션들도 보다 바람직한 형태의 릴레이션으로 다시 변환시킬 수 있는데 이것을 스키마 변환(schema transformation)이라 한다.

스키마 변환은 다음과 같은 세 가지 원리에 기초를 두고 있다.

  1. 정보 표현의 무손실(nonloss representation of information)이다. 하나의 스키마에서 다른 스키마로 변환시킬 때 정보의 손실이 있어서는 안 된다. 즉, 변환된 스키마가 표현하는 정보는 기본적으로 변환되기 전 스키마가 표현하는 정보를 모두 포함하고 있어야 된다. 거기에다 구조상으로는 더 바람직한 형태가 되어야 한다. 
  2. 최소의 데이터 중복성(minimal data redundancy)이 허용되어야 한다. 이것은 앞에서 본 바와 같이 중복으로 인한 여러 가지 이상을 제거할 수 있기 때문이다.
  3. 분리의 법칙(principle of separation)이다. 하나의 독립된 관계성은 별도의 릴레이션으로 분리시켜 표현한다는 것이다. 이것은 릴레이션들을 독립적으로 처리할 수 있게 해주는 기초가 된다.

7.2 함수 종속 

  • 함수 종속(FD) : 어떤 릴레이션 R에서 X와 Y를 각각 R의 애트리뷰트 집합의 부분 집합이라 하자. 애트리뷰트 X의 값 각각에 대해 시간에 관계없이 항상 애트리뷰트 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수 종속이라 하고, X →Y로 표기한다. 
  • X가 만일 어떤 릴레이션 R의 후보 키, 특히 기본 키라면 릴레이션 R의 모든 애트리뷰트 Y는 반드시 X에 함수종속이어야 한다. 
  • 함수 종속(X→Y)의 정의 자체는 애트리뷰트 X가 반드시 릴레이션 R의 후보 키가 되어야 한다는 것을 욕ㄴ으로 하고 있지는 않다. 
  • X→Y의 관계를 성립시키는 X를 결정자(determinant)라 하고 Y를 종속자(dependent)라고도 한다.

수강 릴레이션의 함수 종속 다이어그램

 이 다이어그램이 표현하는 것과 같이 수강 릴레이션은 다음과 같은 두 개의 함수 종속을 가지고 있다.

{학번, 과목번호} → 성적
학번 → 학년

즉, 성적 애트리뷰트는 {학번, 과목번호} 애트리뷰트에 함수 종속이 되고 학년 애트리뷰트 학번 애트리뷰트에만 함수 종속되어 있다. 물론 학년 애트리뷰트가 {학번, 과목번호} 애트리뷰트에 종속되는 것은 당연하다. 

{학번, 과목번호} → 학년
  • 이러한 경우에 성적 애트리뷰트는 {학번, 과목번호} 애트리뷰트에 완전 함수 종속(full functional dependency)이라고 한다.
    • 완전함수종속 : X'⊂X이고 X'→Y가 성립되는 애트리뷰트 X'이 존재하지 않는 경우
  • 반면에 학년 애트리뷰트는 학번 애트리뷰트에는 완전 함수 종속이지만 {학번, 과목번호} 애트리뷰트에는 완전 함수 종속이 아니라 부분 함수 종속(partial functional dependency)이라고 한다.
    • 부분함수종속 : X'⊂X이고 X'→Y가 애트리뷰트 X'이 존재하는 경우
  • 일반적으로 릴레이션 R의 어떤 애트리뷰트 Y가 다른 애트리뷰트 X에 함수 종속이면서 X의 진부분 집합에는 함수 종속이 아닐 때 Y는 X의 완전 함수 종속이라고 한다. 

추론 규칙(inference rule) 성립

R1 : (반사 규칙)     A ⊇ B이면 A → B이고 A → A이다.

R2 : (첨가 규칙)     A → B이면 AC → BC이고 AC → B이다.

R3 : (이행 규칙)     A → B이고 B → C이면 A → c이다.

R4 : (분해 규칙)     A → BC이면 A → B, A → C이다. 

R5 : (결합 규칙)     A → B이고 A → C이면 A → BC이다.


7.3 기본 정규형

  • 정규형(Normal Form)
    • 어떤 일련의 제약조건을 만족하는 릴레이션
    • 정규화, 즉 스키마 변환(S → S')으로 정규형을 만듦 

7.3.1 제1정규형(1NF : First Normal Form)

  • 제1정규형(1NF) : 어떤 릴레이션 R에 속한 모든 도메인 원자 값(atomic value)만으로 되어 있다면 제1정규형(1NF)에 속한다. 
  • 다음과 같은 수강지도 릴레이션이 있다고 가정하자.
수강지도(학번, 지도교수, 학과, 과목번호, 성적)
                       기본 키 : {학번, 과목번호}

이 수강지도의 릴레이션의 제약조건, 즉 함수 종속 다이어그램은 아래와 같고, 기본 키는 {학번, 과목번호} 애트리뷰트로 명세되어 있다고 하자. 

{학번, 과목번호}    →  성적
                   학번    →  지도교수
                   학번    → 학과
            지도교수    → 학과
수강지도 릴레이션의 함수 종속 다이어그램

           수강지도 릴레이션의 함수 종속 다이어그램

 

수강지도 릴레이션

(1) 삽입 이상

  • 이 수강지도 릴레이션에서는 어느 특정 학생이 어떤 교과목을 등록할 때까지 그 학생의 지도교수가 누구라는 사실을 삽입할 수 없다. 
  • 수강지도 릴레이션에서 학번이 500인 학생의 지도교수가 P4라는 사실만은 삽입할 수 없다. 왜냐하면 학번이 500인 학생이 어떤 교과목을 등록하지 않으면 기본 키에(여기서는 {학번, 과목번호})가 널이 되는데, 이와 같은 상황은 개체 무결성 제약에 허용되지 않기 때문이다.

(2) 삭제 이상

  • 만일 학번 200인 학생이 교과목 C123만을 등록하여 튜플이 하나만 있는 상황에서 교과목 C123의 등록을 취소하면 이 튜플이 삭제되게 된다. 이렇게 되면 학생의 지도교수가 P2라는 정보까지도 잃어버리게 된다. 그러나 문제는 이 정보까지 삭제하려고 한 것이 아니라는 것이다.

(3) 갱신 이상

  • 수강지도 릴레이션에서는 어떤 학생에 대한 지도교수 애트리뷰트 값이 여러 번 중복되게 되는데, 이것은 바로 갱신 문제의 원인이 된다. 
  • 학번이 400인 학생의 지도교수가 P1에서 P3로 변경된다면, 학생 400이 나타난 모든 튜플을 찾아 거기에 해당하는 지도교수 데이터 값을 P3으로 변경해 주어야 한다. 그렇지 않을 경우, 즉 일부만 변경되면 학번 400인 학생의 지도교수가 P1과 P3, 즉 둘이 되어 데이터의 일관성이 없게 된다.

 

  • 이러한 문제가 발생하는 원인을 분석해 보면 수강지도 릴레이션에서 키가 아닌 애트리뷰트들이 기본 키에 완전 함수 종속되지 못하고 부분 함수 종속이 되어 있기 때문이다. 
  • 따라서 이러한 문제들에 대한 해결은 수강지도 릴레이션을 다음과 같은 두 개의 릴레이션으로 분할하여 부분 함수 종속을 제거하는 것이다. 
지도(학번, 지도교수, 학과)
             기본 키 : {학번}
수강(학번, 과목번호, 성적)
             기본 키 : {학번, 과목번호}
             외래 키 : {학번}  참조 : 지도

지도 릴레이션과 수강 릴레이션의 함수 종속 다이어그램
지도 릴레이션과 수강 릴레이션


7.3.2 제2정규형(2NF : Second Normal Form)

  • 제2정규형(2NF) : 어떤 릴레이션 R이 1NF이고 키(기본)에 속하지 않는 애트리뷰트 모두가 기본 키에 완전 함수 종속이면, 제2정규형(2NF)에 속한다. 
  • 주의할 점은 1NF이면서 2NF이 아닌 릴레이션은 언제나 올바른 프로젝션을 통해 의미상으로 동등한 두 개의 2NF의 릴레이션으로 분해할 수 있고, 또 이 분해된 2NF의 릴레이션들을 자연 조인(natural join)시키면 아무런 정보 손실 없이 다시 원래의 릴레이션으로 복귀된다는 점이다. 
  • 하나의 릴레이션을 아무런 정보 손실 없이 동등한 릴레이션들로 분해하는 것을 무손실 분해(nonloss decomposition)라고 한다. 

(1) 삽입 이상

  • 어떤 지도교수가 어떤 특정 학과에 속한다는 사실만을 삽입하려고 할 때, 이것을 지도 릴레이션에 삽입할 수는 없다.  즉 이 사실을 지도 릴레이션에 삽입하기 위해서는 이 지도교수의 지도를 받는 학생이 있어야 한다. 그렇지 않으면 기본 키가 널이 되는 문제가 생긴다.

(2) 삭제 이상

  • 어떤 학생이 지도교수 관계가 취소되어 튜플이 삭제되면 부수적으로 그 지도교수가 어떤 학과에 속해 있다고 하는 정보까지도 삭제될 수 있다. 즉, 지도 릴레이션에서 학번 300에 대한 튜플을 삭제하면 지도교수 P3가 컴퓨터학과에 속한다는 정보도 잃어버리게 된다.

(3) 갱신 이상

  • 어느 지도교수의 학과가 변경되면, 그 지도교수가 들어 있는 튜플의 학과 값을 변경시켜 주어야 한다. 즉, 지도교수 P1의 학과가 컴퓨터에서 전자로 바뀐다면 학번 100과 400에 있는 학과의 값을 모두 변경시켜 주어야 한다. 그렇지 않으면 지도교수 P1은 두 개의 상이한 학과 값을 갖게 되어 데이터 모순성(data inconsistency)이 발생하게 된다.
     
  • 두 개의 상이한 정보(종속성)를 하나의 릴레이션으로 혼합해서 표현하려고 하는 데서 발생한 것이라는 것을 알 수 있다. 
  • 따라서 문제의 해결은 이 이행적 함수 종속을 제거하여 두 개의 릴레이션으로 분해하는 것이다. 
학생지도(학번, 지도교수) 
                기본 키 : {학번}
                외래 키 : {지도교수}  참조 : 지도교수학과

 지도교수학과(지도교수, 학과)
                        기본 키 : {지도교수}

학생지도 릴레이션과 지도교수학과 릴레이션의 함수 종속 다이어그램
학생지도 릴레이션과 지도교수학과 릴레이션

  • 애트리뷰트 A를 키로 가진 릴레이션에서 이행적 함수 종속 A → B, B → C이고 A → C가 성립할 때는 {A, B}, {B, C}로 분해하는 것이 올바른 분해가 된다.

7.3.3 제3정규형(3NF : Third Normal Form)

  • 제3정규형(3NF) : 어떤 릴레이션 R이 2NF이고 기본 키에 속하지 않은 모든 애트리뷰트들이 기본 키에 이행적 함수 종속이 아닐 때 제3정규형(3NF)에 속한다.
  • 키가 아닌 애트리뷰트 값의 갱신 시 불필요한 부작용(이상)은 발생하지 않는다. 
  • 모든 이원 릴레이션은 3NF에 속한다.

7.3.4 보이스/코드 정규형

3NF의 약점

  1. 복수의 후보 키를 가지고 있고
  2. 후보 키들이 두개 이상의 애트리뷰트들로 구성되고
  3. 후보 키의 애트리뷰트가 서로 중첩되는 경우에는 적용할 수가 없다.
  • 일반적인 경우에도 적용할 수 있는 보이스/코드 정규형(Boyce/Codd Normal Form : BCNF)이 제안되었다. 
  • BCNF에 속하는 릴레이션은 모두 제3정규형에 속하지만, 역으로 제3정규형에 속하는 릴레이션이 모두 BCNF에 속하지 않는다. 
  • BCNF를 "강한 제3정규형(Strong 3NF)"이라고 한다.
    • 보이스/코드 정규형(BCNF) : 릴레이션 R의 결정자(determinant)가 모두 후보 키(candidate key)이면 릴레이션 R은 보이스/코드 정규형(BCNF)에 속한다. 

수강과목 릴레이션(기본 키 : {학번, 과목})

  • 수강과목 릴레이션은 어떤 학생이 어떤 교수가 가르치는 과목을 수강한다는 것을 나타내고 있다. 이 릴레이션에서 유지해야 할 조건은 다음과 같다고 하자.
    1. 각 과목에 대해 한 학생은 오직 한 교수의 강의만 수강한다. 
    2. 각 교수는 한 과목만 담당한다.
    3. 한 과목은 여러 교수가 담당할 수 있다.

수강과목 릴레이션의 함수 종속 다이어그램

  • 이 수강과목 릴레이션은 당연히 1NF이며 기본 키({학번, 과목})에 속하지 않으면서 키에 완전 종속이 아닌 애트리뷰트도 없고 또 이행 종속이 없으므로 2NF이면서 3NF이다. 그러나 BCNF는 아니다. 왜냐하면 결정자 교수 애트리뷰트가 후보 키로 취급되고 있지 않기 때문이다. 

(1) 삽입 이상

교수 P5가 자료 구조를 담당하게 되었을 때 이 사실만을 삽입할 수 없다. 이를 위해서는 적어도 수강 학생이 한 사람 있어야 가능하다.

 

(2) 삭제 이상

학번이 100인 학생이 자료 구조 과목을 취소하여 튜플이 삭제된다면 이때 교수 P2가 자료 구조 과목을 담당하고 있다는 정보마저 없어져 버리게 된다. 왜냐하면 교수 P2가 자료 구조를 담당하고 있다는 사실을 표현하고 있는 튜플은 이것 하나이기 때문이다. 

 

(3) 갱신 이상

교수 P1의 담당과목이 프로그래밍에서 자료 구조로 변경되었다면 이 릴레이션에서 P1이 나타나 있는 모든 튜플에 대해 자료 구조로 변경해 주어야 한다. 그렇지 않으면 사실과 달리 P1이 담당하는 과목이 두개가 되어 데이터의 모순이 발생한다. 

 

  • 이와 같은 변경 이상의 원인은 사실상 교수 애트리뷰트가 결정자이지만 후보 키로 취급되고 있지 않다는데 있다.
  • 따라서 이 문제의 해결은 프로젝션을 통해 다음과 같이 수강교수 릴레이션과 과목교수 릴레이션으로 분해하는 것이다. 
수강교수(학번, 교수)
               기본 키 : {학번, 교수}
               외래 키 : {교수}  참조 : 과목교수
 
 과목교수(교수, 과목)
                기본 키 : {교수}

수강교수 릴레이션과 과목교수 릴레이션 및 그 함수 종속 다이어그램


7.4 고급 정규형

7.4.1 제4정규형

CPT 릴레이션

  • 데이터베이스 과목을 새로운 교수 P4가 담당하게 되었다는 사실을 삽입하려 한다면, 데이터베이스 교재 T3, T4, T5에 대해 각각 튜플 하나씩 모두 3개의 새로운 튜플을 삽입해야만 하는 문제가 생긴다. 
  • 그럼에도 불구하고 이 CPT 릴레이션은 BCNF에 속한다. 왜냐하면 이 릴레이션의 키는 모든 애트리뷰트를 포함한 {과목, 교수, 교재}가 되어 이 외에는 어떤 결저자 애트리뷰트도 없기 때문이다.
  • 이 BCNF엥 속하는 CPT 릴레이션에서 발생되는 갱신 이상을 분석해 보면 사실상 교수와 교재가 서로 무관한 것을 한 릴레이션으로 묶어서 표현한 데 원인이 있다는 것을 알 수 있다. 직관적으로 이 CPT 릴레이션에서 일어나는 문제는 아래의 릴레이션과 같이 과목교수(과목, 교수) 릴레이션과 과목교재(과목, 교재) 릴레이션으로 분해하면 모두 해결된다. 

과목교수 릴레이션과 과목교재 릴레이션

  • 두 프로젝션으로 만들어진 릴레이션은 모두 BCNF엥 속한다. 또한 과목교수 릴레이션과 과목교재 릴레이션을 조인하면 원래의 CPT 릴레이션으로 복원될 수 있다. 따라서 이 분해는 무손실 분해이다.
  • CPT 릴레이션에는 함수 종속(FD)이 없기 때문에 이 분해의 기초는 종래의 함수 종속이 아니라 새로운 유형의 종속인 다치 종속(MVD : Multivalued Dependency)이다. 
    • 다치 종속(MVD) : A, B, C를 릴레이션 R의 애트리뷰트의 부분 집합이라 할 때 애트리뷰트 쌍(A, C)-값에 대응되는 B-값의 집합이 A-값에만 종속되고 C-값에만 독립이면 B는 A에 다치 종속(multivalued dependent)이라 하고 A->>B로 표기한다. 
    • [Fagin의 정리] : 릴레이션 R(A, B, C)에 MVD A->>B|C를 만족하는 A, B, C 애트리뷰트 부분 집합이 존재하기만 하면 두 프로젝션 R1(A, B)와 R2(A, C)는 무손실 분해이다.
    • 제4정규형(4NF) : 릴레이션 R에 MVD A->>B를 만족하는 애트리뷰트 부분 집합 A, B가 존재할 때의 R의 모든 애트리뷰트들이 이 A에 함수 종속(즉, R의 모든 애트리뷰트 X에 대해 A->X이고 A가 후보 키)이면 릴레이션 R은 제4정규형(4NF) 속한다. 
    • 릴레이션이 R이 BCNF에 속하고 모든 MVD가 함수 종속(FD)이면 릴레이션 R은 4NF에 속한다.

7.4.2 제5정규형

  • n개 이상의 릴레이션으로 분해해야만 정보 무손실 분해가 되는 릴레이션을 n-분해(n-decomposable) 릴레이션이라 한다.
  • 조인 종속(JD : Join Dependency) : 어떤 릴레이션 R의 애트리뷰트에 대한 n개의 부분 집합 A1, A2, ..., An이 있다고 하자. 이때 만일 이 릴레이션 R이 그의 프로젝션 A1, A2, ..., An을 모두 조인한 결과와 똑같게 된다면 R은 조인 종속 *(A1, A2, ..., An)을 만족시킨다고 한다.
  • 제5정규형(5NF) : 릴레이션 R에 존재하는 모든 조인 종속(JD)이 릴레이션 R의 후보 키를 통해서만 만족된다면 릴레이션 R은 제5정규형(5NF : Fifth Normal Form) 또는 PJ/NF(Projection-Join Normal Form)에 속한다. 

7.5 정규형 간의 관계

프로젝션 과정과 정규형