본문 바로가기

CS?/데이터베이스보안실습

[복습]데이터베이스 정규화 -1 (Intro)

반응형

1. 데이터베이스 정규화란?

  1)데이터의 중복을 최소화

  2)삽입, 삭제, 수정 시 발생하는 이상 현상을 최소화

    

현상을 최소화 하기 위해 함수적 종속성과 기본키를 기반으로주어진 릴레이션 스키마를 분석하는 과정이다.

정규화 과정을 거치게 되면, 효율적으로 저장공간을 활용할 수 있고, 논리적으로 데이터를 저장하는 등의 릴레이션 스키마를 잘 설계했다는 의미를 지닐 수 있다.

 

 

정규화 과정

어떤 릴레이션 스키마가 어떤 정규형을 만족하는지 확인하는 일련의 테스트이다.

정규형에는 다음과 같은 종류가 있다.

(각 정규형은 숫자가 커질 수록 중복 데이터가 줄어든다.)

 

1. 제 1정규형 (1NF)

2. 제 2정규형 (2NF)

3. 제 3정규형 (3NF)

4. 보이스코드 정규형 (BCNF)

5. 제 4정규형 (4NF)

6. 제 5정규형 (5NF)

 

이번 포스팅은 1NF~3NF, BCNF에 필요한 개념을 정리하고,

다음 포스팅에서는 1NF~3NF, BCNF를 정리할 것이다.

(왜냐하면 아직 나머지 정규형은 배우지 않았기 때문이다!)

 

 

 

2. 정규형에 필요한 개념 정리 

 

먼저, 정규화 과정에 필요한 개념 몇가지를 정리하고 이어서 정규형에 대해 설명한다.

 

1)함수적 종속성

 -애트리뷰트들의 두 개의 집합 사이의 제약조건

 

사실 이 내용은 이해될 듯 하다가도 이해되지 않는 개념이다....

그래서 수학시간에 배운 함수의 기본 정의부터 다시 찾아봤다.

 

사진에서 보면

학번 하나와 이름 하나가 대응되는 것을 볼 수 있다.

학번을 X라 하고, 이름을 Y라 했을 때 X→Y가 성립하는 것이다.

즉, X의 값(원소)에 Y의 값(원소)가 오직 하나씩 대응할 때 X→Y의 함수라 한다.

 

다시 데이터베이스로 돌아와 이를 적용해보면

릴레이션에서 두 투플을 선택했을 때, t1[X]=t2[X]라면 반드시 t1[Y]=t2[Y]가 된다.

 

예를 들어, 인터넷 서점 회원정보 테이블의 일부가 있다고 가정하자.

회원번호 이름 주문번호 주문권수 가격
121212 김애용 12345 2 30000
121212 김애용 45678 3 50000
131313 이멍멍 23456 1 15000
141414 박꿀꿀 34567 5 80000

이 테이블에서 회원번호를 알게 되면 회원의 이름을 알 수 있다.

다시 말해, 회원번호와 이름 사이에는 함수적 종속성을 갖게 된다.

 

또한, 주문번호를 알게 되면 주문 권수나 가격을 알 수 있다.

다시 말해, 주문번호와 주문권수나 가격 사이에는 함수적 종속성을 갖게 된다.

 

이를 데이터베이스 정규화에서는 '함수적 종속성'이라 한다.

 

**함수적 종속성은 현재 릴레이션 상태(현재 보이는 테이블의 값)로 확실하게 알 수 없다.

 

그리고 함수적 종속성은 몇가지로 세분화된다.

 

 

 (1)완전 함수적 종속성

  -함수적 종속성 X→Y에서 X로부터의 애트리뷰트 A를 제거하면 함수적 종속성 X→Y가 성립되지 않는 경우

 

말이 어려우니 예제를 보자.

다시 인터넷 서점 회원정보 테이블로 돌아와 보면

회원번호 주문번호 주문권수 가격
121212 12345 2 30000
121212 4567 3 35000
131313 23456 1 15000
141414 34567 5 70000

회원번호 '121212'인 사람의 주문번호가 '4567'인 주문의 상세내역(주문권수, 가격)을 알고 싶다면

회원번호 121212와 주문번호 4567이 함께 있어야 해당 주문의 상세 내역을 알 수 있다.

만약 회원번호가 빠지게 될 경우 주문번호만 보고 누가 주문했는지 알 수 없게 되고,

주문번호가 빠지게 될 경우 원하는 주문의 상세내역을 알 수 없게 된다.

 

이를 완전 함수적 종속성이라 한다.

 

 

 (2)부분 함수적 종속성

  -함수적 종속성 X→Y에서 X로부터의 애트리뷰트 A를 제거해도 함수적 종속성 X→Y가 성립되는 경우

회원번호 이름 주문번호 주문권수 가격
121212 김애용 12345 2 30000
121212 김애용 45678 3 50000
131313 이멍멍 23456 1 15000
141414 박꿀꿀 34567 5 80000

