슬라이드 1

Download Report

Transcript 슬라이드 1

6.1 도메인 제약
(domain constraints)
• 가장 기초적인 형태의 무결성 제약 조건
• 도메인(=범위) 제약
– 프로그래밍 언어: 변수마다 형(type)을 지정함
으로써, 변수가 가질 수 있는 값을 제한
– 보기: 정수형 변수는 실수형이나 문자열
(character string) 값을 가질 수 없다
• Script language – typeless 인 때도 …
• Compiler language – 보통은 type 있음
• SQL에서 도메인(=범위) 제약을 나타내는 방법
create table 대여 (
테이프번호 char(7),
고객번호
char(7),
대여일자
date,
대여시간
time
대여기간
integer );
- char, integer, date, time: type, 도메인 제약
- Date: ‘2002-02-15’
- Time: ‘08:01:02’
6.2 참조 무결성
(referential integrity)
6.2.1 외톨이 투플(dangling tuples)
– Join 을 할 때, 다른 투플과 결합하지 못하는
투플을 가리킴.
• 보기: 외톨이 투플
– 학생=(학번, 이름); PK={학번}
// PK=Primary key
– 수강=(학번, 과목번호); PK={학번, 과목번호}
FK1={학번}, FK2={과목번호}
// FK=Foreign key
- 과목=(과목번호, 과목 이름); PK={과목번호}
학생 학번
이름
---- ------ -----9902101 홍길동
9902102 박두리
9902103 김예슬
수강
학번
----- ------9902101
9902101
9902102
9902102
9944444
과목번호
------CS100
CS200
CS200
CS300
CS400
• SQL 자연 조인
select 학생.학번, 학생.이름, 수강.과목번호
from 학생, 수강
where 학생.학번 = 수강.학번;
• SQL 자연 조인 결과
------- ------학번
이름
------- ------9902101 홍길동
9902101 홍길동
9902102 박두리
9902102 박두리
--------과목번호
--------CS100
CS200
CS200
CS300
• 학생 테이블의 (99021032, 김예슬) 투플과
수강 테이블의 (9944444, CS400) 투플:
-> 자연 조인 결과에 전혀 참여하지 않음
• 자연 조인을 할 때 결과에 전혀 참여하지
않는 투플을 "외톨이 투플"이라고 부른다.
• 외톨이 투플이 되는 이유?
– 학번 9902103은 학생 표에만 있고, 수강 표에
는 없다.
– 학번 9944444는 수강 표에만 있고, 학생 표에
는 없다.
• 외톨이 투플 두 가지에 대한 분석
1) 공통 속성이 일차 키인 테이블에 있는 외톨이 투플
- 학생 표에서 PK = {학번}
– 있을 수 있는 일인지? 아니면 잘못된 것인지?
학생
학번
이름
9902103 김예슬
2) 공통 속성이 외래 키인 테이블에 있는 외톨이 투플
- 수강 표에서 FK = {학번}
- 있을 수 있는 일인지? 아니면 잘못된 것인지?
수강
학번
과목번호
9944444 CS400
6.2.2 자료 값을 바꿀 때 참조 무결성을 유지하려
면? (197 쪽)
학생
학번
9902101
9902102
9902103
수강
이름
홍길동
박두리
김예슬
학번
과목번호
9902101 CS100
9902101 CS200
9902102 CS200
9902102 CS300
9944444 CS400
• PK 인 표에서 tuple 을 ins, del, upd 할 경우가
있고,
• FK 인 표에서 tuple 을 ins, del, upd 할 경우가
있음.
• 따라서 모두 6 가지 경우를 검토해야 함.
• 참조 무결성 유지 방안: SQL 명령
– insert/delete/update 각각 분석
– 일차 키인 테이블과 외래 키인 테이블인 경우
각각 분석
• 3 * 2 = 6 가지를 분석
1) 학번이 일차 키인 학생 테이블에 투플을
넣을 때
1-1) 새로운 학번 9999999를 넣는다면:
• 신입생의 경우 일어날 수 있다.
1-2) 이미 있는 학번 9902101를 넣는다면:
• 들어가지 못함
– 그러나, 이것은 참조 무결성 문제가 아니라,
일차 키 조건 때문에 들어가지 못하는 것이다.
• 종합: 참조 무결성과 관련하여 별 문제 없
음.
2) 학번이 외래 키인 수강 테이블에 투플을
넣을 때
2-1) 학번이 일차 키인 학생 테이블에 없는 새
로운 학번 9999999를 수강 테이블에 넣으려
고 한다면
• 참조 무결성 때문에, 넣지 말아야 함
2-2) 학번이 일차 키인 학생 테이블에 있는 학
번 9902101를 넣으려고 한다면
• 반드시 이러해야 함. 아무 문제 없음
– 종합: 참조 무결성 확인해야 함 (2.1 때문에).
3) 학번이 일차 키인 학생 테이블에서
투플을 지울 때
3-1) 지우려는 학번이 (보기:
9902103), 학번이 외래 키인 수강
테이블에 없을 때,
• 문제가 없음 -> 학생 테이블에서 지운다
(그 학생이 수강 신청해 둔 과목이 없다)
3-2) 지우려는 학번이 (보기: 9902101), 학
번이 외래 키인 수강 테이블에 있을 때:
– 학생 테이블에서 투플을 지우기만 하면
참조 무결성 문제가 일어남.
– 처리 방안: 두 가지 가능성
가) 참조 무결성 때문에 지우지 않는다.
나) 수강 테이블에서 학번이 9902101인 모든 투플을
먼저 지운 뒤, 학생 테이블에서 학번이 9902101인
투플도 같이 지운다.
• 3) 종합: 참조 무결성 확인해야 함.
4) 학번이 외래 키인 수강 테이블에서 투
플을 지울 때
– 아무 문제 없음 (학생이 수강 취소하는 경
우임)
5)학번이 일차 키인 학생 테이블에서
투플(학번)의 값을 바꿀 때(update)
• Update a tuple 
a) 투플을 delete 한 뒤,
b) 투플을 insert 하는 과정으로 볼 수 있음.
5-1) 학번 9902101을, 학생 테이블에 이미
있는 학번 9902102로 바꾸려고 한다면:
• 바꾸지 못함 (참조 무결성 문제 아님, PK 문제임)
5-2) 학번 9902101을, 학생 테이블에 없는 새
로운 학번 9902109로 바꾸려고 한다면:
- 아래 5-2-가), 5-2-나) 두 가지 경우 검토
5-2-가) 바꾸려는 학번 9902101이, 학번이
외래키인 수강 표에 있으면, 그 학생이 이
미 수강 신청해 둔 과목이 있음. 두 가지
가능성.
가-1) 참조 무결성 때문에, 학번 안 바꿈
가-2) (1) 9902101의 정보를 베껴서 학생 표에
9902109 (새) 투플을 넣는다.
(2) 수강 표에서 9902101을 9902109로 바꾼 뒤,
(3) 학생 표에서 9902101 투플을 지운다.
5-2-나) 바꾸려는 학번 9902101이, 학번이
외래키인 수강 표에 없으면,
- 그 학생이 이미 수강 신청해 둔 과목이
없으므로,
- 학번을 9902101 을 9902109 로 바꾼다.
* 5) 종합: 5-2-가) 때문에 참조 무결성 확
인해야 함
6) 학번이 외래 키인 수강 테이블에서 투플
(학번)을 바꿀 때
6-1) 학번이 일차 키인 학생 테이블에 없는
새로운 학번(보기: 9999999)으로 학번을
바꾸려고 한다면:
• 참조 무결성 때문에, 바꾸어서는 안
됨
6-2) 학번이 일차 키인 학생 테이블에 있는 학
번(보기: 9902102)으로 바꾸려고 한다면:
아래 6-2-가, 6-2-나 두 가지 경우 검토
가) (새 학번, 과목 번호)가 이미 수강 표에 있
다면, 이미 수강 신청되어 있으므로, 학번을 바
꾸지 못 함
(그러나 ref. integrity 때문에 아니라, PK (학
번, 과목번호) 제약 조건 때문에 못 바꿈)
나) (새 학번, 과목 번호)가 수강 표에 없다면,
문제가 없으므로 학번의 값을 바꿈.
• 6) 종합: 6-1) 때문에 참조 무결성 확인해
야 함.
6.2.3 SQL에서 참조 무결성을 나타내기
(200 쪽)
– 외래 키가 있는 스키마를 만들 때,"foreign
key" 절에 외래 키에 해당하는 속성의 집합
(속성 하나가 아님)을 괄호(=묶음) 안에 나타
내고
– foreign key 절에 나온 외래 키의 속성 집합이
일차 키가 되는 스키마 이름을 "references"
다음에 나타낸다
create table 학생 (학번 char(9),
이름 char (20), 학과번호 char(3),
primary key (학번)
);
create table 수강 (학번 char(9),
과목번호 char (7),
primary key (학번, 과목번호),
foreign key (학번) references 학생
);
?? 만일 수강 표를 먼저 만들고자 하면 ??
6.3 함수적 종속
(FD: functional dependencies)
6.3.1 함수적 종속은 정규화 이론 및 설계의
바탕(201 쪽)이 되는 중요한 개념임
– 관계형 데이터베이스를 설계할 (design) 때는
스키마가 정규형(NF: normal form)을 따르도
록 한다.
– 많이 쓰는 정규형은 BCNF 또는 3NF이다.
– 정규형은 함수적 종속을 써서 정의
• 함수적 종속의 활용
 함수적 종속을 써서 여러 가지 정규형을
