데이터베이스

Chap 7. 릴레이션 정규화

앞발로코딩 2023. 10. 19. 00:58

릴레이션 정규화

- 부주의한 데이터베이스 설계는 제어할 수 없는 데이터 중복을 야기하여 여러 가지 갱신 이상(update anomaly)을 유발함

- 정규화(normalization)는 주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석하여, 원래의 릴레이션을 분해함으로써 중복과 세 가지 갱신 이상을 최소화함 (수정 이상, 삽입 이상, 삭제 이상)

- 적절하게 정규화된 릴레이션들은 데이터베이스의 유지를 간단하게 함

 

7.1. 정규화 개요

좋은 관계 데이터베이스 스키마를 설계하는 목적

- 정보의 중복과 갱신 이상이 생기지 않도록 하고, 정보의 손실을 막으며, 실세계를 훌륭하게 나타내고, 애트리뷰트들 간의 관계가 잘 표현되는 것을 보장하며, 어떤 무결성 제약조건의 시행을 간단하게 하며, 아울러 효율성 측면도 고려하는 것

- 우선 갱신 이상 방지 후 효율성 고려

 

ER 데이터 모델 -> (고수준 스키마) -> 릴레이션들의 집합으로 사상 -> (함수적 종속성) -> 릴레이션 재구성

좋은 분해 : 분해된 릴레이션들을 조인하면 원래의 릴레이션을 만들수있음

나쁜 분해 : 정보가 손실됨

 

갱신 이상 (update anomaly)

- 수정 이상(modification anomaly)

: 반복된 데이터 중에 일부만 수정하면 데이터의 불일치가 발생

- 삽입 이상(insertion anomaly)

: 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능

삭제 이상(deletion anomaly)

: 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능

- 정보의 중복

: 정보의 중복은 동일 정보를 두 곳 이상에 저장하는 것을 말함

 

예시)

=> 부서 번호 1, 부서 번호 2 이런 식으로 투플을 따로 더 둠

=> 투플은 통일했지만, 정보가 중복됨

 

==> 문제점

- 정보의 중복

각 사원이 속한 부서 수만큼 동일한 사원의 투플들이 존재하므로 사원이름, 사원번호, 주소, 전화번호 등이 중복되어 저장 공간이 낭비됨

 

- 수정 이상

만일 어떤 부서의 이름이 바뀔 때 이 부서에 근무하는 일부 사원 투플에서만 부서이름을 변경하면 데이터베이스가 불일치 상태에 빠짐

 

- 삽입 이상

만일 어떤 부서를 신설했는데 아직 사원을 한 명도 배정하지 않았다면 이 부서에 관한 정보를 입력할 수 없음

 

- 삭제 이상

만일 어떤 부서에 속한 사원이 단 한 명이 있는데, 이 사원에 관한 투플을 삭제하면 이 사원이 속한 부서에 관한 정보도 릴레이션에서 삭제됨

 

=> 정규화를 진행하여 기존의 릴레이션을 분해하고, 중복과 갱신 이상을 최소화한다

 

릴레이션 분해

- 하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것

- 릴레이션의 분해는 필요한 경우에는 분해된 릴레이션들로부터 원래의 릴레이션을 다시 구할 수 있음을 보장해야 한다는 원칙을 기반

- 분해를 잘못하면 두 릴레이션으로부터 얻을 수 있는 정보가 원래의 릴레이션이 나타내던 정보보다 적을 수도 있고 많을 수도 있음

- 두 릴레이션으로부터 얻을 수 있는 정보는 원래의 릴레이션이 갖고 있던 정보와 정확하게 일치해야 함

- 릴레이션의 분해는 릴레이션에 존재하는 함수적 종속성에 관한 지식을 기반으로 함

 

 

 

- 부서이름의 수정

어떤 부서에 근무하는 사원이 여러 명 있더라도 사원1 릴레이션에는 부서 이름이 포함되어 있지 않으므로 수정 이상이 나타나지 않음

 

- 새로운 부서를 삽입

만일 어떤 신설 부서에 사원이 한 명도 배정되지 않았더라도, 부서 릴레이션의 기본 키가 부서번호이므로 이 부서에 관한 정보를 부서 릴레이션에 삽입할 수 있음

 

- 마지막 사원 투플을 삭제