이 테이블에서 {회원번호, 주문번호}를 X라고 했을 때 '이름'이라는 Y의 값을 알기 위해서는 '주문번호' 없이 '회원번호'만 있어도 된다는 뜻이다.

 

이를 부분 함수적 종속성이라 한다.

 

 

 (3)이행적 함수적 종속성

  -릴레이션 스키마에서 후보키도, 어떤 키의 부분집합도 아닌 애트리뷰트들의 집합 Z가 존재해, X→Z와 Z→Y가 만족될 때, X→Y를 이행적 함수적 종속성이라 부른다.

 

간단히 말해 X, Y, Z 애트리뷰트가 있을 경우 X를 알고 Z를 통해 Y를 알게 된다는 뜻이다.

회원번호 주문번호 주문권수 가격
121212 12345 2 30000
121212 4567 3 35000
131313 23456 1 15000
141414 34567 5 70000

예를 들어, 위 테이블에서 '주문번호'를 알면 '주문권수'를 알 수 있고, '주문권수'를 알고 있으면, '가격'을 알 수 있기 때문에 '주문번호'를 알면 가격을 알 수 있다.

 

이를 이행적 함수적 종속성이라 한다.

 

 

 

2)키

-릴레이션에 나오는 키는 키, 슈퍼키, 기본키, 보조키, 후보키 정도가 있다.

 (이 이상은 기억나지 않는다,,하하 피드백 주시면 감사하겠습니다)

 

 

 (1)슈퍼키: 두 튜플을 구분해 줄 수 있는 애트리뷰트의 집합

  즉, 테이블에서 행이 중복되지 않도록 구분해 줄 수 있는 모든 애트리뷰트 조합 경우의 수를 말한다. 그래서 엄청 많아질 수 있다.

 

 

 (2)키: 슈퍼키에서 한 애트리뷰트라도 빠지게 되면 슈퍼키가 되지 않게 할 수 있는 슈퍼키를 말한다

회원번호 이름 주문번호 주문권수 가격
121212 김애용 12345 2 30000
121212 김애용 45678 3 50000
131313 이멍멍 23456 1 15000
141414 박꿀꿀 34567 5 80000

이 테이블에서 두 가로 줄이 중복되지 않도록 해주는 애트리뷰트는 {회원번호, 주문번호}의 조합일 것이다. 그래서 {회원번호, 주문번호}는 가로줄을 유일하게 구분해주는 기준이 되며, 이 값이 슈퍼키에서 빠지게 될경우 슈퍼키는 더 이상 슈퍼키가 아니다.

 

 

 (3)후보키, 기본키, 보조키

  -후보키는 릴레이션 스키마에서 두 개 이상의 키를 가질 경우, 각각을 후보키라고 한다.

  후보키는 릴레이션을 유일하게 식별할 수 있는 모든 애트리뷰트가 해당된다.

  이 때, 후보키 중 하나를 기본키라 하고 나머지들을 보조키라 한다.

 

간단하게 도식(?)으로 정리하면 다음과 같다

 

 

 

3)비부가적 조인

 -분해한 릴레이션 조인을 수행한 결과에 원래 릴레이션에 없던 투플이 생기지 않는(가짜 투플이 생기지 않는) 특성

회원번호 이름 주문번호 주문권수 가격
121212 김애용 12345 2 30000
121212 김애용 45678 3 50000
131313 이멍멍 23456 2 20000
141414 박꿀꿀 34567 5 80000

예를 들어, 위의 테이블을 아래와 같이 두 테이블로 나눴다 하자.

이름 주문권수
김애용 2
김애용 3
이멍멍 2
박꿀꿀 5
회원번호 주문번호 주문권수 가격
121212 12345 2 30000
121212 45678 3 50000
131313 23456 2 20000
141414 34567 5 80000

만약, 두 테이블을 다시 하나로 합치고 싶을 때, '주문권수'를 기준으로 조인을 수행하게 될 경우, '이름'과 상관없이 '주문권수'가 맞기만 한다면 아무렇게나 조인을 수행하게 될 수도 있다.

 

원래 테이블에서는 '회원번호' 121212의 '이름' 김애용이 '주문번호' 12345에서 '주문권수'가 2이고,

'회원번호' 131313의 '이름' 이멍멍이 '주문번호' 23456에서 '주문권수'가 2인데,

 

테이블을 {이름, 주문권수} / {회원번호, 주문번호, 주문권수, 가격}으로 쪼갰다 다시 합칠 경우

'회원번호' 121212의 '이름' 이멍멍이 '주문번호' 12345에서 '주문권수'가 2이고,

'회원번호' 131313의 '이름' 김애용이 '주문번호' 12345에서 '주문권수'가 2이가 되는 가짜 투플을 만들 수 있다는 것이다.

 

그래서 이러한 가짜투플을 만들지 않는 조인이 비부가적 조인이다.

 


피드백은 언제나 대환영입니다 :)

반응형