• [DB] 데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF)

    2021. 3. 20.

    by. KimBangg

     

    1. 이상 ( Anomaly )

     

    이상이란 테이블에서 일부 속성들의 종속으로 인해 데이터의 중복이 발생하고, 이 중복으로 인하여 테이블 조작 시 문제가 발생하는 것을 의미한다.

    이상의 종류로는 삽입, 삭제, 갱신 이상이 존재한다.

     

    2. 정규화란?

     

    테이블의 속성들이 갖는 상호 종속적인 특성을 이용하여, 테이블을 무손실 분해 하는 것을 의미한다.

    정규화의 목적은 가능한 한 중복을 제거하여 삽입, 삭제, 갱신 이상의 발생 가능성을 줄이는 것이다.

     

    < 2-1 정규화의 과정 >

     

    1)제 1정규화

    테이블에 속한 모든 속성의 도메인이 원자 값만으로만 이루어져야한다.

    제품번호 (PK)

    제품명

    재고수량

    주문번호

    고객번호

    1001

    모니터

    2000

    A345, D347

    150

    1002

    마우스

    9000

    A210, B230

    600

     

    위의 표를 보게 되면 [제품번호, 제품명, 재고수량 ,고객번호] 의 경우 1개의 값 즉 원자값으로 이루어졌다.

    하지만, 주문번호 하나의 도메인에 2개의 값을 가졌으니 1정규화를 통해 이를 분리해주는 과정을 거친다.

     

     

    2) 제 2정규화

    테이블이 제 1정규형이고, 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다.

    학생 [CK]

    과목[CK]

    나이

    김OO

    운영체제

    26

    박OO

    컴퓨터구조

    24


    위의 테이블의 후보키는 [학생, 과목] 이다. 이때의 경우 나이라는 도메인에 접근하기 위해서는 [학생, 과목]이 모두 필요하지 않고 [학생]만을 통해서 접근이다. 이러한 상황이 '부분 함수 종속'이 존재한다고 정의 할 수 있다.

     

    그럴 경우, 부분 함수 종속을 없애기 위해 2NF를 적용하게 되면, 아래와 같은 테이블을 얻을 수 있다.

    이를 통해 궁극적으로 PK(기본키), FK(외래키)만으로 모든 릴레이션에 대한 접근 및 통제가 가능해진다.

     

    : 모든 왕( PK, FK) 에 의해 백성들이 통제되는가?

     

    < 학생 >

    학생 [PK]

    나이

    김OO

    26

    박OO

    24

    <과목>

    학생 [PK]

    과목

    김OO

    운영체제

    박OO

    컴퓨터구조

     

    3) 제 3정규화

     

    테이블이 제 2정규형이고, 기본키가 아닌 모든 속성이 기본키에 대해 이행적 함수 종속을 만족하지 않은 상태.

    주문번호[PK]

    고객번호

    주소

    A345

    100

    Seoul

    A210

    300

    Busan

    기본 키인 '주문번호' 외에도 고객번호를 통해서 '주소'에 접근이 가능하다. 이러한 경우에 이행적 함수 종속이 성립 된다고 이야기 할 수 있다.

     

    제 3정규형의 궁극적인 목적은 PK를 제외한 일반 도메인 중에서 다른 칼럼을 통제하여 다음과 같은 테이블을 얻을 수 있다.

     

    백성들 중에, 숨은 왕이 있는가? => 없어야 한다.

    주문번호 [PK]

    고객번호

    A345

    100

    A210

    300

     

     

    고객번호 [PK]

    주소

    100

    Seoul

    300

    Busan

     

     

    4) BCNF

    BCNF은 제 3정규형을 강화한 형태로, 테이블에 있는 모든 결정자는 후보키인 경우를 의미합니다.

     

    <수강 교수 테이블>

    학번

    과목명

    담당교수

    171746

    데이터베이스

    홍길동

    171747

    네트워크

    홍길삼

     

    수강_교수 테이블을 보게 되면 후보키는 <학번, 과목명> 이다. 하지만, 후보키가 아닌 담당교수가 결정자인 경우에도 (담당교수 -> 과목명) 존재 하기 때문에, BCNF 정규화가 안되었음을 확인 할 수 있다.

     

    그리하여, 담당교수와 학번, 담당교수와 과목명을 분리해주면 BCNF 정규화가 완료된다 :D

     

     

     

    댓글