만일 어느 부서에 속한 유일한 사원에 관한 투플을 삭제하더라도 이 부서에 관한 정보는 부서 릴레이션에 남아 있음

 

정규형(normal form)의 종류

제1정규형(first normal form), 제2정규형(second normal form), 제3정규형(third normal form), BCNF(Boyce-Codd normal form), 제4정규형(fourth normal form), 제5정규형(fifth normal form)

=> 일반적으로 산업계의 데이터베이스 응용에서 데이터베이스를 설계할 때 제3정규형 또는 BCNF까지만 고려함

 

관계 데이터베이스 설계의 비공식적인 지침

1. 이해하기 쉽고 명확한 스키마를 만들라 (각 릴레이션은 독자적으로 의미를 갖는 단위여야함)

=> 여러 엔티티 타입이나 관계 타입에 속한 애트리뷰트들을 하나의 릴레이션에  모두 포함시키지 않음

2. 널값일 가능성이 높은 애트리뷰트를 릴레이션에 포함시키지 말 것

3. 가짜 투플이 생기지 않도록 하라

=> R1의 외래키와 R2기본키 애트리뷰트를 가지고 동등 조건으로 조인할 수 있는 릴레이션스키마를 설계한다. 외래키,기본키 조합을 제외하고 릴레이션들이 대응하는 애트리뷰트들을 가지지 않도록 한다.

4. 스키마를 정제하라

 

7.2. 함수적 종속성

 

함수적 종속성

- 릴레이션의 애트리뷰트들의 의미로 결정됨

=> R애트리뷰트들의 부분집합인 X, Y사이의 함수적 종속성(XàY 로 표기)X부분의 값이 Y부분의 값을 고유하게(또는 함수적으로) 결정

- 릴레이션의 스키마에 대한 주장, 릴레이션의 특정 인스턴스에 대한 주장이 아님

- 릴레이션의 가능한 모든 투플에 대한 제약조건 

=> R의 임의의 두 투플 t1, t2에 대하여 t1[X]=t2[X]이면 반드시 t1[Y]=t2[Y]이어야 한다는 것

- 릴레이션의 가능한 모든 인스턴스들이 만족해야함

- ERD에는 함수적 종속성을 표기할 수 없음

 

++

- X에서 Y로 함수적 종속성이 존재한다.

- YX에 함수적으로 종속된다.

- “임의의 두개 투플의 X값이 같으면 Y값도 같을 때에 한하여 XY를 함수적으로 결정한다.” 고 말할 수 있음.

 

함수적 종속성의 개요

- 정규화 이론의 핵심

- 릴레이션의 애트리뷰트들의 의미적 특성

- 릴레이션 스키마에 대한 주장이지 릴레이션의 특정 인스턴스에 대한 주장이 아님

- 릴레이션의 모든 인스턴스들이 만족해야 함

- 실세계에 대한 지식과 응용의 의미를 기반으로 어떤 함수적 종속성들이

  존재하는가를 파악해야 함

- 함수적 종속성은 제2정규형부터 BCNF까지 적용됨

 

=> 관계 스키마에 둘 이상의 키가 있는 경우, 기본키와 기본키로 지정되지않은 후보키로 나뉨, 관계 스키마 R의 속성이 R의 일부 후보 키의 멤버인 경우 이를 R의 소수 속성이라고 하고, 소수 속성이 아닌 경우 이를 비소수 속성이라고 함

 

결정자(determinant)

- 어떤 애트리뷰트의 값은 다른 애트리뷰트의 값을 고유하게 결정할 수 있음

- 그림 7.4의 사원 릴레이션에서 사원번호는 사원이름을 고유하게 결정함, 또한 사원번호는 주소와 전화번호도 고유하게 결정함

- 주소는 사원이름을 고유하게 결정하지 못함

- 결정자는 주어진 릴레이션에서 다른 애트리뷰트(또는 애트리뷰트들의 집합)를 고유하게 결정하는 하나 이상의 애트리뷰트를 의미

- 결정자를 아래와 같이 표기하고, 이를 AB를 결정한다(또는 AB의 결정자이다)라고 말함

A B

 

예)

사원번호 → 사원이름

사원번호 → 주소

사원번호 → 전화번호

부서번호 → 부서이름

 

함수적 종속성

- 만일 애트리뷰트 A애트리뷰트 B의 결정자이면 BA에 함수적으로 종속한다고 말함