정의 함.
 정규화: 정규형을 따르지 않는 스키마는
여러 개의 작은 스키마로 나누어서 각 스키
마가 정규형을 따르도록 함
• 함수적 종속: 수퍼키 개념을 일반화한 것
– 달리 말하면, 수퍼키는 함수적 종속의 특별한
경우임
– 사실은 함수적 종속도 제약 조건(constraint)
의 한 종류
• SQL이 함수적 종속 제약 조건을 바로 지원하지
않는 이유
– 첫째, BCNF 정규형을 따르는 스키마의 경우:
일차 키의 값이 같은 투플이 없으므로, 굳이 함수적 종속
을 따로 나타내지 않아도 됨 (보기: 학생 표에서는 학번
이 같은 투플이 없다)
– 둘째, 그 밖에 함수적 종속을 나타낼 필요가 있을 경우:
함수적 종속을 유지하려면 시간이 꽤 걸리는데,
사용자들이 무분별하게 쓸 것을 우려하여
제공하지 않는 것으로 보임 (어디까지나 짐작임)
(투플 하나 고칠 때마다, 함수적 종속 확인하려면 …)
• 함수적 종속을 유지하는 방안 (202 쪽 아
래)
– 투플 하나를 고치려고 할 때마다, 함수적 종속
을 지키는지 않는지 확인해야 한다.
– 함수적 종속의 왼쪽과 오른쪽에 해당하는 속
성만 추출한 뒤,
 왼쪽이 같으면서 오른쪽이 다른 것이 있는지
