본문 바로가기

ComputerScience/Database 이론

[Database] 9. Normalization 정규화 개념 정리 | 정규형(1...BCNF), 함수 종속 개념 완전 뿌수기 +_+

 

안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트 "데이터베이스 설계 | 요구사항분석, 개념적, 논리적 설계 정리"에 이어 이번에는 데이터베이스의 논리적 설계 중 정규화 과정과 함수 종속에 관한 개념을 정리하려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다:)

 

 

데이터베이스 논리적 설계 과정 중 하나인 정규화는 정말 중요한 작업입니다. E-R D를 Relational Schema로 변환 후에 정규화 과정을 거쳐야 데이터베이스의 데이터는 중복성이 줄어들고 일관성, 무결성 등이 향상되게 됩니다.

"정규화 과정은 왜 거치는 것일까?"

정규화를 하기 전 relational schema는 이상(Anomaly) 현상이 발생될 수 있습니다. 이상 현상은 데이터베이스에서 데이터의 불일치, 모순, 비 일관성을 의미합니다. 주요 이상 현상은 3가지가 있습니다.

 

  • 삽입 이상: 데이터를 삽입할 때 발생되는 이상현상입니다. 지금 삽입해야 하는 데이터 이외에 불필요한 데이터도 같이 삽입해야 하는 경우
  • 갱신 이상: 중복된 데이터가 있을 경우 그 중 일부만 갱신할 경우에 데이터의 불일치가 발생됩니다.
  • 삭제 이상: 데이터를 삭제할 때 필요한 데이터도 삭제되는 경우

이런 이상 현상을 해결하기 위해 정규화의 각 정규형을 만족하면서 릴레이션을 분해하면 이상현상이 해결됩니다. 각각의 정규형은 데이터 종속성과 중복을 제어하기 위해 정의된 규칙들입니다. 하지만 너무 과도한 정규화는 성능 문제를 야기할 수 도 있습니다.

함수적 종속성(FD. Functional Dependency)이란?

데이터베이스에서 속성간 종속 관계를 나타내는 개념입니다. 결정자(1...n의 속성 집합)에 의해 종속자(다른 속성 1...n의 속성집합)의 값이 유일하게 결정되는 관계를 뜻합니다.

 

결정자의 값이 변경되면 반드시 종속자의 값도 변경됩니다. 함수 종속은 X -> Y로 표현됩니다. (X: 결정자 -> Y: 종속자)

 

결정자로 사용되는 속성은 PK(Primary Key), 후보키, Unique Index, 다른 속성들의 조합 또는 위 속성이 아니어도 결정자가 될 수 있습니다.

실제 예

고객아이디(PK) 고객이름 고객등급
apple 정소화 gold
banana 김선우 vip
고객아이디 이벤트번호 당첨여부 고객이름
apple E001 Y 정소화
banana E002 N 김선우

{고객 아이디, 이벤트 번호} = PK

 

위의 테이블을 통해 

 

함수 종속 다이어그램1
함수 종속 다이어그램2

 

두 개의 함수 종속 다이어그램을 알 수 있다고 가정하겠습니다.

 

함수 종속은 크게 두 가지로 나눌 수 있습니다.

완전 함수 종속

일반적인 함수 종속은 완전 함수 종속을 의미합니다.

릴레이션에서 속성 집합Y(집합이란 1...N개의 속성들)가 속성 집합X(집합이란 1..N개의 속성들) 전체에 종속된다. 주의해야 할 점은 X집합 전체가 아닌 일부 속성에는 종속되지 않습니다.

 

표현: X -> Y

ex) {고객 아이디, 이벤트 번호} -> 당첨 여부

 

위에서 함수 종속 다이어그램 1에서는 완전 함수 종속을 만족하는 다이어그램1을 알 수 있네요.

{고객아이디} -> {고객이름, 등급}

 

참고로 함수 종속 아이어그램 1에서는 부분 함수 종속이 발생될 수 없습니다.

부분 함수 종속

릴레이션에서 속성집합 Y가 속성 집합 X의 전체!!!가 아닌 일부분에도 함수적으로 종속됨을 의미합니다.

표현: X -> Y

ex) {고객 아이디, 이벤트 번호} -> 고객 이름

 

여기서 주의할 점!이 있습니다. 만약 속성집합 X의 속성이 한 개라면? X.count == 1이므로 속성 한개 자체가 X 집합의 전체를 뜻함으로 완전 함수 종속에 해당됩니다. 이 경우에는 부분 함수 종속이 발생되지 않습니다.

 

그렇다면 언제 부분 함수 종속이 발생 가능할까요?

 

부분 함수 종속의 개념이 정의되기 위해서 속성 집합X(결정자)가 2개 이상의 속성들로 정의되어야 한다는 것입니다. 최소한으로 두 개의 속성이 결정자가 될 때, 그 두 속성 중 일부분의 속성(둘 중 하나)이 다른 속성Y를 가리킬 수 있게 됩니다.

