본문 바로가기
DBMS(SQL)

함수적 종속성 & 정규화 (6일차)

by JoinInNoetic 2023. 10. 9.

◆ 함수적 종속성

    - X와 Y를 각각 속성의 부분집합이라고 가정했을 때

        -> X 값을 알면 Y값을 바로 식별할 수 있고, X 값에 의해 Y 값이 달라질 때 Y는 X의 함수적 종속이라고 한다.

    - 이 경우 X를 결정자, Y를 종속자라고 한다. (X -> Y)

    ex) 학번을 알면 이름, 나이, 성별 식별 가능 => 결정자 : 학번 / 종속자 : 이름, 나이, 성별

         학번 -> 이름 / 학번 -> 나이 / 학번 -> 성별

        ☞ 이름, 나이, 성별은 학번에 함수적 종속 관계이다.

        ☆ 전공코드와 전공명은 학번으로 식별 불가능 (복수전공) => 종속관계 아님

        ※ 학번 -> 기본키

학번
이름
나이
성별
전공코드
전공명
110011
박지현
26
여성
AAA1
국문학과
110011
박지현
26
여성
C0B7
컴퓨터공학과
131001
김민석
25
남성
C0A5
전기전자공학과
120006
홍현희
25
여성
B1027
무용과

 

    - 종속 관계 종류

 

        ● 완전 함수적 종속

            - 종속자가 기본키에만 종속

            ex) 기본키가 회원본호 속성으로 이름, 나이 , 거주지역 속성은 회원번호를 알아야 식별가능

                -> 이름, 나이, 거주지역은 회원번호에 완전 함수 종속된 관계

회원번호
이름
나이
거주지
A001
송민지
17
서울
A002
박아람
15
부산
A003
이예은
16
대전

            ex) 기본키는 고객ID와 상품코드 속성으로 구성

                수량 속성은 기본키를 구성하는 고객ID, 상품코드 속성을 모두 알아야 식별가능

                -> 수량은 기본키를 구성하는 고객ID, 상품코드에 완전 함수 종속 관계

                ※ 기본키임에도 중복인 것은 테이블이 합쳐진 것

고객ID
상품코드
주문상품
수량
가격
AAAA01
T001
티셔츠
2
12000
AAAA01
B110
청바지
1
11000
AAAA02
B110
청바지
2
22000
AAAA03
T091
와이셔츠
1
15000

 

        ● 부분 함수적 종속

            - 테이블에서 종속자가 기본키가 아닌 다른 속성에 종속

            - 기본키가 여러 속성으로 구성되어 있을 경우, 기본키를 구성하는 속성 중 일부만 종속되는 경우

            ex) 기본키는 고객ID와 상품코드로 구성

                주문상품 속성은 기본키들 중 상품코드만 알아서 식별가능

                -> 주문 상품 속성은 기본키에 부분 함수 종속 관계

 
고객ID
상품코드
주문상품
수량
가격
AAAA01
T001
티셔츠
2
12000
AAAA01
B110
청바지
1
11000
AAAA02
B110
청바지
2
22000
AAAA03
T091
와이셔츠
1
15000

 

        ● 이행 함수적 종속

            - 테이블에서 X, Y, Z라는 3개의 속성이 있을 때, X -> Y, Y -> Z란 종속 관계가 있을 경우,

               X -> Z가 성립될 때 이행 함수적 종속

                ( X를 알면 Y를 알고 그를 통해 Z를 알 수 있는 경우)

              ex) 상품번호를 알면 소분류를 알 수 있음 / 소분류를 알면 대분류도 알 수 있음

                -> 상품번호를 알면 대분류를 알 수 있으므로 이행 함수적 종속

 
상품번호
상품명
소분류
대분류
A001
검은 체크무늬 셔츠
상의
의류
A002
유선 마우스
마우스
전자제품
A003
유기농 양배추
야채
식료품
A004
포테이토 칩
스낵
식료품
A005
32인치 4K 모니터
모니터
전자제품

 

◆ 정규화

    - 목표 : 테이블 간의 중복된 데이터를 허용하지 않는 것 => 무결성 유지

        ( 부분 함수적 종속이나 이행 함수적 종속은 좋지 않은 데이터베이스이므로 정규화를 통해 완전종속으로 만듬)

    - DB의 저장 용량 역시 줄일 수 있음

    - 정규화 단계

        ● 제 1 정규화

            - 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것

            ex) 추신수, 박세리는 여러 개의 취미를 가지고 있음 -> 제 1정규형을 만족하지 못함 => 분해

 
이름
취미들
김연아
인터넷
추신수
영화, 음악
박세리
음악, 쇼핑
장미란
음악

↓↓↓↓↓↓↓

 
이름
취미
김연아
인터넷
추신수
영화
추신수
음악
박세리
음악
박세리
쇼핑
장미란
음악

 

        ● 제 2 정규화

            - 제 1 정규화가 완료된 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것

            - 기본키의 부분집합이 결정자가 되면 안된다는 것

            ex) 기본키는 학생번호, 강좌이름으로 구성

 
학생번호
강좌이름
강의실
성적
501
데이터베이스
공학관 110
3.5
401
데이터베이스
공학관 110
4.0
402
스포츠경영학
체육관 103
3.5
502
자료구조
공학관 111
4.0
501
자료구조
공학관 111
3.5

 

        #1

        #2 강의실 분해 -> 제 2 정규형 만족

 

        ● 제 3 정규화

            - 제 2정규화를 진행한 테이블에 대해 이행 함수적 종속을 없애도록 테이블을 분해하는 것

            - A -> B / B -> C 일때, A -> C가 성립되는 것을 이행 함수적 종속이라 한다.

            ex) 학생번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다.

                -> 테이블을 분해해야 한다.

 

            ※ 만약 수강료가 오르면 해당 강좌의 모든 수강료 값을 모두 바꿔야 함

                -> 아래와 같이 분해하면 두 번째 테이블만 수정해주면 됨

 

        #1 학생번호 -> 강좌이름

 

        #2 강좌이름 -> 수강료

 

        ● BCNF 정규화

            - 제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

            - 결정자가 기본키가 아닌 것을 제거 -> 테이블 분해

 

 

        #1

 

        #2