확인해야 함
 확인 과정 : 정렬(sort). 임시 색인, 해쉬
6.3.2 함수적 종속의 기본 개념 (203 쪽)
– 수퍼키의 개념 (복습): 함수적 종속으로 보기.
– [정의: 수퍼키] 관계형 스키마 R이 있고, 그
스키마에 따라 인스턴스 r이 있고, 그리고 스
키마 R의 속성 가운데 일부로 이루어진 부분
집합 K가 있을 때:
. 만일, 인스턴스 r에 있는 모든 투플의 짝
t1과 t2에 대하여,
. t1과 t2가 같지 않을 때 t1.K과 t2.K도 같
지 않다면 (= 다시 말하여, K 가 딱 한 투플
을 가리킬 수 있다면)
 K는 스키마 R의 수퍼키이다.
보기: (203 ~ 204 쪽)
1)학생 테이블: {학번} – SK
- 서로 다른 두 투플에서 {학번}이 같을 수
있을까?
2) 학생 테이블: {학번, 이름} – SK
3) 학생 테이블: {이름} – SK ?
- 서로 다른 두 투플에서 {이름}이 같을 수
있을까?
• 수강 표에서: 수강 = {학번, 과목 번호}
1) {학번}이 같은 투플 두 개가 있을까?
- SK 아님?
* {학번}: 학생 표에서는 SK 이지만,
. 수강 표에서는 SK 가 아님.
 [중요] 스키마가 주어지지 않은 상태에