그래서 위에서 보셨듯 

{고객 아이디, 이벤트 번호} 라는 X집합이 있을 때 진 부분 집합인 {고객 아이디}가 다른 속성 Y(고객 이름)을 결정하는 부분 함수 종속성이 될 수 있습니다. X의 일부분이 다른 속성 Y를 결정한다.

정규화. Normalization

정규화의 각 정규형은 데이터의 함수적 종속성(Functional Dependency)를 고려하며 진행되기 때문에 정규화를 진행하면서 종속성 패턴을 파악해서 적절한 정규형을 만족하도록 relation을 분해합니다. 이 과정을 거치다 보면 데이터 중복을 없애고 일관성과 무결성을 유지할 수 있습니다. 정규화는 정규형을 만족, 만드는 과정입니다.

 

비정규형인 릴레이션을 -> 제 1, 2 3 정규형과 BCNF, 4,5 정규형을 거칠 수 있습니다. 이번 포스트에선 제1,2,3 정규형과 BCNF까지만 공부했던 개념을 정리하려고 합니다.

비 정규형 릴레이션

지난 포스트 "데이터베이스 설계 | 요구사항분석, 개념적, 논리적 설계 정리"에서 개념적 설계 에서 논리적 설계를 거칠 때 ER 다이어그램에서의 엔터티와 엔터티간 관계를 릴레이션으로 변환했습니다. 아직 릴레이션으로 변환만 했지 정규형 작업을 거치지 않았습니다.

 

주문번호(PK) 고객이름 상품목록
001 김말이 상품A, 상품B, 상품C
002 홍길동 상품C, 상품F
003 강길태 상품A

 

위에 작성한 비 정규형 릴레이션은 Entity-Relationship Diagram에서 Entity를 릴레이션으로 변환한 경우라고 가정하겠습니다.

제1 정규화

제1 정규화는 제1 정규형(Normal Form)을 만족시키는 과정입니다.

 

목표: 릴레이션의 모든 속성이 더는 분해되지 않는 원자 값(atomic value)만 가지면 제1 정규형을 만족합니다.

(cf. 화학에서는 원자보다 더 작은 단위가 존재하긴 하지만 데이터베이스에서의 원자 값은 논리적으로 속성을 더 이상 분해하지 않는, 더 작은 단위의 구성요소가 없는 것을 의미합니다.)

 

위의 비 정규 릴레이션에서의 릴레이션은 상품목록 속성의 값들이 원자값을 만족하지 않습니다. 상품 목록에서 여러개의 속성값이 존재하기 때문입니다. 제1 정규형을 만족하도록 수정해야 합니다.

 

주문번호(PK) 고객이름 상품
001 김말이 상품A
001 김말이 상품B
001 김말이 상품C
002 홍길동 상품C
002 홍길동 상품F
003 강길태 상품A

제2 정규화

제2 정규화는 제2 정규형을 만족시키는 과정입니다.

 

목표: 릴레이션 내 모든 속성이 PK에 완전 함수 종속되야 합니다. 완전 함수 종속이 되기 위해서는 부분 함수 종속을 제거해야 합니다.

1. 제 2 정규형을 만족하기 위해서는 릴레이션을 제 1 정규형으로 만들어야 합니다.( 모든 속성은 원자 값을 가져야 합니다. )

2. PK에 의존하는 부분 함수 종속성을 찾고 이 부분 함수 종속을 가지는 속성들을 새로운 릴레이션으로 분해합니다. 그 때 새로운 릴레이션의 PK를 기존 릴레이션의 FK 속성으로 추가합니다.

 

함수종속 다이어그램

 

이 경우에는 PK 이외에도 X{고객 아이디, 이벤트 번호}의 진 부분 집합인 {고객 아이디}에서 {등급, 할인율}을 결정하는 부분 함수 종속이 존재합니다.

 

고객, 이벤트참여 릴레이션 | {고객 아이디, 이벤트번호} = pk
고객아이디 이벤트번호 당첨여부 등급 할인율
apple E001 Y silver 5%
banana E002 N gold 10%

 

이 경우 제 2 정규형을 만족하려면 부분 함수 종속성을 가지는 속성들을 새 릴레이션으로 분해 해야 합니다.

 

이벤트 참여 릴레이션 | {고객아이디, 이벤트번호} = pk
고객아이디(FK) 이벤트번호 당첨여부
apple E001 Y
banana E002 N
고객 릴레이션
고객아이디(PK) 등급 할인율
apple silver 5%
banana gold 10%

 

