[cs] 정규화

do_large·2020년 10월 17일
0

cs

목록 보기
1/9
post-thumbnail

정규화를 설명하기 위한 기본 용어정리

  • 슈퍼키

    • 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만 최소성은 만족하지 않는다
    • 유일성 : 하나의 키 값으로 하나의 튜플을 유일하게 식별할수 있어야 하는것
    • 최소성 : 키를 구성하는 속성 하나를 제거하면 유일하게 식별할 수 없도록 꼭 필요한 최소의 속성으로 구성되어야 한다는것
  • 후보키

    • 릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
    • 슈퍼키 중 최소성을 만족한 키
  • 기본키

    • 기본키는 후보키 중에서 선택한 주키(Main Key)이다.

  • 릴레이션(테이블)

    • 정보를 정리한 표
    • 관계형 데이터 베이스에서 정보를 구분하여 저장하는 기본단위
    • 하나의 데이터베이스 내에서 각 릴레이션은 서로 구분되는 이름을 가진다.
  • 속성(애트리뷰트, attribute)

    • 하나의 릴레이션은 현실세계의 한 개체(entity)를 표현하고 저장하는데 사용된다.
    • 속성이라는 것은 내가 테이블에 저장하고 싶은 항목
    • 고유한 이름을 가지며 동일 릴레이션 내에서는 같은 이름의 속성이 존재할수 없다.
  • 함수적 종속성

    X -> Y

    • X 는 결정자, Y 는 종속자라고 한다.

    • X 가 Y 를 함수적으로 결정한다.

    • Y 가 X 에 함수적으로 종속되어 있다.

      완전 함수적 종속

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

      부분 함수적 종속

      속성집합 Y 가 속성집합 X 의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미한다.

      이행적 함수 종속

      삼단논법 같은 관계를 가진 함수종속이다.

      X, Y, Z 에 대해 X->Y 이고 Y->Z 이면 X->Z 가 성립한다. 이를 Z 가 X 에 이행적으로 함수 종속되었다고 한다.

데이터베이스 정규화 1NF, 2NF, 3NF, BCNF

정규화란

  • 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
  • 함수적 종속성을 이용해서 연관성 있는 속성들을 분류하고, 각 릴레이션들에서 이상현상이 생기지 않도록 하는 과정을 말한다.
  • 정규화 된 정도를 정규형(Normal Form) 으로 표현하는데, 정규형에는 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF 까지 있다. 비공식적 표현으로는 3NF 가 되었으면 정규화 되었다고 말한다.
  • 삽입이상 (Insertion Anomaly), 갱신이상 (Update Anomaly), 삭제이상 (Deletion Anomaly)

  • 삽입이상

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

만약 학생이 아무 과목도 수강하지 않는다고 하면, Subject_opted 컬럼에는 NULL이 들어갈 것입니다.

  • 갱신이상

중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제

Adam의 Address가 변경되었을 때, 여러줄의 데이터를 갱신해야합니다. 이로인해 데이터의 불일치(inconsistency)가 발생할 수 있습니다.

  • 삭제이상

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

만약 Alex 학생이 과목 수강을 취소한다면 Alex의 레코드가 아예 테이블에서 지워져버립니다.

정규화의 목적

  1. 불필요한 데이터(data redundancy)를 제거한다.

  2. 데이터 저장을 "논리적으로" 한다.(데이터 테이블의 구성이 논리적이고 직관적)

제 1 정규형(1RF)

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

1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 합니다.

복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.

1차 정규화를 함으로써 데이터 중복은 더 증가하였습니다. 데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있습니다.

제 2 정규형

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

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

이 릴레이션의 기본키는 (학번+과목코드)

위 릴레이션의 함수적 종속성을 보면

{학번, 과목코드} -> 성적
{학번, 과목코드} -> 학부
{학번, 과목코드} -> 등록금
학번 -> 학부
학번 -> 등록금

학부 -> 등록금

학번->학부, 학번->등록금 두개의 부분 함수 종속성을 가지고 있다. 이를 제거해 주는 것을 제2정규화라고 한다.

학번, 학부, 등록금 속성을 가지는 학생 릴레이션과 학번, 과목코드, 성적 속성을 가지는 성적릴레이션 둘로 나누어 주면 부분 함수 종속성을 제거할 수 있다.