서, 어떤 속성 집합 (보기: {학번})이 SK
이다/아니다 라고 말할 수 없다.
2) {과목 번호}가 같은 투플 두 개가 있을까?
- SK 아님?
3) {학번, 과목 번호}가 같은 투플 두 개가
있을까?
- SK 아님?
[복습 끝]
• 함수적 종속의 정의 (205 쪽)
– α ,β 는 속성의 집합이라고 하자.
만일 테이블의 인스턴스 r에 있는 모든 투플의
짝 t1, t2에 대하여,
t1. α = t2. α 이면, t1. β = t2. β 라면,
그 스키마에 함수적 종속 α  β 가 있다고 말함.
- 쉽게 달리 말하면,
1) 표에서 α 속성 값이 나오는 투플이 딱 하나뿐
이든지,
2) α 속성 같이 같은 여러 투플에서, β 속성 값
도 같으면,
 “함수적 종속 α --> β” 가 있다
학생 = {학번, 이름}, PK = {학번}
가) {학번} -> {이름}: FD 가 있다/없다?
- CK (PK 포함) -> 그 스키마에 있는 속성
의 어떤 부분 집합이라도 (이런 FD 는 늘
있다, 이유: CK 값이 같은 투플이 두 개 있
을 수 없기 때문에…)
나) {이름} -> {학번}: FD 가 있다/없다?
다) {학번} -> {학번}: FD 가 있다/없다?
라) {학번, 이름} -> {이름}: FD 가 있다/없
다?
- 다), 라): 뜻이 없는 (trivial) FD
보기:
- 206 쪽 아래, 수강 스키마에서
가) {학번}  {과목번호}
나) {과목번호}  {학번}
다) {학번, 과목번호}  {학번}
- 207 쪽 아래, 수강_학생 스키마에서
가) {과목번호}  {과목이름}
나) {과목이름}  {과목번호}
다) {학번, 과목번호}  {성적등급}
라) {과목번호}  {성적등급}
6.3.3 함수적 종속과 수퍼키 (209 쪽)
– 함수적 종속은 수퍼키 개념을 일반화한 것
– 수퍼키는 함수적 종속의 특별한 경우
– 수퍼키의 개념을 함수적 종속으로 정의할 수
있음.
• [정의: 수퍼키]
– 주어진 스키마 R이 있고, R에 있는 속성의 부분
집합 K가 있을 때,
– 만일 함수적 종속 K --> R이 있으면,
– K를 수퍼키라고 한다.
• 함수적 종속의 오른쪽이 스키마 전체(R)일
때,
함수적 종속의 왼쪽 부분을 수퍼키라고 한다.
6.3.4 함수적 종속의 활용 방안 (209 쪽)
– 두 가지 다른 목적을 위해 쓸 수 있음.
1) 함수적 종속을 써서 테이블에
insert/update을 실행하고자 할 때, 함
수적 종속이 지키질 때에만
insert/update 명령이 실행되도록 제
한할 수 있다.
2) 함수적 종속을 써서 어떤 테이블의
인스턴스가 주어진 함수적 종속을 지
키는지 안 지키는지를 확인할 수 있다.
6.3.5 함수적 종속은 테이블의 인스턴스만
보고는 결정할 수 없어 (210 쪽)
– 함수적 종속은 데이터베이스를 설계할 때,
. 데이터베이스 설계자가 각 스키마에서 지켜져
야 할 함수적 종속을 결정한다.
- 스키마만 있고 인스턴스가 없는 때에, 설계자가
현실의 제약을 분석하여 FD가 있어야 할지 아닌지
결정해야 함.
- [중요] 인스턴스가 FD를 어기는지 아닌지 판단
할 수는 있지만, 거꾸로 인스턴스를 보고 FD를 이
끌어낼 수는 없다는 뜻.
- 잘못 설계하면, 스키마, 인스터스 만든 뒤 혼란
6.3.6 뜻이 없는 함수적 종속(trivial FD) (211 쪽)
– 정의
• α ,β 는 속성의 집합
• β ⊆ α 일때 , α --> β 를 뜻이 없는 함수적 종속이라고
함.
• 쉽게 말하여, 오른쪽이 왼쪽의 부분 집합 (α = β인 때도
포함, β가 공집합인 때는 뺌)인 함수적 종속을 가리킨다
• 자세히 분석하지 않더라도, 모든 테이블에서 늘 유효한
함수적 종속을 말함
보기: {학번} -> {학번}
{학번, 이름} -> {학번}
{학번, 이름} -> {이름}
6.4 함수적 종속 집합의 클로져(=울타리)
(closure of a set of FDs) (213 쪽)
• 함수적 종속 집합 SFD(a set of FDs)가 주
어졌을 때
– 거기에 포함되어 있지는 않지만 유효한 다른
함수적 종속을 이끌어 낼 수 있다.
– 그렇게 이끌어 낸 함수적 종속은 SFD에
묵시적으로 (implicitly) 포함되어 있다고 말한
다.
• 함수적 종속 집합 SFD가 있을 때
– SFD의 클로져(=closure, 울타리) SFD+ 는
– SFD에 묵시적으로 포함되어 있는 모든 함수
적 종속까지도 포함하는 집합
• 함수적 종속을 이끌어내는 Armstrong 규
칙 세 개: A1, A2, A3
– 그리스 글자(α ,β , ...)는 각각 속성의 집합을
나타낸다.
– αβ 는 α∪β 이다 (합집합)
– 영어 대문자 A는 속성 A만으로 이루어진 속
성의 집합 {A}를 나타낸다. (B, C, ...도 마찬
가지)
– 영어 대문자 두 개를 붙인 AB는 속성 A와 B
로 이루어진 속성의 집합 {A, B}를 나타낸다
AB: {A, B}. (AC, BC, ... 등도 마찬가지)
• 규칙 A1. 되돌아오기 규칙 (214 ~ 215 쪽)
(reflexivity rule:뜻이 없는 함수적 종속= trivial
FD)
• 규칙 A2. 붙이기(늘리기) 규칙
(augmentation rule)
• 규칙 A3. 옮겨가기 규칙(transitivity rule)
6.4.2 함수적 종속을 이끌어내는 규칙 3 개
더 (215 쪽)
– B4. 더하기 규칙(union rule)
– B5. 나누기 규칙(decomposition rule)
– B6. 옮겨가기 비슷한 규칙
(pseudotransivity rule)
6.5 규범적 카버(=덮개)
(canonical cover) (217 쪽)
• 주어진 함수적 종속 집합 SFD에서, 어떤
FD의 왼쪽 또는 오른쪽에 있는 어떤 속성
을 뺐을 때,
그 클로져 SFD+가 바뀌지 않을 때,
그 빠진 속성을 군더더기 (extraneous) 속
성이라고 한다.
== 군더더기 속성 보기 1:
FD1:
{학번}  {학번, 이름}
==> FD1-1: {학번}  {이름}
SFD1 = {FD1, FD2, FD3}
SFD2 = {FD1-1, FD2, FD3}
SFD1+ = SFD2+
- 따라서 FD1의 RHS의 학번은 군더더기 속성
= 군더더기 속성 보기 2:
FD3: {학번, 과목 번호, 이름}  {성적 등급}
==> FD3-1: {학번, 과목 번호}  {성적 등급}
SFD1 = {FD1, FD2, FD3}
SFD2 = {FD1, FD2, FD3-1}
SFD1+ = SFD3+
- 따라서 FD3의 LHS의 이름은 군더더기 속성
• [정의: 규범적 카버(=덮개) (SFDc)]:
– 규범적 카버(=덮개)는 다음 세 가지 조건을 만
족시켜야 한다.
1) 주어진 함수적 종속 집합 SFD에 대한 규
범적 카버(=덮개) SFDc는
– SFD가 SFDc에 있는 모든 함수적 종속을 묵시
적으로 포함하고,
– 또한 SFDc가 SFD에 있는 모든 함수적 종속을
묵시적으로 포함하는 그러한 함수적 종속의
집합 SFDc이다.
※ 달리 말하면, 주어진 SFD에 대하여
SFD+ = (SFDc)+이다
2) SFDc에 있는 어떤 함수적 종속에도 군더
더기 속성이 없다
3) SFDc에 있는 모든 함수적 종속의 왼쪽은
유일하다.
• 프로그램으로 SFDc 찾기가 쉽지 않다.
• SFDc 는 유일하지 않다!!!
 실제로 SFDc를 찾기보다는, SFDc 개념