이렇게 이벤트 참여 릴레이션은 부분 함수 종속을 제거한 완전 함수 종속만 남아있게 됨으로 이벤트 참여릴레이션은 제2 정규형 과정을 만족하게 됩니다.

제3정규화

정규화를 거치는 과정은 결국 이상(삽입, 갱신, 삭제) 현상을 줄이기 위함인데 제2 정규형을 만들었음에도 이상현상이 발생될 수 있습니다. 그 경우가 위에서 분해했던 고객 릴레이션입니다. 그 이유는 이행적 함수 종속이 존재하기 때문입니다.

 

이행적 함수 종속이란 X -> Y, Y -> Z이면 X->Z가 성립되는 경우입니다.(Z가 X에 이행적 함수 종속되었다)

 

목표: 이행적 함수 종속성(Transitive Functional Dependency)을 제거해서 데이터 중복 최소화!

1. 제2 정규형 만족.

2. X->Y, Y->Z일 때 X->Z의 종속성이 성립합니다. 이 경우 이행적 함수 종속성 발생됩니다. 그래서 중간 종속성인 Y를 새로운 릴레이션으로 만듬으로 이행적 함수 종속 발생되지 않게 하고 분리된 릴레이션 간 관계를 맺어주기 위해 새 릴레이션의 PK를 기존 릴레이션의 FK로 추가합니다.

 

고객 릴레이션
고객아이디(PK) 등급 할인율
apple silver 5%
banana gold 10%

 

고객 릴레이션에서 제 3 정규형을 만족시키는 과정은 아래와 같습니다.

 

 

고객 릴레이션
고객아이디(PK) 등급(FK)
apple silver
banana gold
등급 릴레이션
등급(PK) 할인율
silver 5%
gold 10%

 

이렇게 될 경우 고객 릴레이션과 등급 릴레이션 모두 제 3 정규형을 만족하게 됩니다 :)

 

BCNF

제 3 정규형(3NF) 보다 한 층 높은 단계입니다.

목표: 제 3 정규형 테이블에 대해 모든 결정자후보키가 되도록 테이블을 분해하는 것입니다.

 

여기서 후보키!의 개념을 짚고 가야합니다.  후보키(Candidate Key)는 릴레이션에서 각 행, 튜플을 고유하게 식별하는데 사용될 수 있는 속성or 속성 집합입니다. 즉 후보키는 유일성, 최소성 두 가지 조건을 모두 만족해야 합니다. (cf. 실제로 여러 후보키 중 PK가 선정되면 나머지는 대체키가 됩니다.) 그리고 기본키!는 후보키 집합에 포함되는 개념입니다. (후보키들 중 하나가 기본키가 되기 때문 입니다.)

 

(cf. 이전 포스트에서 정리한 키 종류)

 

다시 돌아와서. 릴레이션에서 여러 개의 후보키가 존재하는 경우 제3 정규형을 만족해도 이상 현상이 발생될 수 있습니다.

 

 

1. X{고객아이디, 인터넷강좌} -> Y{담당 강사번호} 는 완전 함수 종속입니다.

2. X{담당 강사 번호}-> Y{인터넷 강좌}는 완전 함수 종속입니다.

 

cf. 이행적 함수 종속이란 X-> Y, Y->Z이면 X->Z입니다.
여기서 X는 고객아이디 ,인터넷 강좌이고 Y는 담당 강사번호입니다. 여기서 담당 강사번호Y-> Z인터넷강좌를 안다고 {고객아이디, 인터넷 강좌} -> {인터넷 강좌} 는 성립되지 않습니다.

 

다시 돌아와서. 위 사진에서 결정자는 {고객아이디, 인터넷강좌}, {담당 강사번호} 두 개입니다. 담당 강사 번호를 안다고 고객 아이디를 알 수 없습니다. 즉, 담당 강사 번호는 후보키(유일성, 최소성)의 자격이 충분하지 않습니다. 후보키는 위에서 설명했지만 모든 튜플 데이터를 식별할 수 있어야 하기 때문입니다.

 

즉 BCNF의 목표인 "모든 결정자후보키여야 한다." 정의를 만족하지 않습니다.

 

 

이를 해결하기 위해서 담당 강사번호를 후보키 범주 안에 있는 PK로 만들어야하는데 PK는 릴레이션에 하나 존재해야 함으로 새로운 릴레이션을 만들면 됩니다 +_+(크으..) 결국 PK는 후보키의 범주 안에 있는 '키'이기 때문입니다.

 

 

CustomerInstructorMapping relational schena
고객아이디(PK) 담당강사번호(FK)
InstructorCourseMapping relational schema
담당강사번호(PK) 인터넷강좌

 

이 경우는 위와 달리 각각의 릴레이션에서 결정자들이 후보키를 만족하게 됩니다 :)

 

틀린 부분 발견 시 댓글로 남겨주시면 정말 감사합니다.