정규화란

  1. 정규화 (Normalization) 는 관계형 데이터베이스 설계에서 중복을 최소화하도록 데이터를 구조화하는 프로세스를 의미한다.
    1. 비정규화도 존재한다. 이 방법은 복잡한 쿼리 속도를 높이고 성능을 향상시키기 위해 테이블에 중복 데이터를 추가하는 프로세스를 의미한다.
  2. 즉, 함수적 종속성을 이용하여 연관성 있는 속성들을 분류하고, 각 relation 들에서 이상 현상 (anomaly) 이 생기지 않도록 하는 과정을 의미한다.

B) 정규화의 장/단점

  • 장점: 데이터베이스 변경 시 이상 현상을 제거하고, 데이터베이스 구조 확장 시 재디자인을 최소화 한다.
  • 단점: 정규화는 릴레이션을 분해하는 작업이다. 이로인해 릴레이션 간의 조인 연산이 많이 필요해지고, 응답 시간이 느려질 수 있다.

C) 이상 현상

데이터 중복으로 인해 발생한 문제로, 총 3 개의 이상 현상이 존재한다.

이상 현상을 설명하기 편하게, 다음과 같은 학사 정보 시스템에 관련된 릴레이션을 예로 들어보자. 아래 릴레이션은 STUDENT_ID 와 COURSE_ID 의 조합을 기본키로 가지는 테이블이다. 또한, 한 학생은 하나의 DEPARTMENT 에만 속할 수 있다고 가정하자.

이 테이블은 학생의 신상 정보와 해당 학생이 어떤 수업을 수강했는지에 대한 정보를 알려준다.

STUDENT_IDSTUDENT_NMDEPARTMENTCOURSE_IDGRADE
20800399야붕컴퓨터공학부CSE011101A+
20800399야붕컴퓨터공학부CSE022202A
20800399야붕컴퓨터공학부CSE033303B+
21300758모찌경영학부MEC011101F
21400001팥빵기계공학부POD032939C+

C.1) 삽입 이상 (Insertion Anomaly)

새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제를 삽입 이상 이라고 한다.

  • 아직 수업을 하나도 수강하지 않은 학생에 대한 튜플을 위 릴레이션에 삽입한다고 가정해보자. 기본키는 COURSE_ID 와 STUDENT_ID 의 조합이므로, 개체 무결성에 의해 COURSE_ID 는 NULL 이 될 수 없다. 굳이 삽입하기 위해서는 ‘미수강’이라는 과목코드를 새로 만들어서 삽입해야 한다.

C.2) 갱신 이상 (Update Anomaly)

중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제를 갱신 이상 이라고 한다.

  • 야붕이라는 학생이 컴퓨터공학이 싫어서 통계학부로 옮기게 되는 경우 컴퓨터공학부에 관련된 튜플을 모두 수정해줘야 한다 (총 3 개). 만약 일부 튜플만 수정하게 된다면, 해당 학생은 어떤 학부에 속하는지 알 수 없다.

C.3) 삭제 이상 (Deletion Anomaly)

튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제를 삭제 이상 이라고 한다.

  • 모찌라는 학생이 수업 MEC011101 을 포기할 경우, 테이블에 존재하는 모찌 학생과 관련된 튜플을 삭제해야 한다. 하지만, 해당 튜플을 삭제하게 되면, 모찌 학생에 대한 정보는 테이블에 존재하지 않으므로, 해당 학생에 대한 추가적인 정보는 모두 사라진다.

D) 함수적 종속성 (Functional Dependency)

이론적으로는 정규화를 수행하려면 속성들간의 관련성을 파악해야 하는데, 이 속성들간의 관련성을 함수적 종속성 (Functional Dependency) 라고 한다. 일반적으로 하나의 릴레이션에는 하나의 함수적 종속성만이 존재하도록 정규화를 하게 된다.

함수적 종속성은 X -> Y 로 표현된다.

  • X 는 결정자, Y 는 종속자라고 한다.
  • X 가 Y 를 함수적으로 결정한다.
  • Y 가 X 에 함수적으로 종속되어 있다.

D.1) 완전 함수 종속 (Full Functional Dependency)

속성 집합 Y 가 속성 집합 X 전체에 대해서만 함수적으로 종속된 경우를 말한다.

  • 예) Y {GRADE} 는 X {STUDENT_ID, COURSE_ID} 에 완전 함수적 종속된다 라고 말할 수 있다.
    • 다시 말하면, 성적은 {학번, 과목 코드}의 어떤 부분집합에도 함수적으로 종속되어 있지 않다. 학번만으로 성적을 결정지을 수 없고, 과목 코드만으로 성적을 결정지을 수 없다.

D.2) 부분 함수 종속 (Partial Functional Dependency)

속성 집합 Y 가 속성 집합 X 의 전체가 아닌 일부분에 대해서도 함수적으로 종속된 경우를 말한다.

  • 예) Y {STUDENT_NM}은 X {STUDENT_ID, COURSE_ID} 에 부분 함수적 종속된다 라고 말할 수 있다.
    • X 의 부분 집합인 학번 ({STUDENT_ID}에도 이름{STUDENT_NM}이 함수적으로 종속되기 때문이다.

D.3) 이행적 함수 종속 (Transitive Functional Dependency)

삼단논법 같은 관계를 가진 함수종속이다. 속성 집합 X, Y, Z 에 대해 X->Y 이고 Y->Z 이면 X->Z 가 성립한다. 이를 Z 가 X 에 이행적으로 함수 종속되었다고 한다.

  • 예) X {STUDENT_ID} , Y {STUDENT_NM} , Z {DEPARTMENT} 로 보면, Z 가 X 에 이행적 함수 종속한다.

