일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 단계별로 풀어보기
- 1546
- Remix
- 2448
- 세 수
- 별 찍기 - 11
- if문 사용해보기
- Mist
- 1065
- 시험 성적
- 10817
- 더하기 사이클
- 솔리디티
- 블록 체인
- 백준
- 이더리움
- 알고리즘 문제풀이
- 가상 화폐
- 10871
- 비트 코인
- 1110
- 평균은 넘겠지
- 1%d
- Baekjoon
- 함수 사용하기
- 그대로 출력하기
- Dapp
- 자바스크립트
- for문 사용해보기
- X보다 작은 수
- Today
- Total
블링블링 범블링
[DB 5장] 관계형 구조, 연산 기호 본문
관계형 데이터베이스의 구조
관계형 데이터 베이스는 테이블의 집합이며 관계형 데이터 베이스에서는 관계라는 말 자체를 테이블과 동일하게 본다.
그에 관한 용어를 정리해보겠다.
이 표하나를 통채로 관계(=테이블)이라고 한다. | ||||
하나의 열은 속성이라고 한다. | 속성2 | 속성3 | 속성4 | 속성5 |
이 한줄은 속성속성의 데이터가 모여서 이루어진다. 이를 투플이라고 한다. | ||||
|
|
|
|
|
|
|
|
|
|
데이터 베이스 공부를 하며 권하는 용어 | 수학용어 | 일반용어 |
테이블 OR 관계 | 관계 | 테이블 |
투플 | 투플(TUPLE) | 가로 행(ROW) |
속성 | 속성 | 세로 열(COLUMN) |
속성의 도메인(=범위), 투플 변수
투플 변수라는 용어가 있는데 이는 어느 시점의 어떤 테이블이 있다고 할 때 그 테이블의 하나의 투플을 가리키는 변수이다.
가리킨다라는 말에서도 알 수 이듯이 C의 포인터와 비슷한 개념이다.
아이디 | 패스워드 | 캐릭터 |
법사법사 | 654321 | 마법사 |
전사전사 | 123456 | 전사 |
도둑도둑 | 123456 | 도둑 |
같은 테이블이 있다고 할 때. Temp투플변수 라는 이름의 투플변수를 선언했다면.
Temp투플변수 = 어느 시점의 어떤 테이블의 아이디(일차키)가 법사법사인 투플;
Char Temp아이디[10] = Temp투플투플.아이디;
라고 한다면 Temp아이디에 담겨있는 아이디는 법사법사일 것이고 Temp아이디.패스워드는 654321. Temp아이디.캐릭터는 마법사일 것이다.
이때 관계형 데이터 베이스는 속성이 단순하고 값 또한 하나이다. 이런 경우의 테이블의 스키마를 1NF라고 하는데 제1정규형이라고 부른다. 즉 관계형 데이터베이스는 모두 1NF이다.
테이블 스키마와 테이블 인스턴스
데이터베이스는 테이블의 집합인데. 테이블을 만들려면 스키마를 먼저 만들고 그 안에 데이터를 입력하여 투플을 넣어야 한다. 즉 스키마는 테이블을 만들기 위한 틀이다.
스키마를 구성하기 위해서는 다음과 같은 내용이 필요하다.
1. 그 데이터베이스 안에서 고유한 테이블의 이름.
2. 그 테이블에 들어있는 속성의 이름 목록
3. 각 속성에 대한 도메인(=범위)
그러므로 스키마를 생성하는 create table명령은 위의 내용을 모두 포함한다.
Create table 유저(테이블의 이름) {아이디(속성) char(10) (도메인), 패스워드(속성) char(10) (도메인), 캐릭터(속성) char(10) (도메인) }
식으로 유저라는 테이블의 이름 각 3가지 속성의 속성정의 그리고 각 속성의 도메인을 정한다.
틀이 있으면 안에 내용을 넣고 찍어내면 붕어빵처럼 테이블들이 찍혀 나오는데 이렇게 찍혀 나온 테이블들을 인스턴스라고 한다.
데이터 베이스 스키마 데이터 베이스 인스턴스
데이터베이스는 하나의 스키마 하나의 인스턴스로 이루어져있지 않다. 데이터베이스는 수많은 스키마와 그 스키마에서 찍혀져 나오는 인스턴스들로 이루어진다. 바로 하나의 데이터베이스를 이루는 모든 스키마를 데이터베이스 스키마라고 하며 찍혀 나온 모든 인스턴스들을 데이터베이스 인스턴스라고 한다.
언제나 강조하지만 스키마는 함부로 바뀌지 않는다. 스키마를 하나더 만들고 말지 이미 만들어진 테이블의 스키마를 변경한다는 것은 기존의 인스턴스들을 모두 폐기할 수도 있는 일이다.
키(Keys)
개체-관리 모델에서 사용했던 수퍼키, 후보키, 일차키, 외래키 개념은 관계형 데이터베이스에서도 다 사용이 가능하다.
후보키(일차키를 포함하여)는 테이블의 인스턴스에 대한 제약 조건이다. 다시 말하여, 허용되는 인스턴스와 허용되지 않는 인스턴스를 규정한다. 같은 값이 있어서는 안되는 수퍼키의 제한을 보자면 만약 테이블에 존재하는 값이.
관계 대수(relational algebra)
관계형 데이터 베이스도 질의어가 존재하며 이런 질의어의 이론적 바탕이 되는 것이 관계 대수와 관계 해석인데 여기서는 관계 대수에 대해서 알아보겠다.
보통의 덧셈, 뺄셈, 곱셈, 나눗셈 연산은, 주어진 수 두 개에 각 연산을 하며, 그 결과는 수 하나가 나온다. 마찬가지로 관계 대수 연산도 연산이기 때문에 데이터 베이스의 연산이므로 연산에는 테이블이 들어간다.
변수 : 테이블 하나 또는 2개
결과 : 테이블 하나
관계 대수의 기본 연산은 다섯개이다. 이 연산만 있으면 관계 대수에서 할 수 있는 모든 일을 나타낼 수 있다. 기본 연산말고 다른 연산이 더 있긴 하지만, 그런 연산은 기본 연산 다섯 개로 다 나타낼 수 있다.
예를 들자면 테이블A * 4라는 연산이 있다고 하면 테이블A + 테이블A + 테이블A + 테이블A라고 할 수 있을 것이다.
그럼 기본연산 5가지에 대해서 알아보자.
선택(SELECT) 연산
속성 추출(PROJECT) 연산
합집합(UNION) 연산
차집합(SET DIFFERENCE) 연산
카티전 곱(CARTESIAN PRODUCT) 연산
기본 연산 말고 다른 연산으로는 다음과 같은 것이 있는데, 이런 연산은 모두 위의 연산 다섯만으로 나타낼 수 있다.
교집합(SET INTERSECTION), 자연조인 (NATURAL JOIN), 나누기(DIVISION)
그럼 이제 하나한씩 알아보도록 하자.
선택(SELECT) 연산 -> 입력테이블 1개 결과 테이블 1개
선택 연산은 테이블 한 개를 읽어서, 조건(PREDICATE, CONDITION)을 만족하는 투플만으로 이루어진 테이블을 결과로 내보내는 것이다.
선택연산은 σ시그마라는 기호로 나타낸다. 선택 연산은 σ p(R)과 같이 나타낸다. p는 조건이고 R은 테이블이며 결과 또한 테이블 이다. 입력 테이블과 결과 테이블의 스키마는 같지만, 결과 테이블에 있는 투플의 수는 입력 테이블에 있는 투플의 수보다 작을 수도 있다.
예제 테이블을 보자.
아이디 | 패스워드 | 캐릭터 |
법사법사 | 654321 | 마법사 |
전사전사 | 123456 | 전사 |
도둑도둑 | 123456 | 도둑 |
위의 학생 테이블에서 아이디가 전사전사인 투플만 선택하려면 다음과 같이 한다.
σ 아이디 = “전사전사” (유저)
그럼 결과로 테이블이 나올 텐데 다음과 같이 나오게 된다.
아이디 | 패스워드 | 캐릭터 |
전사전사 | 123456 | 전사 |
셀렉트 연산이 어느 정도 이해가 갈 것으로 보인다. SLECT연산으로는 투플을 통째로 가져오게 된다.
** 참고로 관계대수의 SELECT 연산과 SQL의 SELECT 연산은 다르다. SQL의 SELECT 연산은 관계대수의 PROJCET와 같다.
속성추출 연산 (π, PROJECT): 입력테이블 1개, 결과 테이블 1개
속성 추출 연산은 테이블 한 개를 읽어서, 원하는 속상만으로 이루어진 테이블을 결과로 낸다.
PROJECT연산은 비추다라는 뜻인데, 테이블의 위에 어떤 속성은 감추고, 어떤 속성은 그대로 보이게 하여, 원하는 속성만 보이도록 하는 연산을 가리킨다.
속성 추출 연산은 π ATT1, ATT2 … (R)식으로 나타낸다. 여기서 ATT1, ATT2는 원하는 속성 R은 입력 테이블이며, 결과도 또한 테이블이다. 입력 테이블에 있는 모든 속성을 π뒤에 적는 예외적인 경우(당연히 모든 속성이므로 실제 연산은 일어나지 않는다)를 빼고는, 입력 테이블의 스키마와 결과테이블의 스키마는 다르다. 거의 모든 경우, 입력 테이블에 있는 속성의 수보다 결과 테이블에 있는 속성의 수가 적다.
아이디 | 패스워드 | 캐릭터 |
법사법사 | 654321 | 마법사 |
전사전사 | 123456 | 전사 |
도둑도둑 | 123456 | 도둑 |
π 아이디(유저)
결과는 예상이 될것이다.
아이디 |
법사법사 |
전사전사 |
도둑도둑 |
다른 연산도 한번 해보자.
π 아이디, 패스워드(유저)
아이디 | 패스워드 |
법사법사 | 654321 |
전사전사 | 123456 |
도둑도둑 | 123456 |
만약 테이블이 아래와 같을 땐 어떨까?
테이블 명 : 예제 테이블 1-1 | |
아이디 | 패스워드 |
법사법사 | 654321 |
법사법사 | 125648 |
전사전사 | 564879 |
도둑도둑 | 123456 |
Π 아이디 (예제 테이블 1-1)
아이디 |
법사법사 |
전사전사 |
도둑도둑 |
결과를 보면 알겠지만 속성추출 연산을 하면 원래 입력 테이블보다 결과 테이블에서 투플의 수가 줄어든다고 잘못 생각할 수도 있는데 실제 연산에 따라서 다르다. 즉 하나의 속성에 입력된 투플에 같은 값이 없다면 당연히 결과 테이블의 투플은 달라지지 않는다.
이것을 보고 이번에는 혼합 연산을 해보자.
Π 패스워드 (σ 아이디 = “전사전사” (예제 테이블 1-1))
수학연산과 같다 먼저 가로안의 연산을 먼저 하므로 아이디가 전사전사인 투플이 뽑혔을 것이다.
이 상황에서 패스워드만 뽑아내는 연산을 하면 564879의 패스워드가 나올 것이다. 테이블로 나올 것이므로 다음과 같을 것이다.
패스워드 |
564879 |
합집합 연산합집합 연산(∪, UNION) : 입력테이블 2개, 결과 테이블 1개
위에서 선택 연산과 속성 추출 연산에서는 입력 테이블이 하나였는데, 합집합 연산의 입력 테이블 수는 두 개다. 말그대로 두개의 테이블을 합하는 연산을 행한다. 일단 먼저 간단한 합집합 연산을 해보자.
ID테이블1 |
아이디 |
법사법사 |
전사전사 |
도둑도둑 |
ID테이블2 |
아이디 |
힐러힐러 |
탱커탱커 |
도둑도둑 |
ID테이블1 ∪ ID테이블2을 하게 되면
ID테이블 결과 |
아이디 |
법사법사 |
전사전사 |
도둑도둑 |
힐러힐러 |
탱커탱커 |
결과테이블을 보면 알겠지만. 겹치는 투플은 테이블에서 제외된다.
그럼 다음과 같은 테이블은 가능할까?
ID테이블1 | |
아이디 | 패스워드 |
법사법사 | 1234568 |
전사전사 | 856412 |
도둑도둑 | 987523 |
ID테이블2 | |
아이디 | 캐릭터 |
법사법사 | 전사 |
전사전사 | 마법사 |
도둑도둑 | 궁수 |
위의 테이블 사이의 합집합 연산은 불가능하다. 합집합을 하기 위해서는 두개가 호환성(COMPATIBLE)이 있어야 하는데, 테이블 R1과 R2가 호환성이 있으려면 다음의 2가지 조건을 만족시켜야 한다.
0. 테이블 TABLE1과 TABLE2가 있다고 한다.
1. TABLE1과 TABLE2의 속성의 수가 같아야 한다.(속성수를 N이라고 하자.)
2. TABLE1.A1과 TABLE2.A1의 도메인(= 범위, 자료형)이 같고 TABLE1.A2와 TABLE2.A2의 도메인이 같고 TABLE1.A(N)와 TABLE2.A(N)의 도메인 범위가 같아야 한다.
즉 위의 예는 당연히 합집합 연산이 되지 않는다. 하지만 속성의 수가 아무리 많아도 속성의 도메인이 같다면 합집합 연산이 된다.
ID테이블1 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
탱커탱커 | 마법사 |
도둑도둑 | 궁수 |
ID테이블2 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
법사법사 | 격투가 |
마수마수 | 마수사 |
다음과 같은 테이블을 합집합 연산을 하게 되면
ID테이블 결과 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
탱커탱커 | 마법사 |
도둑도둑 | 궁수 |
법사법사 | 격투가 |
마수마수 | 마수사 |
와 같은 테이블이 나오게 될 것이다.
차집합연산(-, SET DIFFERENCE):입력 테이블 2개 결과 테이블 1개
차집합은, 첫째 테이블에 있는 투플 가운데, 둘째 테이블에도 있는 투플을 뺀 나머지 투플만 결과 테이블에 나오다.
이때 둘째테이블에만 있는 투플은 차집합 연산에 영향을 주지 않는다.
ID테이블1 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
탱커탱커 | 마법사 |
궁수궁수 | 궁수 |
ID테이블2 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
탱커탱커 | 마법사 |
용사용사 | 용사 |
차집합 연산도 합집합과 마찬가지로 두개의 테이블의 호환성이 있어야만 가능하다.
다행이 위의 두 테이블은 호환성이 있으니 차집합 연산을 해보도록 하자.
ID테이블1 - ID테이블2 =
ID테이블결과 | |
아이디 | 캐릭터 |
궁수궁수 | 궁수 |
1. 첫번째 테이블에 있는 투플 가운데 둘째 테이블에도 있는 투플을 뺀다.(전사전사, 탱커탱커)
2. 둘째 테이블에만 있는 투플은 차집합 연산에 영향을 주지 않는다.(용사용사)
3. 나머지 투플만 결과 테이블에 나온다.(궁수궁수)
4. 차집합 연산은 보면 알겠지만 교환 법칙이 성립하지 않는다. T1 – T2 = TR이 T2 – T1 = TR 되지 않는다.
카티전 곱(X, CARTESIAN PRODUCT) : 입력 테이블 2개, 결과 테이블 1개
카티전 곱은 이것만 따로 쓰는 일은 아주 드물고, 자연 조인을 위한 중간 과정으로 많이 쓰인다.
카티전 곱은 어떤 설명보다 그대로 보는 것이 이해가 빠를 것이다.
ID테이블1 | |
아이디 | 패스워드 |
법사법사 | 1234568 |
전사전사 | 856412 |
도둑도둑 | 987523 |
ID테이블2 | |
아이디 | 캐릭터 |
법사법사 | 전사 |
법사법사 | 도적 |
전사전사 | 마법사 |
전사전사 | 전사 |
도둑도둑 | 궁수 |
이전에 보여줬던 합집합 연산이 되지 않는 테이블 조합이다. 하지만 카티전 곱으로는 연산이 가능하다.
카티전 곱을 하고 난 후 결과 테이블은 다음과 같은 특징을 가진다.
0. 테이블 TABLE1과 TABLE2가 있다고 한다. 결과테이블은 TABLERESULT
1. TABLERESULT의 속성의 수는 TABLE1, TABLE2의 속성의 합과 같다. 즉 2+2가 된다.
2. 하지만 같은 속성은 존재할 수 없으므로 같은 속성은 이름을 변경해서 새로운 테이블 속성이 된다.
3. 결과 테이블의 투플 수는 양쪽 투플 수의 곱이다.
ID테이블RESULT | |||
아이디(유저) | 패스워드 | 아이디(보유캐릭터) | 캐릭터 |
법사법사 | 1234568 | 법사법사 | 전사 |
법사법사 | 1234568 | 법사법사 | 도적 |
법사법사 | 1234568 | 전사전사 | 마법사 |
법사법사 | 1234568 | 전사전사 | 전사 |
법사법사 | 1234568 | 도둑도둑 | 궁수 |
전사전사 | 856412 | 법사법사 | 전사 |
전사전사 | 856412 | 법사법사 | 도적 |
전사전사 | 856412 | 전사전사 | 마법사 |
전사전사 | 856412 | 전사전사 | 전사 |
전사전사 | 856412 | 도둑도둑 | 궁수 |
도둑도둑 | 987523 | 법사법사 | 전사 |
도둑도둑 | 987523 | 법사법사 | 도적 |
도둑도둑 | 987523 | 전사전사 | 마법사 |
도둑도둑 | 987523 | 전사전사 | 전사 |
도둑도둑 | 987523 | 도둑도둑 | 궁수 |
자 쉽게 이해가 된다면 좋겠다. 결과를 보면 카타전 곱에 대해서 다시한번 정리해보자.
0. 테이블 TABLE1과 TABLE2가 있다고 한다. 결과테이블은 TABLERESULT
1. TABLERESULT의 속성의 수 = TABLE1, TABLE2의 속성의 합;
2. TABLERESULT의 속성의 결과물 = TABLE1, TABLE2의 속성의 곱;
3. R1에 있는 각 투플고 R2의 각 투플 사이에 조합 가능한 모든 경우에 두 투플을 붙여(CONCATENATE)만든 투플이 결과 테이블에 나온다.
4. 카타전 곱은 T1 – T2 = TR이 T2 – T1 = TR 된다. 즉 교환법칙이 성립한다.
관계 대수 그밖에 연산(ADDITIONAL OPERATIONS)
위에서 본 다섯 개의 연산으로 관계 대수가 할 수 있는 어떤 질의도 할 수 있다. 즉 지금부터 설명하려는 관계 대수 그밖에 연산이라는 항목에 나오는 연산들은 기본연산을 조합하여 만들어진 연산들이다.
교집합 연산(∩, SET INTERSECTION) 입력 테이블 2개, 결과 테이블 1개
교집합은 입력 테이블 두개 모두 들어있는 투플만 결과에 테이블을 내보낸다.
아이디 |
전사전사 |
탱커탱커 |
도둑도둑 |
아이디 |
전사전사 |
법사법사 |
마수마수 |
ID테이블1 ∩ ID테이블2 =
ID테이블결과 | |
아이디 | 캐릭터 |
전사전사 | 전사 |
합집합 차집합과 마찬가지로 교집합도 입력 테이블 두개는 호환성이 있어야 한다.
또한 교집합 연산은 교환법칙이 성립한다.
0. T1 – T2 = TR이 T2 – T1 = TR 되지 않는다.
1. 카타전 곱은 T1 – T2 = TR이 T2 – T1 = TR 된다. 즉 교환법칙이 성립하지 않는다.
그리고 앞서 말했듯이 추가연산은 기본연산을 기반으로 표현할수 있는데. 교집합은 다음과 같이 풀이할 수 있다.
(R1 ∩ R2) = (R1 - (R1 - R2)) = (R2 - (R2 - R1))
그럼 교집합을 사용하는 경우를 예로 들어보자.
유저&캐릭터TABLE | |
아이디 | 캐릭터 |
전사전사 | 전사 |
전사전사 | 마법사 |
도둑도둑 | 전사 |
도둑도둑 | 격투가 |
마수마수 | 마수사 |
다음의 테이블에서 전사와 마법사를 플레이하는 유저의 ID를 구해보자.
먼저 해야 할 일은 전사와 마법사를 플레이하는 유저ID를 모두 구해야 한다.
π아이디(σ 캐릭터= “전사” (유저&캐릭터TABLE))
아이디 |
전사전사 |
도둑도둑 |
그 다음은 마법사이다.
π아이디(σ 캐릭터= “마법사” (유저&캐릭터TABLE))
아이디 |
전사전사 |
자 이다음 두개의 테이블을 교집합 하면 결과는 예상하듯이 “전사전사” 캐릭터만 나올 것이다. 이를 수식으로 다시 풀이해보면?
π아이디(σ 캐릭터= “전사” (유저&캐릭터TABLE)) ∩ π아이디(σ 캐릭터= “마법사” (유저&캐릭터TABLE))
쉽게 이해가 되었다면 좋겠다.
자연 조인(|X|, NATURAL JOIN) : 입력 테이블 2개, 결과 테이블 1개.
이 연산은 관계형 데이터 베이스에서 굉장히 자주 쓰이는 연산이다. 뒤에서 배울 스키마 정규화, 스키마 나누기 등과 밀접한 관련이 있다.
일단 연산 과정부터 설명해 보겠다.
0. 2개의 테이블을 정의한다.
1. 카티전 곱을 한다.
2. 테이블 R1과 R2에 공통적으로 나오는 속성의 값이 같도록 하여 선택 연산을 수행한다.
3. 단계 2를 거치면서 각 투플에서 R1 R2에 공통적으로 나오는 속성은 그 값이 꼭 같기 때문에, 공통 속성은 한번만 나오도록 속성 추출 연산을 수행한다.
이걸 이제 실제로 해보자.
2개의 테이블이 존재한다.
ID테이블1 | |
아이디 | 패스워드 |
법사법사 | 1234568 |
전사전사 | 856412 |
도둑도둑 | 987523 |
ID테이블2 | |
아이디 | 캐릭터 |
법사법사 | 전사 |
법사법사 | 도적 |
전사전사 | 마법사 |
전사전사 | 전사 |
도둑도둑 | 궁수 |
카티전 곱을 한다. ID 테이블 1 X ID 테이블 2;
ID테이블RESULT | |||
아이디(유저) | 패스워드 | 아이디(보유캐릭터) | 캐릭터 |
법사법사 | 1234568 | 법사법사 | 전사 |
법사법사 | 1234568 | 법사법사 | 도적 |
법사법사 | 1234568 | 전사전사 | 마법사 |
법사법사 | 1234568 | 전사전사 | 전사 |
법사법사 | 1234568 | 도둑도둑 | 궁수 |
전사전사 | 856412 | 법사법사 | 전사 |
전사전사 | 856412 | 법사법사 | 도적 |
전사전사 | 856412 | 전사전사 | 마법사 |
전사전사 | 856412 | 전사전사 | 전사 |
전사전사 | 856412 | 도둑도둑 | 궁수 |
도둑도둑 | 987523 | 법사법사 | 전사 |
도둑도둑 | 987523 | 법사법사 | 도적 |
도둑도둑 | 987523 | 전사전사 | 마법사 |
도둑도둑 | 987523 | 전사전사 | 전사 |
도둑도둑 | 987523 | 도둑도둑 | 궁수 |
σ 아이디(유저) = 아이디(보유캐릭터) (ID테이블RESULT)
ID테이블RESULT | |||
아이디(유저) | 패스워드 | 아이디(보유캐릭터) | 캐릭터 |
법사법사 | 1234568 | 법사법사 | 전사 |
법사법사 | 1234568 | 법사법사 | 도적 |
전사전사 | 856412 | 전사전사 | 마법사 |
전사전사 | 856412 | 전사전사 | 전사 |
도둑도둑 | 987523 | 도둑도둑 | 궁수 |
π 아이디(유저), 패스워드, 캐릭터 (ID테이블RESULT)
ID테이블RESULT | ||
아이디(유저) | 패스워드 | 캐릭터 |
법사법사 | 1234568 | 전사 |
법사법사 | 1234568 | 도적 |
전사전사 | 856412 | 마법사 |
전사전사 | 856412 | 전사 |
도둑도둑 | 987523 | 궁수 |
쓸모 있는 데이터만 뽑혀 나온듯 하다.
자연조인을 할 때 최종 연산에서 제거하는 공통속성은, 일반적으로 한 테이블에서는 일차키이고, 타른 테이블에서는 외래키인 경우가 대부분이다. 그런 경우가 90% 이상이라고 봐도 될 정도라고 한다.
이런 경우 결과 테이블에 나오는 투플의 수는, 공통 속성이 외래키인 투플 수와 거의 같다. 위에서 본 ID테이블 1, ID테이블 2가 있다을 때 ID테이블 2는 학번을 외래키로 가진 테이블이다. 그리고 결과로 나온 테이블의 투플 수도 확인한 바와 같이 5개이다.
또한 자연조인을 할 때 결과 테이블이 나오지 않는 투플이 있는데, 이를 외톨이 투플(DANGLING TUPLE)이라고 한다.
외톨이 투플은 참조 무결성과 관련이 있으니 기억해 두자.
뷰(VIEW, VIRTUAL RELATION, VIRTUAL TABLE)
일반적으로 데이터베이스 안에는 그 기관에서 쓰는 거의 모든 자료가 들어가 있기 때문에, 그 자료를 모두 보게된다면 보안에 심각한 문제가 생긴다.
보통 따라서 각 사용자가 업무에 맞는 필요한 정보만 볼 수 있게 해야 한다.
이벤트 당첨자를 결정하기 위해서 마케팅 담당자가 유저테이블을 보는데 패스워드를 볼 필요가 없을 것이다.
뷰의 필요성에 대해서는 짧지만 가장 좋은 예를 든 것 같고 이런 뷰를 정의하는 방안에는 2가지가 있는데 다음과 같다.
1) 뷰의 정의만 저장한다.
뷰의 정의만 정해놓고 데이터베이스에서 요청이 왔을 때 정의에 맞춰서 투플을 채워주는 것이다.
2) 뷰의; 투플을 계산하여 저장해둔다.
뷰를 정의할 때, 뷰의 투플을 미리 계산하여 저장해 두는 방식이다. 이런 뷰를 계산된 뷰 구체화된 뷰(MATERIALIZED VIEW)라고 한다.
이런 뷰를 보기 위해서는 당연히 투플의 원 주인인 데이터베이스에서 정보를 받아와야 하는데 뷰에 대한 요청이 왔을 때, 다음의 두가지 과정을 거쳐서 뷰에 투플을 채운다.
1. 데이터베이스에 변경된 사항이 있다면, 뷰를 계산하여 저장한 뒤에 그 뷰를 쓴다
2. 지난번에 변경이 없다면 이미 계산하여 저장해두었던 뷰를 그대로 쓰면 된다.
당연히 뷰는 이름 그대로 보여주기 위한 용도이기 때문에 일반적으로 뷰를 보면서 수정하게 하는 일은 없다.
'Technology > 데이터베이스' 카테고리의 다른 글
Ch.01 - Database 의 기초 (DBMS) (0) | 2018.07.03 |
---|---|
[DB 6장] SQL (0) | 2018.05.01 |
[DB 4장] ENTITY SET, KEY, 관계 집합 (0) | 2018.05.01 |
[DB 3장] DDL, DML, DBMS, 4GL (0) | 2018.05.01 |
[DB 2장] View, 추상화, 독립성, 스키마, 모델 (0) | 2018.05.01 |