이해가 중요 ( 3NF decomp 때 필요함)
6.6 함수적 종속을 SK의 관점에서 바라보기
(교재에는 나오지 않는 내용임)
= 함수적 종속의 정의 (205 쪽)
– α ,β 는 속성의 집합이라고 하자.
- 만일 테이블의 인스턴스 r에 있는 모든 투플의 짝
t1, t2에 대하여,
. t1. α = t2. α 이면, t1. β = t2. β 라면,
. 그 스키마에 함수적 종속 α --> β 가 있다.
== 함수적 종속을 SK의 관점에서 바라보기
- SK를 일반화한 것이 FD
- FD의 특수한 경우가 SK
FD를 SK의 관점에서 바라보기
• 함수적 종속의 정의
- 원래 스키마: table R1 (α U β U δ) 일 때.
– α , β, δ 는 속성의 집합이라고 하자.
- “일반적으로” (특정 인스턴스에서만이 아니라)
R1 (α U β U δ)  [project] R2 (α U β)에서 겹
치는 투플을 지운 뒤 R2에서 α가 SK 이면,
R1스키마에 함수적 종속 α --> β 가 있다.
= 원래 정의: R1의 모든 투플의 짝 t1, t2에 대하여,
. t1. α = t2. α 이면, t1. β = t2. β 라면,
. R1 스키마에 함수적 종속 α --> β 가 있다.
• 207 쪽의 보기에 이 개념을 적용해 보자.
= 수강_학생 표: PK={학번, 과목번호}
(학번, 과목 번호, 과목 이름, 성적 등급)
101, CS111, 컴 개론,
A+
101, CS222, 프로그래밍, A0
102, CS111, 컴 개론,
A0
102, CS222, 프로그래밍, B103, CS111, 컴 개론,
B0
• 수강 학생표에 FD:{과목 번호}  {과목 이름} 있을 수
있는지?
- 과목표 = project {과목 번호, 과목 이름}
(학번,
과목 번호, 과목 이름, 성적 등급)
101,
CS111,
컴 개론,
A+
101,
CS222,
프로그래밍, A0
102,
CS111,
컴 개론,
A0
102,
CS222,
프로그래밍, B103,
CS111,
컴 개론,
B0
• 겹치는 투플을 지우고 나면
과목표=(과목 번호, 과목 이름)
CS111, 컴 개론
CS222, 프로그래밍
• 과목표=(과목 번호, 과목 이름)에서
{과목 번호}가 SK 이므로
==>
R1 (학번, 과목 번호, 과목 이름, 성적 등급)
에서,
- FD {과목 번호}  {과목 이름} 있다.
• 수강=(학번, 과목 번호, 과목 이름, 성적
등급)에서 FD: {학번}  {과목 번호} ??
판정 방법: 일반적으로
R2 = (학번, 과목 번호)에서 {학번}이 SK인
지 확인하면 된다.
101,
101,
102,
102,
103,
CS111,
CS222,
CS111,
CS222,
CS111,
컴 개론,
프로그래밍,
컴 개론,
프로그래밍,
컴 개론,
A+
A0
A0
BB0
• R2 = (학번, 과목 번호)에서 {학번}이 SK?
101, CS111,
101, CS222,
102, CS111
102, CS222,
103, CS111,
* 참고: 위에서는 겹치는 투플이 없음.
• R2에서 {학번} 이 SK? 아님
 R1 (학번, 과목 번호, 과목 이름, 성적 등
급)에서, FD: {학번}  {과목 번호} 없음
• 만일 어떤 FD가 있다면,
1) 주어진 인스턴스가 그 FD를 어기지 않는
지
2) 또는 주어진 인스턴스가 그 FD를 어기는
지 판정할 수가 있음.
- 그러나 주어진 인스턴스만 보고 어떤 FD
가 있는지 판정할 수는 없음.
- 인스턴스가 없을 때에, DB 설계자가 FD가
있는지 (있어야 할지) 없는지 결정해야 함.