E) 정규화

정규화된 정도를 정규형 (Normal Form) 으로 표현하는데, 정규형은 크게 1NF, 2NF, 3NF, BCNF 가 존재한다.

E.1) 제 1 정규형 (1NF, First Normal Form)

릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제 1 정규형에 속한다.

E.1.1) 예시

STUDENT_IDCOURSE_IDGRADESTUDENT_NM
20800399CSE011101, CSE022202, CSE033303A+, A, B+야붕

위와 같은 릴레이션은 제 1 정규형을 만족하지 않는다. 도메인이 원자값으로 구성되어 있지 않기 때문이다.

관계형 데이터베이스의 릴레이션은 모든 속성이 원자 값을 가지는 특성이 있기 때문에, 최소한 제 1 정규형을 만족해야 릴레이션이 될 자격이 있다.

STUDENT_IDCOURSE_IDGRADESTUDENT_NM
20800399CSE011101A+야붕
20800399CSE022202A야붕
20800399CSE033303B+야붕

E.2) 제 2 정규형 (2NF; Second Normal Form)

제 1 정규형만 만족시키는 릴레이션에서 부분 함수 종속성을 가지게 되는 경우 세가지 이상현상 (삽입 이상, 갱신 이상, 삭제 이상) 이 모두 나타나게 된다.

제 1 정규형에 속하면서, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형이다.

E.2.1) 예시

학번과목코드성적학부등록금
20800399CSE011101A+컴퓨터공학부350
20800399CSE022202A컴퓨터공학부350
20800399CSE033303B+컴퓨터공학부350
21300758MEC011101F경영학부300
21400001POD032939C+기계공학부400
21500399CSE011101D컴퓨터공학부350

위 테이블은 다음과 같은 함수적 종속성을 지닌다.

  • {학번, 과목코드} -> 성적
  • {학번, 과목코드} -> 학부
  • {학번, 과목코드} -> 등록금
  • 학번 -> 학부 (학번만으로 학부에 대한 결정을 지을 수 있다)
    • 기본키에 대한 부분 함수 종속성 (제거 필요)
  • 학번 -> 등록금
    • 키본키에 대한 부분 함수 종속성 (제거 필요)
  • 학부 -> 등록금

릴레이션을 둘로 나눠줌에 따라서 제 2 정규화를 수행할 수 있다.

  • 다만, 정규화 과정에서 주의할 점은 정규화를 통해 분해된 릴레이션들이 조인을 통해 원래의 구조로 복원될 수 있어야 한다는 것이다.

학생 릴레이션

학번학부등록금
20800399컴퓨터공학부350
21300758경영학부300
21400001기계공학부400
21500399컴퓨터공학부350

성적 릴레이션

학번과목코드성적
20800399CSE011101A+
20800399CSE022202A
20800399CSE033303B+
21300758MEC011101F
21400001POD032939C+
21500399CSE011101D

두 릴레이션 모두 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되므로 제 2 정규형을 만족한다.

E.3) 제 3 정규형 (3NF; Third Normal Form)

제 2 정규형을 만족해도 세 가지 이상 현상 (삽입 이상, 갱신 이상, 삭제 이상) 이 발생할 수 있다. 왜냐하면 이행적 함수 종속이 존재하기 때문이다.

제 2 정규형에 속하면서, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형이다.

E.3.1) 예시

우선 제 2 정규형 테이블에 어떻게 이상이 발생하는지 확인해보자.

  1. 삽입 이상: 새로운 학부가 생기는 경우 등록된 학생 (학번) 이 없다면 학번속성이 NULL 이 되므로 삽입할 수 없다.
  2. 갱신 이상: 컴퓨터공학부 등록금이 400 으로 오르는 경우 20800399, 21500399 둘 모두 바꾸어 주지 않으면 데이터 불일치 문제가 발생한다.
  3. 삭제 이상: 21400001 학번을 가진 학생이 자퇴하는 경우, 기계공학부에 대한 정보가 함께 사라진다.

그렇다면, 이를 해결하기 위해 기본에 대한 이행적 함수 종속을 확인해보자. 학생 릴레이션에서 함수적 종속성은 아래와 같다.

  • 학번 -> 학부
  • 학부 -> 등록금
  • 학번 -> 등록금

제 2 정규화와 마찬가지로, 이행적 함수 종속이 발생한 릴레이션을 나눠주면 된다.

  • 구체적으로는 X->Y, Y->Z 함수적 종속관계로 인해 X->Z 의 이행적 함수 종속 관계가 나타나면 [X, Y], [Y, Z] 두 릴레이션으로 분해한다.
학번학부
20800399컴퓨터공학부
21300758경영학부
21400001기계공학부
21500399컴퓨터공학부
학부등록금
컴퓨터공학부350
경영학부300
기계공학부400

E.4) 보이스 - 코드 정규형 (BCNF; Boyce-Codd Normal Form)

후보키를 여러개 가지고 있는 릴레이션에서는 제 3 정규형을 만족하더라도 이상현상이 생길 수 있다.

제 3 정규형에 속하면서, X -> Y 는 trivial functional dependency 이거나, X 는 릴레이션 R 의 슈퍼키인 경우 BCNF 이다.

  • 여기서 trivial functional dependency (FD) 는 Y 가 X 의 부분집합인 경우를 의미한다.

F) Reference

https://yaboong.github.io/database/2018/03/09/database-normalization-1/