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이가 되는 가짜 투플을 만들 수 있다는 것이다.
그래서 이러한 가짜투플을 만들지 않는 조인이 비부가적 조인이다.
피드백은 언제나 대환영입니다 :)
'CS? > 데이터베이스보안실습' 카테고리의 다른 글
[복습] 데이터베이스 보안 -1 (0) | 2019.11.19 |
---|---|
[복습] 고급 SQL 프로그래밍 (0) | 2019.11.18 |
[복습]데이터베이스 정규화 -4 (4NF, 5NF) (2) | 2019.11.15 |
[복습]데이터베이스 정규화 -3 (3NF, BCNF) (0) | 2019.11.13 |
[복습]데이터베이스 정규화 -2 (1NF, 2NF) (0) | 2019.11.12 |