학번->학부 함수종속성으로 볼때, 학번만으로 학부에 대한 결정을 지을 수 있다는 말이다. 그러나 현재 기본키가 학번, 과목코드로 이루어져 있기 때문에 학번만으로 학부에 대한 결정을 지을 수 있다는 게 의미가 없어진다. 그래서 이를 가능하도록 해주는 과정이 부분 함수 종속성을 제거하는 제2정규화 과정이다.

여기서 학부->등록금 이라는 함수적 종속성은 부분 함수 종속성이 아니다. X -> Y 라는 함수적 종속성에서 부분 함수 종속성, 완전 함수 종속성을 따질 때 결정자 X가 반드시 기본키나 후보키에 속할 필요는 없으므로 현재 학부->등록금 의 함수 종속은 하나의 완전 함수 종속이라고 볼 수 있다.

학번->학부, 학번->등록금 두개의 부분 함수 종속성을 제거하여 분리한 두개의 릴레이션은 아래와 같다.

릴레이션이 둘로 분해되면서 학부와 등록금에 대한 중복항목이 제거되었다. 정규화 과정에서 주의할 점은 정규화를 통해 분해된 릴레이션들이 조인을 통해 원래의 구조로 복원될 수 있어야 한다는 것이다.

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

하지만 제2정규형에도 이상현상은 발생한다

삽입이상

: 새로운 학부가 생기는 경우 등록된 학생(학번)이 없다면 학번속성이 NULL이 되므로 삽입할 수 없다.

갱신이상

: 컴퓨터공학부 등록금이 400으로 오르는 경우 20800399, 21500399 둘 모두 바꾸어 주지 않으면 데이터 불일치 문제가 발생한다.

삭제이상

: 21400001 학번을 가진 학생이 자퇴하는 경우, 기계공학부에 대한 정보가 함께 사라진다.

제2정규형에서도 이상현상이 발생하는 이유는 이행적 함수 종속이 존재하기 때문이다. 이행적 함수 종속을 없애주는 과정이 제 3 정규화이다.

제 3 정규형

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

X->Y, Y->Z 함수적 종속관계로 인해 X->Z 의 이행적 함수 종속 관계가 나타나면 [X, Y], [Y, Z] 두 릴레이션으로 분해한다.

지금까지 살펴본 세가지 릴레이션에서는 기본키가 될 수 있는 후보키가 하나 밖에 없었다.

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

이를 해결하기 위한 정규형이 보이스-코드 정규형 (BCNF; Boyce-Codd Normal Form)이다. 제3정규형보다 조금 더 엄격한 제약조건을 가지기 때문에 Strong 3NF 라고도 한다.

BCNF정규형(Boyce and Codd Normal Form)

BCNF란 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다.

BCNF는 (Boyce and Codd Normal Form) 3차 정규형을 조금 더 강화한 버전으로 볼 수 있습니다. 이는 3차 정규형으로 해결할 수 없는 이상현상을 해결할 수 있습니다.

BCNF란 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다. 아래와 같은 경우를 생각해보면, 후보키는 수퍼키중에서 최소성을 만족하는 건데, 이 경우 (학생, 과목) 입니다. (학생, 과목)은 그 로우를 유일하게 구분할 수 있습니다.

근데 이 테이블의 경우 교수가 결정자 입니다. (교수가 한 과목만 강의할 수 있다고 가정) 즉, 교수가 정해지면 과목이 결정됩니다. 근데 교수는 후보키가 아닙니다. 따라서 이 경우에 BCNF를 만족하지 못한다고 합니다.

3차 정규형을 만족하면서 BCNF는 만족하지 않는 경우는 언제일까요? 바로 일반 컬럼이 후보키를 결정하는 경우입니다.

위와 같이 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생합니다.

정규화의 장점

  1. 데이터베이스 변경 시 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.
  2. 데이터베이스 구조 확장 시 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.
  3. 사용자에게 데이터 모델을 더욱 의미있게 제공 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.

정규화의 단점

  1. 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다.
  2. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다. 조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

반정규화(De-normalization, 비정규화)

  • 반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.
  • 디스크 I/O 량이 많아서 조회 시 성능이 저하될때
  • 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상될때

일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

(반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있기때문에 주의해서 사용해야한다.)

https://3months.tistory.com/193

https://yaboong.github.io/database/2018/03/10/database-normalization-2/

0개의 댓글