=> 다른 말로 표현하면, 주어진 릴레이션 R에서 애트리뷰트 B애트리뷰트 A에 함수적으로 종속하는 필요 충분 조건은 각 A 값에 대해 반드시 한 개의 B 값이 대응된다는 것

- 하나의 함수적 종속성은 실세계의 의미에 따라 바뀜

 

: 사원번호가 사원이름, 주소, 전화번호의 결정자이므로 사원이름, 주소, 전화번호는 사원번호에 함수적으로 종속

: 직책은 (사원번호, 부서번호)에 함수적으로 종속하지, 사원번호에 함수적으로 종속하지는 않음

 

 

진부분 집합

집합 X의 모든 원소가 집합 Y에 포함(Contain)된다면 집합 X는 집합 Y의 부분집합이다   표기:  X⊆Y

부분 집합 X⊆Y 에서 X≠Y  경우에는 이를 진부분 집합이라고 한다. 표기 : X ⊂ Y

 

완전 함수적 종속성(FFD: Full Functional Dependency)

- 주어진 릴레이션 R에서 애트리뷰트 B애트리뷰트 A에 함수적으로 종속하면서 애트리뷰트 A의 어떠한 진부분 집합에도 함수적으로 종속하지 않으면 애트리뷰트 B애트리뷰트 A에 완전하게 함수적으로 종속한다고 말함

- 여기서 애트리뷰트 A는 복합 애트리뷰트

이행적 함수적 종속성(transitive FD)

- 한 릴레이션의 애트리뷰트 A, B, C가 주어졌을 때 애트리뷰트 C가 이행적으로 A에 종속한다(A→C)는 것의 필요 충분 조건은 A→B ∧ B→C 가 성립하는 것

- A가 릴레이션의 기본 키라면 키의 정의에 따라 A→B A→C가 성립한다. 만일 C A외에 B에도 함수적으로 종속한다면(B →C and A→C) C A에 직접 함수적으로 종속하면서 B를 거쳐서 A에 이행적으로 종속한다

7.3. 릴레이션 분해

: 하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것

- 릴레이션을 분해하면 중복이 감소되고 갱신 이상이 줄어드는 장점이 있는 반면에, 바람직하지 않은 문제들을 포함하여 몇 가지 잠재적인 문제들을 야기할 수 있음

- 릴레이션이 분해되기 전에는 조인이 필요 없는 질의가 분해 후에는 조인을 필요로 하는 질의로 바뀔 수 있음

- 분해된 릴레이션들을 사용하여 원래 릴레이션을 재구성하지 못할 수 있음

 

무손실 분해(lossless decomposition)

- 분해된 두 릴레이션을 조인하면 원래의 릴레이션에 들어 있는 정보를 완전하게 얻을 수 있음

- 여기서 손실이란 정보의 손실을 뜻함

- 정보의 손실은 원래의 릴레이션을 분해한 후에 생성된 릴레이션들을 조인한 결과에 들어 있는 정보가 원래의 릴레이션에 들어 있는 정보보다 적거나 많은 것을 모두 포함

 

학번 → 이름, 이메일

이메일 → 학번, 이름

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

=> 과목 번호와 학점간의 연관이 표현되지않음 내 학점

 

7.4. 제 1 정규형, 제 2 정규형, 제 3 정규형, BCNF

1정규형 : 원자 값

2정규형: 부분 FD 없음

3정규형:  이행적 FD 없음

제 1 정규형

- 한 릴레이션  R이 제1정규형을 만족할 필요 충분 조건은 릴레이션 R의 모든 애트리뷰트가 원자값만을 갖는다는 것

- 즉 릴레이션의 모든 애트리뷰트에 반복 그룹(repeating group)이 나타나지 않으면 제1정규형을 만족함

=> 제 1 정규형으로 변환하는 방법 : 반복 그룹 애트리뷰트에 나타나는 집합에 속한 각 값마다 하나의 투플로 표현

갱신 이상 발생, 기본키는 (학번, 과목번호)

수정 이상

- 한 학과에 소속한 학생 수만큼 그 학과의 전화번호가 중복되어 저장되므로 여러 학생이 소속된 학과의 전화번호가 변경되었을 때 그 학과에 속한 모든 학생들의 투플에서 전화번호를 수정하지 않으면 데이터베이스의 일관성이 유지되지 않음

 

삽입 이상

- 한 명의 학생이라도 어떤 학과에 소속되지 않으면 이 학과에 관한 투플을 삽입할 수 없음. 왜냐하면 학번이 기본 키의 구성요소인데 엔티티 무결성 제약조건에 따라 기본 키에 널값을 입력할 수 없기 때문

 

삭제 이상

- 어떤 학과에 소속된 마지막 학생 투플을 삭제하면 이 학생이 소속된 학과에 관한 정보도 삭제됨

 

=> 갱신이상이 생기는 이유? : 기본 키에 대한 부분 함수적 종속성이 학생 릴레이션에 존재하기 때문

 

2정규형

정의: 릴레이션 스키마 R의 모든 비주요(non-prime) 애트리뷰트들이 R의 기본키에 대해 완전하게 함수적으로 종속하면 제2정규형이라 한다.

- 한 릴레이션 R이 제2정규형을 만족할 필요 충분 조건은 릴레이션 R이 제1정규형을 만족하면서, 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 R의 기본 키에 완전하게 함수적으로 종속하는 것

- 기본 키가 두 개 이상의 애트리뷰트로 구성되었을 경우에만 제1정규형이 제2정규형을 만족하는가를 고려할 필요가 있음

- 즉 기본 키가 한 개의 애트리뷰트로 이루어진 릴레이션이 제1정규형을 만족하면 제2정규형도 만족함

=> 그래도 발생하는 갱신 이상들

 

수정 이상

여러 학생이 소속된 학과의 전화번호가 변경되었을 때 그 학과에 속한 모든 학생들의 투플에서 전화번호를 수정하지 않으면 데이터베이스의 일관성이 유지되지 않음

 

삽입 이상

어떤 학과를 신설해서 아직 소속 학생이 없으면 그 학과의 정보를 입력할 수 없다. 왜냐하면 학번이 기본 키인데 엔티티 무결성 제약조건에 따라 기본 키에 널값을 입력할 수 없기 때문

 

삭제 이상

어떤 학과에서 마지막 학생의 투플이 삭제되면 그 학과의 전화번호도 함께 삭제됨

 

=> 갱신 이상이 생기는 이유? : 학생 1 릴레이션에 이행적 종속성이 존재하기 때문

 

 

제3정규형

- 한 릴레이션 R이 제3정규형을 만족할 필요 충분 조건은 릴레이션 R이 제2정규형을 만족하면서, 모든 non-prime 애트리뷰트가 릴레이션 R의 기본 키에 이행적으로 종속하지 않는 것

- 정의: 릴레이션 스키마 R이 제 2 정규형을 갖고 R의 어떤 nonprime 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 R은 제 3 정규형

 

7.5. 역정규화 ( denormalization )

역정규화

- 정규화 단계가 진행될수록 중복이 감소하고 갱신 이상도 감소됨

- 정규화가 진전될수록 무결성 제약조건을 시행하기 위해 필요한 코드의 양도 감소됨

- 정규화가 데이터베이스 설계의 중요한 요소이지만 성능상의 관점에서만 보면 높은 정규형을 만족하는 릴레이션 스키마가 최적인 것은 아님

- 한 정규형에서 다음 정규형으로 진행될 때마다 하나의 릴레이션이 최소한 두 개의 릴레이션으로 분해됨

- 분해되기 전의 릴레이션을 대상으로 질의를 할 때는 조인이 필요 없지만 분해된 릴레이션을 대상으로 질의를 할 때는 같은 정보를 얻기 위해서 보다 많은 릴레이션들을 접근해야 하므로 조인의 필요성이 증가함

- 때로 데이터베이스 설계자는 응용의 요구 사항에 따라 데이터베이스 설계의 일부분을 역정규화함으로써 데이터 중복 및 갱신 이상을 대가로 치르면서 성능상의 요구를 만족시키기도 함

- 많은 데이터베이스 응용에서 검색 질의의 비율이 갱신 질의의 비율보다 훨씬 높음. 역정규화는 주어진 응용에서 빈번하게 수행되는 검색 질의들의 수행 속도를 높이기 위해서 이미 분해된 두 개 이상의 릴레이션들을 합쳐서 하나의 릴레이션으로 만드는 작업

==> 역정규화는 보다 낮은 정규형으로 되돌아가는 것