Professional Documents
Culture Documents
ch1~9 최적화
ch1~9 최적화
xxii
차례
CHAPTER 01 서론 1
1.5 데이터베이스설계 16 문제 29
더 읽어보기 31
1.6 데이터베이스엔진 17
PART1 ■ 관계형언어
CHAPTER。오 관계형모델소개 35
2.3 키 41 문제 56
더 읽어보기 58
2.4 스키마다이어그램 44
2.5 관계형질의어 44
다IAPTER03 SQL 소개 61
XXIII
xxiv 차례
PART 2 ■ 데이터베이스설계
PART 3 ■ 응용 프로그램의 설계 및 개발
PART 4 ■ 빅데이터 분석
PART 5 ■ 저장 장치 관리 및 인덱싱
PART 6 ■ 질의처리와최적화
CHAPTER 15 질의 처리 631
PART 7 ■ 트랜잭션관리
다4APTER 22 병렬 및 분산 질의 처리 957
PART 9 ■ 고급 주제
PART 10 ■ 부록
찾아보기 1195
chapter 30 XML
chapter 32 PostgreSQL
Chapter
서론
있다.
1.1 데이터베이스시스템의응용
핵심적인 측면을 살펴보면 계산을 하는 프로그램이 아니라 데이터 그 자체라고 할 수 있다. 오늘날
1
2 Chapter 1 서론
이다.
• 매우 가치 있는 데이터
터를 다루는 응용의 예로는 과목, 학생, 수강 등록 등을 다루는 대학의 레코드를 고려해 볼 수 있다.
대학은 각 과목에 대해서 과목 식 별スト, 과목명, 학과, 과목번호 등과 같은 동일한 형태의 정보만 유
지한다. 학생에 대해서도 학생 식별자, 이름, 주소, 전화번호 등과 같은 동일한 형태의 정보만 유지
복잡한 게시물(posts)까지 다양한 형태의 정보로 구성된다. 이러한 데이터들 중에는 양에 제한이
있는 일반적인 구조도 있다. 두 개의 응용 모두 데이터베이스의 기본적인 특징을 공유한덩/
최신 데이터베이스 시스템은 약하게 구조화된 데이터와 매우 가변적인 형태의 데이터4 대해서
우 크고, 내용적으로 복잡하고 다양한 데이터 집합을 관리하는 대규모의 소프트웨어 시스템이다.
은 높은 수준의 추상화를 제공함으로써 기업이 조직을 운영하는 데 필요한 다양한 형태의 데이터
• 기업 정보
• 은행업무 및 재무
에 사용된다.
등의 학사 관리에 이용된다.
대한 정보 관리에 사용된다.
• 웹 기반서비스
。소셜 미디어: 사용자 기록, 친구/팔로잉 정보와 같은 사용자 간의 연결, 사용자가 생성한 게
용된다.
위에서 열거한 바와 같이, 오늘날 데이터베이스는 대부분의 기업에서 반드시 필요한 요소일 뿐만
를 제공하게 되 었다.
나 온라인 서점을 방문해서 책이나 음악을 살펴볼 때 사용자는 데이터베이스에 저장된 데이터에
(primary mode)다.
, 두 번째는 데이터 분석(data analysis)을 지원하는 모드다. 즉 비즈니스 결정을 내리기 위해 결론
을 끌어내고 규칙을 추론하거나, 어떤 결정을 내리기 위해서 데이터를 분석하는 것이다.
사용자에게 보여 줄지를 결정하는 상황을 가정해 보자. 이러한 작업은 두 단계로 진행된다. 먼저
model)을 생성한다. 이런 모델은 개인의 속성(혹은 특징)을 입력으로 받아서 비즈니스 결정을
하는 데 사용될 수 있는 대출을 갚을 가능성, 혹은 광고를 클릭할 가능성과 같은 예측을 출력하
게 된다.
필요가 있다. 이러한 결정은 과거 데이터를 분석하고 경향을 예측하는 기술에 의해 결정된다. 잘
1.2 데이터베이스시스템의목적
데이터베이스의 목적을 이해하기 위해서 대학 조직에서 교수와 학생, 학과, 개설되는 수업에 대한
게 하려면, 아래와 같은 프로그램을 비롯하여 다양한 응용 프로그램이 필요할 것이다. (보통 시스템
어, 대학교에서 새로운 전공을 만들기로 했다고 하자. 그 결과로 대학은 새로운 학과를 만들고, 그
한 영구적인 파일을 생성(또는 존재하는 파일에 정보를 추가)해야 한다. 대학은 새로운 전공에 대
일에도 나타날 수 있다. 이러한 중복은 저장 공간의 낭비를 초래하고, 접근 비용도 늘어나게 한
를가리킨다.
6 Chapter 1 서론
요가 있다고 흐ト자. 그러면 그 직원은 전산실에 그러한 고객 명단을 만들어 달라고 요청할 것이
잡해진다.
의 계좌에서 8학과의 계좌로 $500를 이체하는 프로그램을 생각해 보자. 프로그램이 실행되는
도중에 시스템 고장이 생기면, A학과의 계좌에서는 $500가 인출되었는데 8학과의 계좌에는 확
실히 입금되지 않아 데이터베이스의 비일관성을 초래할 수 있다. 명백히, 데이터베이스의 일관
기가 어렵다.
예를 들어, A학과가 $10,000의 잔고를 가지고 있다고 흐卜자. 만약 두 학과의 직원이 같은 시간에
1.3 데이터의관점
1.3.1 데이터 모델
• 관계형 모델(Relational Model). 관계형 모델은 데이터와 이들 데이터 사이의 관계를 나타내기
부분은 관계형 모델에 기반한 것이다. 2장과 7장에서 관계형 모델에 대해 자세히 설명한다.
이는 앞에서 소개한 모델들이 특정 형식의 데이터 항목에 대해서는 동일한 속성의 집합만 갖도
록 허용한다는 점에서 대조를 이룬다. JSON과 확장성 마크업 언어(extensible markup language)
객체를 저장하는 표준이 있으며, 데이터베이스 시스템은 객체가 데이터베이스 시스템에 저장되
1.3.2 관계형데이터모델
그림 1.1 관계형데이터베이스의 예
1.3.3 데이터추상화
시스템이 원활하게 사용되려면 데이터 검색이 효율적으로 이루어져야 한다. 이러한 목적을 이루기
• 물리적 단계(Physical level). 추상화의 최하위 단계. 데이터가 실제로 어떻게 저장되는지 기술
한다. 물리적 단계에서는 복잡한 하위 단계의 데이터 구조가 상세히 기술된다.
교적 간단한 데이터 구조를 이용하여 기술한다. 이러한 논리적 단계의 간단한 구조를 구현하
기 위해서는 복잡한 물리적 단계의 구조를 알아야 하는 것이 사실이나, 논리적 단계의 사용자
는 이러한 복잡한 구조에 대해 전혀 알 필요가 없다. 이것을 물리적 데이터 독립성(physical data
independence)이라고 한다. 어떤 정보가 데이터베이스에 저장되어야 할지를 결정하는 데이터베
이스 관리자(database administrator. DBA)가 이 단계에서 작업한다.
심이 있다. 뷰 단계는 이러한 사용자가 시스템을 간단히 이용할 수 있도록 정의된다. 한 데이터
프로그래밍 언어의 데이터 타입(data type)의 개념에 유추해 생각해 보면, 각 추상화의 단계를
명확히 구분하여 이해할 수 있다. 대부분의 고급 프로그래밍 언어는 레코드 타입(record type)의 개
view level
logical
level
physical
level
그림 1.2 데이터추상화의세 단계
Chapter 1 서론 11
는 고유한 이름과 그에 적당한 타입을 가진다. 예를 들어, char(20)은 20개의 문자로 구성될 수 있
질 수 있다.
어, 파일에 테이블을 저장하는 많은 방법이 있다. 한 가지 방법은 테이블을 파일에 레코드의 연속으
행 문자)를 사용할 수 있다. 모든 속성이 고정된 길이를 갖는다면 분리자는 생략하고 속성의 길이
1 실제 타입 선언은 사용되는 언어에 따라 다르다. C와 C++는 struct 선언을 이용한다. Java는 이러한 선언 형태가 없고 단순
한 클래스를 이용해 같은 효과를 내도록 정의할 수 있다.
1오 Chapter 1 서론
1.3.4 인스턴스와스키마
용 프로그램이 논리적 스키마에 기반하여 작성되기 때문이다. 물리적 스키마는 논리적 스키마 아
들어, 물리학과)에 대한 budget 값이 변경되면 이러한 변화는 이 학과와 연관된 모든 교수의 레코드
에 영향을 미치게 된다. 7장에서 좋은 스키마 설계와 나쁜 스키마 설계를 구분하는 방법을 배운다.
전통적으로 논리적 스키마는 거의 변하지 않는다. 그러나 많은 새로운 데이터베이스 응용이 좀
기를 원한다.)
1.4 데이터베이스언어
DML)를 제공한다. 실제로, 데이터 정의 언어와 데이터 조작 언어의 경계는 명확히 구분되어 있지
1.4.1 데이터정의언어
데이터 정의 언어(DDL)라는 특수한 언어로 표현된 정의들의 집합을 이용해 데이터베이스 스키마
및 정의 언어(data storage and definition language)라고 하는 특별한 형태의 DDL 구문을 활용해
한다. 예를 들어, 대학교에서 학과의 계좌 잔고가 음수가 되는 것을 원하지 않는다고 하자. DDL로
이러한 제약 조건을 기술할 수 있다. 데이터베이스 시스템은 데이터베이스가 갱신될 때마다 이러
(data dictionary)에 저장된다. 데이터 사전은 특별한 형태의 테이블로서 오직 데이터베이스 시스템
(일반 사용자가 아닌)에 의해서만 접근되고 갱신될 수 있다. 데이터베이스 시스템이 실제 데이터를
SQL은 데이터 타입과 무결성 제약 조건을 갖는 테이블을 정의할 수 있도록 풍부한 DDL을 제공
한다.
그리고 budget. 각 속성은 고유의 데이터 타입을 갖는다. 이러한 데이터 타입에 대해서는 3장에서
자세히 다룬다.
코드들의 dept_name 속성으로 반드시 나와야 한다. 3장과 4장에서 SQL에서 제공하는 무결성 제
약 조건과 권한을 자세히 살펴본다.
1.4.3 데이터 조작 언어
데이터 조작 언어(DML)는 사용자가 적절한 데이터 모델로 구성된 데이터에 접근하거나 이것을
조작할 수 있도록 하는 언어다. 접근의 형태는 다음과 같다.
• 데이터베이스로부터 정보를 삭제
선언적 DML은 보통 절차적 DML보다 배우기 쉽고 사용하기도 쉽다. 그러나 사용자가 데이터
Chapter 1 서론 15
select instructor.name
from instructor
where instructor.dept_name = 'History';
머지 하나는 Califieri다.
질의는 하나 이상의 테이블에 있는 정보를 포함할 수도 있다. 예를 들면, 아래의 질의는 예산이
Finance), (45565, Computer Science), (10101. Computer Science), (83821, Computer Science),
(76543, Finance)와 같이 두 개의 열(〃ユ deptjame)과 다섯 개의 행으로 구성된 테이블이다.
16 Chapter 1 서론
베이스에 있는 데이터에 접근할 수 있는 내장형 SQL과 호스트 언어(host language) 一예를 들어,
내져야 한다. 이것은 DML 구문을 데이터베이스에 보내고 결과를 검색하는 데 사용되는 응용 프
1.5 데이터베이스설계
존재하지 않는다. 이러한 정보는 기업/조직 운영에 필요한 데이터베이스 혹은 어떤 장치나 서비스
중복되는 사항을 제거하기 위해 살펴볼 수 있다. 이때 설계자의 초점은 물리적으로 어떻게 저장할
것인지 자세히 규정하는 것보다는 데이터와 그들의 관계를 기술하는 데 맞추어져 있다.
다양한 테이블을 구성하는 이러한 속성을 어떻게 그룹화할 것인가에 대한 결정과 관련된다. “어
의 문제다. 이러한 문제를 다루는 두 가지 방법이 있다. 하나는 개체-관계 모델을 사용하는 것
이다(6장). 나머지 하나는 모든 속성의 집합을 입력으로 받아 테이블의 집합을 생성하는 정규화
추출, 데이터의 삭제가 있다. 개념적 설계의 이 단계에서 설계자는 스키마가 기능적인 요구 사항을
1.6 데이터베이스엔진
준다. 논리적 단계에서 비절차적 언어로 작성된 갱신 요구와 질의를 물리적 단계의 효율적인 일련
만들어 줄 수 있다.
1.6.1 저장 장치 관리자
책임이 있다.
• 권한과 무결성 관리자. 무결성 제약 조건을 만족하는지 검사하고, 데이터에 접근하는 사용자의
권한을 확인한다.
마를 여기에 저장한다.
스처럼 데이터베이스 인덱스는 특정한 값을 가지는 데이터 항목을 지정하는 포인터를 제공한다.
Chapter 1 서론 19
1.6.2 질의처리기
1.6.3 트랜잭션관리
수는 없다. 원자성의 특성을 보장하려면 실패한 트랜잭션이 데이터베이스의 상태에 아무런 영향을
1.7 데이터베이스및응용 구조
그림 1.3 시스템구조
식, 다수의 사이트에서 실행되는 트랜잭션의 원자성을 보장하는 방법, 동시성 제어를 수행하는 방
client
server
한다.
사용자의 신분을 확인하고 사용자가 원하는 정보를 얻을 수 있는 서식에 접속할 수 있도록 한다.
류에 속한다.
• 스키마 정의. DBA는 DDL로 작성된 일련의 정의를 실행함으로써 최초의 데이터베이스 스키
마를 생성한다.
게 되어 있다.
저장서버로백업
° 일반적인 연산이 가능하도록 충분한 디스크 공간을 보장하며, 필요한 만큼의 디스크 공간을
확보
저하를 방지
오4 Chapter 1 서론
1.9 데이터베이스시스템의역사
동화는 컴퓨터가 등장하기 전부터 있었다. Hollerith가 발명한 천공 카드는 20세기 초 미국의 인구
조사에 사용되었고, 카드를 처리하고 결과를 내는 데 기계적인 시스템이 사용되었었다. 천공 카드
것이다.
적으로 기록해야만 한다는 엄격한 제약이 사라진 것이다. 디스크와 함께, 저장 공간 안에 트리나
1970년 Codd가 관계형 모델을 정의하고 관계형 모델에서 비절차적으로 질의하는 방식을 제
안한 획기적인 논문을 발표했다. 이에 곧 관계형 데이터베이스가 태어나게 된다. 관계형 모델의
단순성과 상세한 구현을 프로그래머에게 철저히 숨기고도 빼어난 기능을 제공하는 특성은 당시
품을 이끌어 냈다. IBM DB2, Oracle, Ingres, DEC Rdb 등 초기의 상용 관계형 데이터베이스
시스템은 선언적 질의를 효율적으로 처 리하는 기법을 발전시키는 데 크게 공헌했다.
시스템 레벨에서 자동으로 처리해 주어, 프로그래머를 명실상부하게 논리적 단계에서만 작업할
1990년대의 중요한 사건은 월드 와이드 웹(World Wide Web)의 폭발적인 성장일 것이다. 데
이터베이스 또한 전에 없이 비약적으로 발전했다. 데이터베이스 시스템은 이제 초고속으로 트랜
기 시작했다.
2000년대 후반에는 기업 내에서 데이터 분석이나 데이터 마이닝(data mining) 사용이 일반화
되었다. 데이터베이스 시스템은 이러한 시장 요구 사항에 부응하기 위해 진화해 나갔다. 이러한
제공하는 NoSQL 시스템 개발로 이어졌다. NoSQL이란 이름은 비록 “not only SQL”이란 의
용성은 그대로 유지하는 식으로 발전하기 시작했다. 추가적으로 이러한 시스템은 점차 프로그래
일상생활에서 데이터 및 데이터 분석의 거대한 영향은 데이터 관리를 뉴스의 단골 소재로 만
1.10 요약
• 데이터베이스 시스템은 대규모의 정보를 관리하도록 설계되었다. 데이터 관리는 정보의 저장을
위해서 구조를 정의하는 작업과 정보의 조작을 위한 기법을 제공하는 작업을 모두 포함한다. 또
해야 한다.
• 데이터베이스 시스템의 중요한 목적은 사용자에게 데이터의 추상적인 관점을 제공하는 것이다.
• 데이터베이스 구조의 기반을 이루는 것이 데이터 모델이다. 데이터 모델은 데이터, 데이터들
합이다.
비절차적 DML은 필요한 데이터를 어떻게 구할지 명시할 필요 없이, 어떠한 데이터가 필요한지
지정할 것만 사용자에게 요구하며 오늘날 많이 사용된다.
다 반면, 3계층 구조에서는 백엔드 부분이 응용 프로그램 서버와 데이터베이스 서버로 나뉜다.
• 데이터 분석 기법은 데이터로부터 규칙이나 패턴을 자동으로 찾아내려는 것이다. 데이터 마이닝
용어정리
〇 데이터 조작 언어 〇 버퍼 관리자
〇 절차적 DML 〇 데이터 파일
〇 선언적 DML 。데이터 사전
〇 삽입 권한 〇 원자성
〇 갱신 권한 〇 일관성
〇 삭제 권한 〇 지속성
• 메타데이터 〇 복구 관리자
• 응용프로그램 。고장 복구
• 데이터베이스설계 〇 동시성 제어 관리자
。개념 설계 • 데이터베이스구조
。정규화 。중앙화
0 기능적 요구 사항 명세서 。병렬
° 물리 설계 단계 ° 분산
• 데이터베이스 엔진 • 데이터베이스응용구조
〇 파일 관리자 • 데이터베이스관리자(DBA)
실전문제
1.4 YouTube와 같은 비디오 사이트를 제작하려고 한다고 하자. 1.2절에서 나열한 파일 처리 시스템
의 단점을 고려하자. 이러한 단점이 실제 비디오 데이터의 저장소나 제목, 동영상을 올리는 사용
スト, 태그와 같은 비디오의 메타데이터, 그리고 동영상을 시청하는 사용자 등과 어떠한 관련성이
있는지 토론하라.
30 Chapter 1 서론
1.5 웹 검색에서 사용되는 키워드 질의는 데이터베이스 질의와는 다르다. 질의가 기술되는 측면과 질
의의 결과 측면에서 둘 사이의 다른 점을 기술하라.
연습문제
1.8 물리적 데이터 독립성의 개념과 그것이 데이터베이스 시스템에서 지니는 중요성에 대해 설명하라.
1.10 데이터베이스가 데이터 관리를 수행하기 위해서 C나 C++의 라이브러리를 제공하는 대신에
SQL 같은 선언형 언어를 사용하여 데이터 관리를 지원하는 이유를 적어도 두 가지 나열하라.
1.14 NoSQL이 2000년대에 출현한 이유를 전통적인 데이터베이스 시스템의 특징과 비교하여 설명
하라.
관련도구
더 읽어보기
[Codd (1970)]는 관계형 모델을 소개한 획기적인 논문이다. 데이터베이스 시스템 전반을 다루는 교과
서로서 [O'Neil and O'Neil (2000)], [Ramakrishnan and Gehrke (2002)], [Date (2003)], |Kifer et al.
(2005)], [Garcia-Molina et al. (2008)], [Elmasri and Navathe (2016)] 등이 있다.
데이터베이스 관리에 대한 연구 업적과 향후 연구 주제에 대한 개관은 [Abadi et al. (2016)]에서 찾아
볼 수 있다. ACM의 데이터 관리 특별 연구 그룹 홈페이지(www.acm.org/sigmod)에 가면 데이터베
이스 연구에 대한 풍부한 정보를 얻을 수 있다. 데이터베이스 제조사의 웹 사이트(위의 ''관련도구” 절 참
조)에서는 제품에 대한 자세한 설명을 제공한다.
참고문헌
[Abadi et al. (2016)] D. Abadi, R. Agrawal, A. Ailamaki, M. Balazinska, P. A. Bernstein, M. J.
Carey, S. Chaudhuri, J. Dean, A. Doan, M. J. Franklin, J. Gehrke, L. M. Haas, A. Y. Halevy, J.
M. Hellerstein, Y. E. loannidis, H. Jagadish, D. Kossmann, S. Madden, S. Mehrotra, T. Milo, J. F.
Naughton, R. Ramakrishnan, V. Markl, C. Olston, B. C. Ooi, C. RA e, D. Suciu, M. Stonebraker,
T. Walter, and J. Widom, “The Beckman Report on Database Research \ Communications of the
ACM, Volume 59, Number 2 (2016), pages 92-99.
[Codd (1970)] E. F. Codd, “A Relational Model for Large Shared Data Banks ', Communications of
the ACM, Volume 13, Number 6 (1970), pages 377-387.
[Date (2003)] C. J. Date, An Introduction to Database Systems, 8th edition, Addison Wesley (2003).
[Elmasri and Navathe (2016)] R. Elmasri and S. B. Navathe, Fundamentals of Database Systems,
7th edition, Addison Wesley (2016).
[Garcia-Molina et al. (2008)] H. Garcia-M이ina, J. D. Ullman, and J. D. Widom, Database
Systems: The Complete Book, 2nd edition, Prentice Hall (2008).
[Kifer et al. (2005)]M. Kifer, A. Bernstein, and P. Lewis, Database Systems: An Application
Oriented Approach, Complete Version, 2nd edition, Addison Wesley (2005).
[〇'Neil and O'Neil (2000)] P. O Neil and E. O Neil, Database: Principles, Programming,
Performance, 2nd edition, Morgan Kaufmann (2000).
[Ramakrishnan and Gehrke (2002)] R. Ramakrishnan and J. Gehrke, Database Management
Systems, 3rd edition, McGraw Hill (2002).
크레딧
관계형 언어
적 도구의 모임이다. 관계형 모델은 데이터와 데이터들 간의 관계를 기술하는 테이블의 집합을 사
용한다. 관계형 모델의 개념적 단순성으로 인해 오늘날 대부분의 데이터베이스 제품은 관계형 모
델을 채택하고 있다. 관계형 모델은 데이터 저장과 관련된 세부적인 사항을 추상화함으로써 논리
5장은 프로그래밍 언어를 이용한 SQL 접근, 함수, 프로시저, 트리거, 재귀 질의, 고급 집계 함수
등과 관련된 고급 주제를 살펴본다.
33
아】apter 2
관계형 모델 소개
관계형 모델은 상업용 데이터 처리 응용을 위한 주요 데이터 모델이다. 관계형 모델은 이전의 네트
으로 인해 아직까지 최고의 자리를 차지하고 있다. 관계형 모델은 반세기 동안 다양한 새로운 특징
과 기능을 추가했기 때문에 지금의 자리를 유지하고 있는 것이다. 추가적인 특징으로는 복잡한 데
써 관계형 모델은 데이터 마이닝을 위해서 설계된 최신 열 저장소(column store)를 포함해 데이터
저장을 위해서 새로운 방식이 출현함에도 불구하고 그 자리를 지킬 수 있었다.
재한다. 6장과 7장은 관계형 데이터베이스 스키마 설계에 도움이 되는 데이터베이스 이론을 살펴
본다. 15장과 16장은 효율적으로 질의를 처리하는 이론을 살펴본다. 27장은 이 장의 기본적인 범위
35
36 PART 1 관계형 언어
있다. 이와 연관되어 관계형 데이터 모델(relational data model)의 이름도 릴레이션에 기반하고 있
Chapter 2 관계형 모델 소개 37
course-id prereqJd
BI0-3 이 BIO-1 이
BIO-399 BIO-1 이
CS-190 CS-101
CS-315 CS-1O1
CS-319 CS-1 이
CS-347 CS-101
EE-181 PHY-1 이
그림 2.1 을 보면, instructor 릴레이션은 ID, name, dept_name, sa/aり의 네 개의 속성을 가지고
있음을 알 수 있다.
의 모든 정보를 포함하지는 않고, 설명을 위해서 간단한 형태의 릴레이션을 제공한다. 관계형 구조
한 실질적인 장점이 있다. 엄격한 구조는 잘 정의된 비교적 정적인 응용에 적합하지만 시간에 따라
오.오 데이터베이스스키마
일반적으로 릴레이션 스키마는, 속성과 그 속성이 가지는 도메인의 명세로 구성된다. 각 속성의
이러한 중복은 우연이 아니다. 릴레이션 스키마에서 공통적인 속성을 사용하는 것은, 서로 다른 릴
department, course, section, prereq. teaches 이외에도 다음과 같은 릴레이션을 사용할 것이다.
아lapter 오 관계형 모델 소개 41
2.3 키
주어진 릴레이션 안에서 튜플을 구별하는 방법이 있어야 한다. 이것은 릴레이션의 속성으로 표현
되어야 한다. 즉 튜플의 속성값은 그 튜플을 유일하게 식별할 수 있어야 한다. 다르게 표현하면, 한
릴레이션에 있는 두 개의 튜플의 모든 속성값이 같아서는 안 된다.''
instructor 릴레이션에서 튜플을 구분하는 데 충분하다고 하スト. 그러면 {〃"와 {name, dept_name}
둘 다 후보 키다. /。와 name 속성을 함께 사용하면 instructor 튜플을 구분할 수 있지만, ID 하나만
키가 된다.
릴레이션 안에서 튜플을 구별하기 위한 수단으로 데이터베이스 설계자에 의해 선택된 후보 키
1 상업용 데이터베이스 시스템은 릴레이션이 집합이라는 요구 사항을 완화하여 중복된 튜플을 갖도록 허용한다. 이것에 대해
서는 3장에서 더 논의한다.
42 PART 1 관계형 언어
줄을 쳐서 표시한다.
는 월요일, 수요일, 금요일 8.00 AM에서 8.50 AM 시간대를 가지고 있을 수 있다. 특정 time_slot_
id는 같은 요일, 서로 다른 시간대에 다수의 세션을 가지고 있을 수도 있다. 그래서 time_sk”_id와
d仅y로는 유일하게 튜플을 식별할 수 없다. time_slot 릴레이션은 time_slot__id, day, start」ime으로
특정 수업(혹은 분반의 시간표를 유일하게 식별할 수 있기 때문에 이 세 개의 속성으로 주 키를 구
성한다.
방법도 있다.
번호는 절대로 바뀌지 않는다. 조직에 의해 생성되는 유일한 식별자는 일반적으로 두 조직이 합병
되는 경우가 아니면 변하지 않는다. 그러한 경우가 발생하면 같은 식별자가 두 조직에 의해 생성되
보자. instructor 릴레이션의 dept_name 속성을 생각해 보자. instructor 릴레이션에 나오는 어떤
time_slot_id 속성으로 존재해야 한다. 이러한 요구 사항이 참조 무결성 제약 조건의 예다. 일반적
한다는 것을 의미한다.
diagram)을 이용해 시각적으로 나타낼 수 있다. 그림 2.9는 그동안 다루었던 대학교의 스키마 다이
어그램을 나타낸다. 각 릴레이션은 네모 상자로 나타낼 수 있으며 해당 릴레이션의 속성은 네모 상
2 참조 무결성 제약 조건을 표시하기 위한 이중 화살표 표시는 이 책에서 소개되는 것으로 어떤 도구에서도 제공되지 않는다.
그러나 주 키와 외래 키를 위한 표시는 광범위하게 사용된다.
Chapter 2 관계형 모델 소개 45
보는 전형적으로 수학적 논리의 형태로 기술된다. 원하는 정보를 어떻게 획득할지는 데이터베이스
시스템의 일이다.
• 2.6절에서 살펴볼 관계 대수는 함수형 언어다.4 관계 대수는 SQL 질의어의 이론적 토대를 구성
한다.
SQL 질의어와 같이 실질적으로 사용되는 질의어는 명령형, 함수형, 선언형 방식의 요소를 포함
한다. 3〜5장에서 매우 광범위하게 사용되는 SQL 질의어를 살펴본다.
2.6 관계 대수
3 이 책의 이전 판에서는 함수형 언어를 포함해서 프로시저 호출에 기반한 언어를 참조하기 위해 절차적 언어(procedural
language)라는 용어를 사용했다. 그러나 이 용어는 명령형 언어를 참조하는 데 많이 사용된다. 혼동을 피하기 위해 더 이상
이 용어를 사용하지 않는다.
정의를 따르기 때문에 중복은 제거된다. 3장에서 관계 대수가 중복을 포함하는 집합인 다중 집합
2.6.1 선택 연산
6dep5aMe = "Physics"(而"""")
ち如,>90000 {instructor)
선택 술어 안에서 일반적으로 =, 声, <, <, >, > 등의 기호를 사용한 비교 연산이 허용된다. 또한
도 있다. 따라서 물리학과에 속하고 급여가 $90,000 이상인 교수를 찾는 질의는 다음과 같이 나타
낼 수 있다.
션을 생각해 보자. 학과명과 학과가 위치한 건물명이 동일한 학과를 찾는 질의는 다음과 같이 나타
낼 수 있다.
2.6.2 추출 연산
연산이다. 릴레이션은 집합이므로 어떠한 중복도 제거된다. 추출 연산자는 그리스 문자의 대문자
그림 2.1 0 의 결과
Chapter 오 관계형 모델 소개 47
ID name salary
10101 Srinivasan 65000
12121 Wu 90000
15151 Mozart 40000
22222 Einstein 95000
32343 El Said 60000
33456 Gold 87000
45565 Katz 75000
58583 Califieri 62000
76543 Singh 80000
76766 Crick 72000
83821 Brandt 92000
98345 Kim 80000
n/D. name,或班・(加"""")
、llD,name,salary八イinstructor)
2.6.3 혼합관계 연산
유의하라.
2.6.4 카티션 곱 연산
2.6.5 조인연산
교수가 어떤 수업을 가르쳤다면 instructor X feacヵes의 튜플들 중에서 교수의 이름을 포함하고
instructor. ID = teaches.ID를 만족하는 튜플만 추출하면 될 것이 다.
◎instructorjd=teaches」D(i"strnctor X teaches)
instructor X feac力es로부터 교수와 교수가 실제로 강의한 수업 에 해당하는 튜플만 추출할 수 있다.
r X。s = c%(r X s)
2.6.6 집합연산
“courseJd(°semeWer = "Spring"人)匕。,=2018(Sec〃'。"))
courseJd
CS-101
CS-315
CS-319
CS-347
fin-2 이
his-351
mu-199
phy-101
courseJd
CS-347
PHY-101
2.6.7 배정 연산
2018년 봄에도 개설된 수업을 찾는 질의를 고려해 보자. 이 질의는 다음과 같이 표현될 수 있다.
정한다. 배정의 결과는 어떤 릴레이션에도 영향을 미치지 않는다. 차라리 一 기호의 오른쪽 표현식
의 결과가 왼쪽 릴레이션 변수에 기억되는 것이다. 이 릴레이션 변수는 이어지는 표현식에 사용될
수 있다.
2.6.8 재명명연산
Px(E)
Chapter 2 관계형 모델 소개 53
노트 2.1 기타 관계연산
는 식 E의 결과를 이름 X로 돌려준다.
P«ムム,…,4)⑻
위해 각 교수의 연봉과 ID가 12121 인 교수의 연봉을 비교하는 방법을 사용한다. 여기서 어려운 것
은 각 교수의 연봉을 구하기 위해서 instructor 릴레이션을 참조하고 ID가 12121 인 교수의 연봉을
알기 위해 또 다시 instructor 릴레이션을 참조해야 하는 것이다. 재명명 연산은 instructor 릴레이
instructor 릴레이션을 참조할 때는 i라는 이름을 사용하고 ID가 12121 인 교수의 연봉을 구하기 위
2.6.9 동등질의
)
6depLname = "Physics"^instructor.ID = teaches.ID teaches、
또 다른 질의를 살펴보자.
이 어떤 결과를 출력할 것인지 그리고 결과를 효율적으로 계산하는 방법을 찾는다. 관계 대수의 대
2.7 요약
• 관계형 데이터베이스 모델은 테이블의 집합을 기반으로 한다. 데이터베이스 시스템 사용자는 이
러한 테이블에 질의를 하거나, 새로운 튜플의 삽입 튜플의 삭제, 튜플의 갱신을 수행할 수 있다.
• 관계형 질의어는 테이블에 대해서 동작하고, 그 결과로 테이블을 출력하는 연산의 집합이다. 이
• 관계 대수는 테이블에 대해서 동작하는 대수적 연산의 결과로 테이블을 출력한다. 이러한 연산
은 원하는 질의를 얻기 위해서 여러 질의가 합쳐질 수 있다. 대수는 SQL과 같은 관계형 질의어
에서 사용되는 기본적인 연산을 정의한다.
용어정리
• 테이블 • 참조 무결성 제약 조건
, 릴레이션 • 스키마다이어그램
• 튜플 • 질의어 형식
• 속성 ° 명령형
• 릴레이션인스턴스 ° 함수형
• 도메인 。 선언형
• 원자적 도메인 • 관계 대수
• 널값 • 관계 대수식
• 데이터베이스스키마 • 관계 대수 연산
• 데이터베이스 인스턴스 〇 선택 연산 a
• 릴레이션스키마 。추출 연산 n
. 키 ° 카티션 곱 X
。수퍼 키 。 조인 X
〇 후보 키 。 합집합 U
。주 키 。 차집합 -
。주 키 제약 조건 。 교집합。
• 외래 키 제약 조건 。배정 연산 一
° 참조하는 릴레이션 。재명명 연산 P
° 참조되는 릴레이션
56 PART 1 관계형 언어
실전문제
2.5 student 릴레이션과 advisor 릴레이션의 카티션 곱을 수행하고 그 결과에 s_id = ID 조건을 만족
하는 튜플을 선택하는 연산을 진행하면, 그 결과는 무엇이 되겠는가? (관계 대수의 형태로 표현
하면 이 질의는 6514student X advisoryy 될 것이다.)
2.6 그림 2.17의 관계형 데이터베이스를 생각해 보자. 다음의 질의를 표현할 수 있는 관계 대수를 제
시하라.
그림 2.17 직원데이터베이스
그림 2.18 은행데이터베이스
Chapter 2 관계형 모델 소개 57
2.9 관계 대수의 나누기 연산(division operator), チ은 다음과 같이 정의된다. r(R)과 s(S)가 릴레이션
이고, S C R이라고 흐ト자. 즉 스키마 S의 모든 속성은 스키마 R에도 속하게 된다. 그러면 r + s는
• f는 n,_(r)에 속한다.
• s에 속하는 모든 튜플 厶에 대해,「에 속하는 튜플。은 다음의 조건을 모두 만족한다.
a.曲=f,[5]
b. tr[R -S] = t
이상의 정의에 대해,
연습문제
2.11 그림 2.9의 advisor 릴레이션을 생각해 보スト. advisor 릴레이션의 주 키는 s_i"다. 한 명의 학생이
a. 주 키로는 어떤 것이 적절하겠는가?
b. 위에서 답한 주 키에 대한 적절한 외래 키는 어떤 것이 되겠는가?
더 읽어보기
관계형 모델은 1960년대 말, IBM의 San Jose 연구소에서 E. F. Codd에 의해서 제안되었다[Codd
(1970)]. Codd는 이 논문[Codd (1982)]으로 1981 년에 ACM 튜링상을 받았다.
Codd가 관계형 모델을 제안한 이후 다양한 관계형 언어의 스키마 설계와 표현력과 관련된 확장된 이
론이 개발되었다. 일부 전통적인 책에서 [Maier (1983)](온라인 제공)과 [Abiteboul et al. (1995)]를 포
함하여 이러한 관계형 데이터베이스 이론을 다룬다.
오늘날 많은 관계형 데이터베이스 제품이 상업적으로 사용되고 있다. 이러한 제품으로는 IBM의
DB2, Informix, Oracle, Microsoft SQL Server. 그리고 SAP에서 제공하는 Sybase, HANA 등이 있다.
MySQL과 PostgreSQL은 인기 있는 오픈 소스 관계형 데이터베이스 시스템이다. Hive와 Spark는 다수
의 컴퓨터상에서 병렬 질의 처리를 지원하는 광범위하게 사용되는 시스템이다.
참고문헌
[Abiteboul et al. (1995)] S. Abiteboul. R. Hull, and V. Vianu, Foundations of Databases, Addison
Wesley (1995).
Chapter 2 관계형 모델 소개 59
[Codd (1970)] E. F. Codd, “A Relational Mod이 for Large Shared Data Banks'', Communications of
什te ACM, Volume 13, Number 6 (1970), pages 377-387.
[Codd (1982)] E. F. Codd, “The 1981 ACM Turing Award Lecture: R이ational Database: A Practical
Foundation for Productivity,, Communications of the ACM, Volume 25, Number 2 (1982), pages
109-117.
[Maier (1983)] D. Maier, The Theory of Relational Databases, Computer Science Press (1983).
크레딧
그 이름이 바뀌게 되었다. 요즘 많은 제품은 SQL 언어를 지원한다. SQL은 확실히 표준 관계형 데
이터베이스 언어로 자리매김했다.
61
62 PART 1 관계형 언어
5장은 SQL 언어의 고급 특성에 대해서 다룬다. 예를 들어, (a) 프로그래밍 언어에 SQL을 내장
하여 데이터베이스에 접근하게 하는 방법, (b) SQL 함수와 프로시저, (c) 트리거(trigger), (d) 재귀
질의(recursive query), (e) 고급 집계 특성, (f) 데이터 분석을 위해 설계된 여러 특성을 포함한 기능
이 있다.
• 각 릴레이션의스키마
• 각 속성값의타입
• 무결성 제약 조건
• 각 릴레이션에 대한 보안 및 권한 부여 정보
이 절에서는 스키마 정의와 타입 값에 대해서 논의하고, 나머지 SQL DDL의 특성에 대해서는 4장
과 5장에서 논의한다.
3.2.1 기본 타입
1 역자주유사용어로“형”을사용하기도한다.
64 PART 1 관계형 언어
char 타입과 varchar 타입을 비교할 때, 혹자는 비교하기 전에 길이가 같도록 varchar 타입에
여분의 공백이 더해질 수 있다고 생각할 수 있으나, 데이터베이스 시스템에 따라 이러한 일은 일어
3.2.2 기본스키마정의
SQL의 create table 문(statement)을 사용하여 어떤 릴레이션을 정의할 수 있다. 다음의 명령어는
department 릴레이션을 데이터베이스에 생성한다.
create table r
(4ハい
ムD?,
ムD”,
(integrityconstraint]),
• • ,,
(integrity-constraint^.));
주 키를 명시하는 것이 좋다.
, foreign key(ん,, /%,..., ん“) references s: 외래 키(foreign key) 명세는 릴레이션의 어떤 튜플에
대한 속성값(ん,, ム, …, ん.)이 반드시 (상대) 릴레이션 s가 갖고 있는 일부 튜플의 주 키 속성값
에 상응해야 한다.
열되어야 한다.
이션의 name 속성에 대한 not null 제약 조건은 교수의 이름이 널이 될 수 없음을 보장한다.
drop table r;
delete from r.
66 PART 1 관계형 언어
은불가능하다.
3.3.1 단일 릴레이션에 대한 질의
대학교 예제를 사용한 모든 교수의 이름을 찾아라.”라는 질의에 대해 생각해 보자. 이 질의에서 교
select name
from instructor.
쓸 수 있다.
select deptJiame
from instructor.
관계형 모델의 공식적이며 수학적 정의에서는 릴레이션은 집합이다. 따라서 중복된 튜플은 릴
name dept-name
그림 3.2 "select name from 加パ의 결과 그림 3.3 "select dept_name from instruct아?'의 결과
중복된 튜플을 제거하고 싶을 경우, select 뒤에 distinct라는 키워드를 삽입하면 된다. 그러면 앞
선 질의를 다음과 같이 재작성할 수 있다.
기본적으로 중복이 허용되기 때문에 이후 예제는 all을 사용하지 않는다. 그러나 예제 질의의 결과
이 질의는 각 교수의 급여를 10% 인상하면 어떤 결과가 나오는지 보여 준다. 그러나 결과적으로
2 스키마에 주 키 선언이 포함된 데이터베이스 릴레이션은 중복 튜플을 포함할 수 없는데, 이는 주 키 제약 조건에 위배되기
때문이다.
Chapter 3 SQL 소개 69
Katz
Brandt
의 이름을 구하라「와 같은 질의를 고려해 보자. 이 질의는 SQL로 다음과 같이 작성될 수 있다.
select name
from instructor
where deptJiame = 'Comp. Sci.' and salary > 70000;
SQL에서 where 절에 and, or, not과 같은 논리 접속사를 사용할 수 있다. 비교 연산자 <, <=,
>, >=, =, 0를 포함하는 표현식은 논리 접속사의 피 연산자가 될 수 있다. SQL에서 날짜 타입과
같은 특수 타입뿐만 아니라 문자열이나 산술 표현의 비교를 위한 비교 연산자도 사용할 수 있다.
3.3.2 복수의릴레이션에관한질의
려고 한다고 해 보자.
한다.
의 이름을 붙인다.
튜플은 kaMes의 다른 교수를 지칭하는 튜플을 포함한 모든 튜플과 결합한다. 따라서 그 결과는
매우 큰 릴레이션이 될 수 있는데, 이러한 카티션 곱은 거의 잘못된 것이다.
플과 instructor 튜플이 일치하기를 기대한다. 다음의 SQL 질의는 이러한 조건을 보장하고, 이렇게
3 실제로 DBMS는 주어진 SQL을 더 효율적으로 처리할 수 있는 동등한 질의로 변환한다. 이에 대해서는 15장과 16장에서
다룬다.
72 PART 1 관계형 언어
name courseJd
Srinivasan CS-101
Srinivasan CS-315
Srinivasan CS-347
Wu FIN-201
Mozart MU-199
Einstein PHY-1 이
El Said HIS-351
Katz CS-101
Katz CS-319
Crick BIO-101
Crick BIO-301
Brandt CS-190
Brandt CS-190
Brandt CS-319
Kim EE-181
그림 3.7 "대학교 내에서 일부 과목을 가르친 적이 있는 모든 교수에 대해, 그들의 이름과 그들이 가르쳤던 과목의 과
목 아이디를 찾아라”의 결과
이러한 순서는 SQL 질의의 실행 방법이 아니라 결과가 무엇인지 명확히 하는 데 도움이 된다. 실
제 DBMS는 이런 방식으로 SQL 질의를 수행하지 않는다. 대신, where 절의 술어를 만족하는 카
티션 곱의 (결과) 튜플만 생성하여 질의 수행을 최적화할 수 있다. 이러한 질의 처리 기법에 대해서
スト. 그렇다면 600개의 튜플이 teaches 릴레이션에 있게 되므로 결국 카티션 곱의 크기는 2加 ・ 600
3.4 부가적인 기본 연산
3.4.1 재명명 연산
name, co니rse_id
내에서 중복될 수 있다. 둘째, select 절에서 산술식을 사용했을 경우, 그 결과의 속성은 이름을 가
지지 않는다. 셋째, 앞선 예제처럼 속성 이름을 원래의 릴레이션으로부터 얻는다고 하더라도 결과
old-name as new-name
다시 작성할 수 있다.
4 SQL의 초기 버 전에는 as 키워드가 포함되 지 않았다. 결과적으로 일부 DBMS, 특히 Ora이e은 from 절에 as와 같은 키워드
를 허용하지 않는다. Ora이e에서는 from 절에 ''old-name as new-name'' 대신 ''old-name 卬つ皿"ゼ’으로 써야 한다. 키워
드 as는 select 절에 있는 속성 이름을 변경하는 데 사용될 수 있으나, 이는 선택 사항이며 Ora이e에서는 생략될 수 있다.
Chapter 3 SQL 소개 75
H = {(1, a), (2, a)}, r2 = {(2), (3), (3)}로 이루어져 있다고 하자. 그러면 ル。ひ는 {(a), 3)}가 되
는 반면 ns(r,) X 万는 다음과 같이 된다.
{(a, 2), (a, 2), (a, 3), (a, 3), (a, 3), (a, 3)}
역사적으로 불행한 사실이긴 하지만, 관계 대수 select 연산은 SQL의 select 절이 아니라 SQL의
where 절에 해당한다. 노트 3.2에서 보다 복잡한 SQL 질의의 표현을 주제로 논의한다.
SQL 질의의 관계 대수 표현은 SQL로 작성된 프로그램의 의미를 공식적으로 정의하는 데 큰 도
움이 된다. 또한 데이터베이스 시스템은 일반적으로 관계 대수를 기반으로 SQL 질의를 낮은 수준
의 표현으로 변환하고 이 표현을 사용하여 질의 최적화 및 질의 평가를 수행한다.
76 PART 1 관계형 언어
같이 재작성할 수 있다.
3.4.2 문자열연산
SQL 표준은 문자열에 대한 등호 연산에서 대소 문자를 구별한다고 명시하고 있다. “'comp, sci.,
= 'Comp.Sci.1" 표현의 결과는 거짓이 된다. 그러나 MySQL, SQL Server와 같은 일부 DBMS는
문자열 비교를 할 때 대소 문자를 구별하지 않는다. 이들 DBMS는 "'comp, sci.' = 'Comp.Sci.'"의
결과는 참이 된다. 그러나 데이터베이스나 특정 속성의 수준에서 이러한 기본 동작을 변경할 수
있다.
SQL은 문자열에 대한 다양한 함수를 제공한다. 이러한 함수로는 문자열 합병(“『‘ 사용), 부분
문자열 추출, 문자열의 길이 찾기, 문자열을 대문자 혹은 소문자로 변환하기(함수 upper(s) 혹은 함
수 lower(s)를 사용함. 이때 s는 문자열), 문자열 끝의 공백 제거하기(trim(s)) 등이 있다. 서로 다른
Chapter 3 SQL 소개 77
록 한다.
select dept-name
from department
where building like ,%Watson%';
3.4.3 S이ect 절의 속성 지정
select instructor
*
from instructor, teaches
where instructor.ID= teaches.ID\
3.4.4 튜플출력의순서
SQL은 릴레이션에 있는 튜플의 출력될 순서를 사용자가 제어할 수 있도록 한다. order by 절은 질
의의 결과 튜플이 정렬된 순서로 나타나도록 한다. 물리학과의 모든 교수를 알파벳 순서로 나열하
select name
from instructor
where dept-name = 'Physics'
order by name\
select *
from instructor
order by salary desc, name asc;
3.4.5 Where 절의 술어
SQL은 where 절에서 어떤 값보다는 작거나 같고 어떤 값보다는 크거나 같은 값을 간단히 명시하
기 위해 between 비교 연산자를 제공한다. 급여가 $90,000과 $ 100,000 사이에 있는 교수들의 이
름을 찾기 위해
select name
from instructor
where salary between 90000 and 100000;
위와 같은 질의문을 사용하는 대신에 between 비교를 사용해서 아래와 같은 SQL 질의를 작성할
수 있다.
Chapter 3 SQL 소개 79
select name
from instructor
where salary <= 100000 and salary >= 90000;
SQL에서는 ■개의 값 V,, ソン ...,ル을 가지는 〃차 튜플을 나타내기 위해 (匕, ソ2, ,リ〃)와 같은
고, 순서는 사전 순서대로 정의된다. 예를 들어, . < . and 田 <= ち이면 3, %) <= (", わ2)는 참
이다. 유사하게, 두 튜플의 속성이 같으면 두 튜플은 같다. 그래서 앞의 질의는
3.5 집합 연산
select coursedd
from section
where semester = 'Fall' and year— 2017;
select coursedd
from section
where semester = 'Spring' and year= 2018;
질의가 수행되고 그 결과가 그림 3.8과 3.9와 같다고 하자. 특히 그림 3.9에서 보이는 바와 같이,
courseJd
CS-101
CS-315
CS-319
course」d
CS-319
CS-101 FIN-201
CS-347 his-351
PHY-101 mu-199
그림 3.8 2017년 가을에 가르쳤던 과목을 나열한 그림 3.9 2어8년 봄에 가르쳤던 과목을 나열한
cl 릴레이션 c2 릴레이션
3.5.1 합집합 연산
된다.
(select course-id
from section
where semester = 'Fall' and year= 2017)
union
(select courseJd
from section
where semester — 'Spring' and year= 2018);
union 연산은 select 절과는 다르게 자동으로 중복을 제거한다. 따라서 CS-319의 두 분반이 2018
년 봄에 개설되고 CS-1 이의 분반이 2017년 가을과 2018년 봄에 개설된 것을 고려할 때, 그림 2.6
courseJd
CS-101
CS-315
CS-319
CS-347
FIN-201
his-351
MU-199
PHY-101
(select coursedd
from section
where semester = 'Fall, and year= 2017)
union all
(select courseJd
from section
where semester = 'Spring' and year= 2018);
결과의 중복 튜플의 개수는 “과 c2 둘 다에서 나타나는 중복된 튜플의 총개수와 같다. 따라서 위
3.5.2 교집합 연산
2017년 가을과 2이8년 봄에 모두 가르친 모든 과목의 집합을 구하기 위해서 질의를 다음과 같이
작성한다.
(select courseJd
from section
where semester = 'Fall' and year= 2017)
intersect
(select courseJd
from section
where semester = 'Spring' andyear= 2018);
(select courseJd
from section
where semester = 'Fall' and year= 2017)
intersect all
(select courseJd
from section
where semester = 'Spring' and year— 2018);
courseJd
CS-101
7 MySQL은 intersect 연산을 구현하지 않는다. 대신 한 가지 해결책은 3.8.1 절에 논의될 하위 질의를 사용하는 것이다.
82 PART 1 관계형 언어
course-id
CS-347
I PHY-101
3.5.3 차집합연산
(select coursedd
from section
where semester = Tali' andyear= 2017)
except
(select course-id
from section
where semester = 'Spring' and year— 2018);
(select coursedd
from section
where semester = Tali' and year= 2017)
except all
(select courseJd
from section
where semester = 'Spring' and year— 2018);
8 일부 DBMS, 특히 Ora이e은 except 대신 키워드 minus를 사용하는 반:면, Oracle 12c는 except all 대신 키워드 multiset
except를 사용한다. MySQL은 이를 전혀 구현하지 않는다. 한 가지 해결 방법은 역시 3.8.1 절에 논의될 하위 질의를 사용하
는 것이다.
Chapter 3 SQL 소개 83
3.6 널값
where 절의 술어는 비교의 결과에 대한 and. or. not과 같은 불리 언(Boolean) 연산을 포함하기
때문에, 다음과 같이 불리언 연산의 정의는 unknown 값을 다룰 수 있도록 확장되어야 한다.
, and: true and unknown^] 결과는 unknown, false and unknown^] 결과는%/se, unknown and
“欣〃。w〃의 결괴는 unknown0]^}-.
, or: true or unknown5\ 슬과는 true, false or unknown^\ 결과는 unknown, unknown or unknown
의 결과는 unknown0]^.
select name
from instructor
where salary is null;
select name
from instructor
where salary > 10000 is unknown;
질의가 select distinct 절을 사용할 때, 중복된 튜플은 반드시 제거되어야 한다. 이러한 목적으
로, 두 튜플의 상응하는 속성값을 비교할 때 값이 둘 다 널이 아닌 같은 값을 가지거나 둘 다 널일
집합 연산에서도 사용된다.
3.7 집계 함수
• 평균: avg
• 최솟값: min
• 최댓값: max
• 종압: sum
• 개수: count
3.7.1 기본 집계
“컴퓨터 과학과 교수들의 평균 급여를 구하라.”는 질의를 고려해 보자. 이 질의는 다음과 같다.
= $58,000의 틀린 답을 얻게 될 것이다.
집계 함수를 구하기 전에 중복을 제거해야 하는 경우도 있다. 중복을 제거하고 싶다면 키워드
한 번만 세어져야 한다. 그러한 정보는 teaches 릴레이션에 있고, 이 질의는 다음과 같다.
select count (*
)
from course",
SQL은 count(
*
) 에서 distinct를 사용하는 것을 금하고 있다. max와 min에서는 distinct를 사
3.7.2 그룹단위집계
dept-name avgjsalary
Biology 72000
Comp. Sci. 77333
Elec. Eng. 80000
Finance 85000
History 61000
Music 40000
Physics 91000
보기와 같이 “각 학과의 평균 급여를 구하라「는 질의를 고려해 보자. 이 질의는 다음과 같다.
그림 3.14와 같다.
대조적으로, “모든 교수의 평균 급여를 구하라.”는 질의를 고려해 보자. 이 질의는 다음과 같다.
dept-name instr_count
Comp. Sci. 3
Finance 1
History 1
Music 1
그림 3.15 “2018년 봄 학기에 각 학과에서 어떤 과목을 가르친 교수의 수를 구하라.”는 질의의 결과 릴레이션
지에 대한 정보는 teaches 릴레이션에 있다. 그러나 이 정보는 각 교수가 소속된 학과명을 알아내
절 안에 나타날 수 있다. 그렇지 않다면 오류로 간주한다. 예를 들어, 다음 질의는 /。가 group by
절에 나타나지 않았고, select 절에서 집계되지 않은 상태로 나타나기 때문에 잘못된 질의다.
/ erroneous query */
*
select deptJiame, ID, avg (salary)
from instructor
group by deptJiame;
위의 질의는 또한 “/* *
/ ” 안에 텍스트를 십一입하여 SQL로 표현되는 주석(commen。을 예로 보
3.7.3 Having 절
튜플보다 그룹에 대한 조건을 적용하는 것이 때로는 더 유용할 수 있다. 예를 들면, 교수들의 평균
급여가 $42,000을 넘는 학과에만 관심이 있다고 하자. 이 조건은 하나의 튜플에만 적용될 수 없고
dept-name avgsalary
Physics 91000
Elec. Eng. 80000
Finance 85000
Comp. Sci. 77333
Biology 72000
History 61000
그림 3.16 “평균 급여가 $42,000보다 많은 학과의 교수들의 평균 급여를 구하라.”는 질의의 결과 릴레이션
앞서 누트. 3.1 에서 살펴본 것처럼 SQL의 select, from, where 절은 select, project 및 카티션 곱
집합 연산의 다중 집합 버전을 사용하여 다중 집합 관계 대수로 나타낼 수 있다.
관계 대수 합집합, 교집합, 차집합(U, n, -) 연산은 SQL에서 union all. intersect all 및 except
all의 해당 정의에 따라 유사한 방식으로 다중 집합 관계 대수로 확장될 수 있음을 3.5절에서 보았
다. SQL union, intersect, 및 except는 집합 버전의 u, n 및 —에 해당한다.
depl_name^avaa^(salary) as avg_salary(加
h - Op S Xr2X - X 7)
3.7.4 널값과불리언값의집계
3.8 중첩 하위 질의
where 절에서의 중첩 하위 질의의 사용에 대해서 3.8.1 절부터 3.8.4절에 걸쳐 학습한다. 3.8.5절에
서는 from 절의 중첩 하위 질의에 대해서 배운다. 3.8.7절에서는 스칼라 하위 질의라고 불리는 하
위 질의는 값의 반환이 일어나는 연산식의 어디에서나 나타날 수 있음을 본다.
3.8.1 집합멤버십
(select coursedd
from section
where semester = 'Spring
* and year— 2018)
Chapter 3 SQL 소개 91
intersect 연산은 기본적으로 중복을 제거하기 때문에 여기서 distinct를 사용해야 함에 주목하라.
이 예제는 같은 질의를 SQL에서 여러 가지 방법으로 작성할 수 있다는 것을 보여 준다. 이러한
유연성은 사용자가 가장 자연스러워 보이는 방법으로 질의에 관해 생각할 수 있도록 하므로 유용
not in 구문을 in 구문에서와 유사한 방법으로 사용할 수 있다. 예를 들어, 2017년 가을에는 있
지만 2018년 봄에는 없는 과목을 찾기 위해 except 연산을 사용하여 이전에 표현했던 질의를 다음
과 같이 작성할 수 있다.
in과 not in 연산지는 열거형 집합(enumerated set)에서 사용할 수 있다. 다음은 이름이 "Mozart
도 “Einstein”도 아닌 교수를 선택하는 질의다.
그러나 일부 SQL 구현은 위에서 사용된 행 구성 구문인 '\course_id, sec_id, semester, year)
92 PART 1 관계형 언어
3.8.2 집합 비교
은 모든 교수의 이름을 구하라.”는 질의를 보자. 3.4.1 절에서 이 질의를 다음과 같이 작성했다.
그러나 SQL은 이런 질의에 대해 다른 방식으로 작성하는 방법을 제공한다. .'하나 이상보다 큰'이
select name
from instructor
where salary > some (select salary
from instructor
where dept_name = 'Biology');
(select salary
from instructor
where dept.name = 'Biology')
SQL은 또한 < some, <= some, >= some, = some, <> some 비교도 허용한다. 연습으로 〇
some은 not in과는 같지 않지만, = some은 in과 같다는 것을 증명해 보라.”
이제 질의를 조금 바꿔 보자. 생물학과의 각 교수보다 급여가 많은 모든 교수의 이름을 찾아보
スト・ > all 구문은 "모든 것보다 큰”이라는 구와 일치한다. 이 구문을 이용하여 질의를 다음과 같이
작성한다.
select name
from instructor
where salary > all (sele아 salary
from instructor
where dept-name = 'Biology');
11 키워드 any는 SQL에서 some과 동의어다. SQL의 초기 버전은 any만 허용했다. 이후 버전은 영어에서 any라는 단어와의
언어적인 모호성을 피하고자 그 대안으로 some을 추가했다.
Chapter 3 SQL 소개 93
some이 그랬던 것처럼 SQL은 v all, <= all, >= all, = all, <> all 비교를 허용한다. 연습으로
<> all이 not in과 같음을 확인해 보라. 반면에 = all은 in과 같지 않다.
집합 비교의 또 다른 예제로서 “가장 높은 평균 급여를 받는 학과를 구하라.”는 질의를 보자. 먼
select dept_name
from instructor
group by dept.name
having avg (salary) >= all (select avg (salary)
from instructor
group by dept-name);
SQL은 하위 질의가 그것의 결과로 튜플을 가지는지 아닌지를 테스트하는 특성이 있다. exists 구
문은 인자의 하위 질의가 비어 있지 않을 때 true를 반환한다. exists 구문을 사용해서 “2017년 가
select coursedd
from section as S
where semester = 'Fall' and year= 2017 and
exists (select *
from section as T
where semester = 'Spring' and year= 2018 and
S.courseJd= T.coursedd);
칙과 비슷하다.
not exists 구문을 이용하여 하위 질의의 결과물에 튜플이 존재하지 않음을 검사할 수 있다. not
exists 구문으로 집합 포함 관계(즉 상위 집합) 연산을 흉내 낼 수 있는데, 즉 “릴레이션 A는 릴레이
션 B를 포함한다.”를 “not exists (B except A)”와 같이 작성할 수 있다(현재의 SQL 표준에 속하지
는 않지만, contains 연산자는 초창기 몇몇 관계형 시스템에서 나타난다). not exists 연산자를 설
명하기 위해 “생물학과에서 제공하는 모든 과목을 수강하는 모든 학생을 구하라.”는 질의를 보자.
94 PART 1 관계형 언어
(select coursedd
from course
where dept-name = 'Biology')
(select T.coursedd
from takes as T
where S.ID = T.ID)
스트한다.
3.8.1 절에서 ッ。110011 인 교수가 가르친 과목 분반을 수강한 (고유) 학생의 총수를 찾아라.”라
는 SQL 질의를 보았다. 해당 질의는 일부 데이터베이스에서 지원하지 않는 튜플 생성자 구문을 사
3.8.4 중복튜플이없는지테스트
SQL은 하위 질의가 그 결과로 중복된 튜플을 가지는지 아닌지를 테스트할 수 있는 불리언 함수를
포함한다. unique 구문他은 만일 인자로 주어 진 하위 질의가 중복된 튜플을 가지 지 않는다면 참이
select T.course一id
from course as T
where unique (select R.courseJd
from section as R
where T.coursedd— R.course-id and
R.year = 2017);
select T.courseJd
from course as T
where 1 >= (select c3mt(R.courseJd)
from section as R
where T.coursedd= R.courseJd and
R.year = 2017);
select T.courseJd
from course as T
where not unique (select R.courseJd
from section as R
where T.courseJd= R.courseJd and
R.year = 2017);
3.8.5 From 절의 하위 질의
"평균 급여가 $42,000 이상인 학과의 교수들의 평균 급여를 구하라.”는 질의를 고려해 보자. 이
96 PART 1 관계형 언어
이션에 이름(키워드 as 생략)을 부여할 수 있지만, 릴레이션 속성의 이름 변경은 허용하지 않는다.
위 질의에서
“as dept.avg\
3.8.6 With 절
with 절은 그것이 나타난 질의에서만 유효한 임시 릴레이션을 정의할 수 있게 한다. 다음의 질의를
고려해 보자. 이 질의는 가장 많은 예산을 가진 학과를 찾는다.
하위 질의를 사용하면 읽기도 또 이해하기도 어려운 질의를 만들게 된다. with 절은 질의를 논리적
으로 명확하게 만들고, 질의의 여러 곳에서 뷰 정의를 사용할 수 있도록 해 준다.
13 질의의 결과가 마치 그 릴레이션이 생성된 것과 같은 한. SQL 엔진은 릴레이션을 물리적으로 생성하지 않을수 있으며 대체
방법으로 전체 질의 결과를 자유롭게 계산할 수 있다.
98 PART 1 관계형 언어
3.8.7 스칼라하위질의
SQL은 하위 질의가 하나의 속성을 가지는 오직 하나의 튜플만 반환한다면. 하위 질의가 연산식에
서 값이 반환되는 어떤 곳에서라도 나타날 수 있게 허락한다. 이러한 하위 질의를 스칼라 하위 질의
(scalar subquery)라고 부른다. 예를 들면, select 절에서 하위 질의를 사용할 수 있는데, 아래의 예
는 모든 학과와 그 학과의 교수의 수를 함께 나열하는 스칼라 하위 질의를 나타낸다.
select dept.name,
(select count(
*
)
from instructor
where department.dept-name = instructor.deptJiame)
as num-instructors
from department',
스칼라 하위 질의는 select, where, having 절에서 나타날 수 있다. 스칼라 하위 질의는 또한 집
계 함수 없이 정의될 수 있다. 컴파일 시간에 하위 질의가 결과로 하나 이상의 튜플을 반환할 수 있
SQL 질의를 재작성하는 과정은 일반적으로 간단하지 않다. 따라서 데이터베이스 엔진은。및 n
연산자가 술어 및 프로젝션 목록에서 하위 질의를 호출할 수 있도록 하여 관계 대수를 확장하기도
한다.
(select count (*
) from teaches) / (select count (*
) from instructor);
위 질의는 하나의 정수를 다른 정수로 나누기 때문에 대부분 데이터베이스에서 결과는 정수가
3.9 데이터베이스의 변경
지금까지는 데이터베이스에서 정보를 추출하는 데에만 관심이 있었다. 이제부터 SQL을 이용하여
정보를 어떻게 삽입하고, 삭제하고, 변경할 것인지 보자.
3.9.1 삭제
delete from r
where P\
비어 있다.
3.9.2 삽입
릴레이션에 데이터를 삽입하기 위해서는 삽입하려는 튜플을 명시하거나, 삽입될 튜플의 집합을 생
성하는 질의를 작성해야 한다. 당연히 삽입될 튜플의 속성값은 그 속성 도메인에 속해야 한다. 유사
가장 간단한 insert 문은 하나의 튜플을 삽입하는 것이다. 컴퓨터 과학과에 "Database Systems"
라는 제목의 CS-437, 4학점의 과목을 삽입하길 원한다고 가정하자. 다음과 같이 작성할 수 있다.
이 예제에서 값은 릴레이션 스키마에서 나열된 속성의 순서대로 명시된다. 속성의 순서를 기억하
지 못하는 사용자를 위해서 SQL은 insert 문의 일부로 속성을 명시할 수 있도록 하고 있다. 예를
학생을 음악학과의 교수가 되게 하면서 급여가 $18,000이 되도록 한다고 가정해 보자. 이러한 질의
는 다음과 같이 작성할 수 있다.
102 PART 1 관계형언어
기(bulk loader)”라는 특별한 유틸리티를 가지고 있다. 이 유틸리티는 데이터를 정형화된 텍스트 파
일로부터 읽어 들이는 것을 허용하며 매번 같은 일반적인 삽입 명령문의 반복보다 훨씬 빠르게 실
행한다.
3.9.3 갱신
한 용도로 update 문이 사용된다. insert와 delete처럼, 질의를 이용해서 갱신할 튜플을 선택할 수
있다.
Chapter 3 SQL 소개 103
연봉이 인상되어 모든 교수의 급여가 5% 올랐다고 가정해 보자. 이러한 갱신문은 다음과 같이
작성할 수 있다.
update instructor
set salary= salary * 1.05;
update instructor
set salary = salary * 1.05
where salary < 70000;
일반적으로 update 문의 where 절은 select 문(중첩 select 문을 포함)의 where 절에서 적법한 어
레이션을 참조할 수 있다. 이전에도 본 것처럼 SQL은 릴레이션의 모든 튜플에 대해서 갱신될지를
먼저 테스트하고, 그 후에 갱신이 이루어진다. 예를 들어, “평균보다 적은 급여를 받는 교수들의 급
update instructor
set salary = salary * 1.05
where salary < (select avg (s시ary)
from instructor);
update instructor
set salary = salary * 1.03
where salary > 100000;
update instructor
set salary = salary * 1.05
where salary <= 100000;
update instructor
set salary = case
when salary <= 100000 then salary * 1.05
else salary * 1.03
end
104 PART 1 관계형언어
case
when predx then result x
when pred2 then result^
스칼라 하위 질의도 SQL 갱신문에 유용하며, set 절에서 사용될 수 있다. 이것을 2장에서 소개
한 sナ〃dem와 takes 릴레이션을 사용하여 설명하면 다음과 같다. 각 student 튜플의 tot_cred 속성을
학생이 이수한 과목의 학점의 합으로 설정하는 갱신을 고려해 보자. 학생의 등급이 F나 널 값이
update student
set tot-cred =(
select sum(credits)
from takes, course
where student.ID= takes.ID and
takes.courseJd = course.courseJd and
takes.grade <> 'F* and
takes.grade is not null);
select case
when sum(credits) is not null then sum(credits)
else 0
end
3.10 요약
• SQL은 상업적으로 성공한 가장 영향력 있는 관계형 질의어다. SQL 언어는 아래의 두 부분으로
구성되어 있다.
시하게 해준다.
용어정리
• 데이터 정의 언어 • 주키
• 데이터 조작 언어 • 외래 키
• 데이터베이스스키마 ° 참조하는 릴레이션
• 데이터베이스 인스턴스 〇 참조된 릴레이션
• 릴레이션스키마 • 널값
• 릴레이션인스턴스 • 질의어
106 PART 1 관계형언어
• SQL 질의 구조 〇 group by
〇 select 절 〇 having
〇 from 절 • 중첩 하위 질의
〇 where 절 • 집합비교
• 다중 집합 관계 대수 ° {<, <=, >, >=) {some, all)
• as 절 ° exists
• order by 절 〇 unique
• 테이블별칭 • lateral 절
• 상관 이름(상관 변수, 튜플 변수) • with 절
• 집합연산 • 스칼라 하위 질의
〇 union • 데이터베이스변경
〇 intersect 。삭제
〇 except ° 삽입
• 집계함수 。 갱신
° avg. min. max, sum, count
실전문제
그림 3.17 보험데이터베이스
3.5 marks(lD. score、) 릴레이션이 있고 다음과 같은 점수에 기초해서 학생의 학점(grade)을 매긴다고
가정하자. score < 40이면 F, 40 < score < 60이면 C, 60 < score < 80이면 B, 80 < score이면 A
3.6 SQL의 like 연산자는 (대부분의 시스템에서) 대소 문자를 구별하지만, 문자열에서 lower() 함수
는 대소 문자를 구별하지 않는 일치를 수행하는 데 사용된다. 어떻게 사용하는지 보이기 위해 대
소 문자와 관계없이 “sci”를 부분 문자열로 포함하는 이름을 가진 학과를 구하는 질의를 작성하라.
select p.a 1
fromp, rl, r2
wherep.a 1 = r\.a\ orp.a\ = r2.a\
108 PART 1 관계형 언어
그림 3.18 은행데이터베이스
3.9 주 키에 밑줄이 쳐진 그림 3.19의 직원 데이터베이스를 보자. 다음의 질의를 SQL로 표현해 보라.
f. 가장 많은 직원을 고용한 회사의 이름을 찾아라. (만약 동률이면 각각의 회사 이름을 출력하라.)
g. "First Bank Corporation”의 평균 급여보다 평균적으로 더 높은 급여를 받는 직원이 있는 각
회사의 이름을 찾아라.
3.10 그림 3.19의 관계형 데이터베이스를 보자. 다음의 질의를 SQL로 표현해 보라.
그림 3.19 직원데이터베이스
Chapter 3 SQL 소개 109
연습문제
3.12 대학교 스키마를 사용하여 다음의 연산을 수행하는 질의를 SQL로 작성하라.
b. 이 과목의 분반을 2017년 가을에 개설한 것으로 하여 secjd를 1로 하되, 해당 분반이 열리는
곳은 아직 명시하지 않도록 생성하라.
3.13 그림 3.17의 스키마에 상응하는 SQL DDL을 작성하라. 데이터 타입에 대한 어떠한 합리적인 가
정도 할 수 있지만, 주 키와 외래 키는 반드시 선언하라.
a. 직원이 근무하는 회사의 위치와 같은 도시에 거주하는 각 직원의 ID와 이름을 찾아라.
b. 자신의 관리자와 같은 도시와 거리에 거주하는 각 직원의 ID와 이름을 찾아라.
c. 근무하고 있는 회사의 모든 직원의 평균 급여 이상을 버는 각 직원의 ID와 이름을 찾아라.
d. 급여 지급액이 가장 적은 회사를 구하라.
3.21 그림 3.20의 도서관 데이터베이스를 고려해 보자. 다음의 질의를 SQL로 나타내라.
member(memb-no, name)
book(isbn, title, authors, publisher)
borrowed{memb-no, isbn, date)
그림 3.20 도서관데이터베이스
Chapter 3 SQL 소개 111
3.24 대학교 스키마를 사용하여 물리학과의 교수가 조언한 회계학과 학생들의 이름과 ID를 찾는 SQL
질의를 작성하라.
3.25 대학교 스키마를 사용하여 학과의 예산이 철학과의 예산보다 높은 학과 이름을 찾는 SQL 질의를
작성하라. 알파벳 순서로 나열하라.
3.26 대학교 스키마를 사용하여 다음을 수행하는 SQL을 작성하라. 과목을 2회 이상 재수강한 각 학생
(즉 학생이 3회 이상 동일 과목을 수강한 경우)에 대해 과목 ID와 학생 ID를 보여라. 질의 결과를
과목 ID 순서대로 결과를 표시하고 중복 행을 표시하지 않도록 한다.
3.28 대학교 스키마를 사용하여 자신의 학과에서 가르친 모든 과목(즉 교수의 소속 학과 이름을 갖는
course 릴레이션에 나타나는 모든 과목)을 가르치는 교수의 이름과 ID를 찾는 SQL 질의를 작성
하라. 이름으로 결과를 순서대로 출력하라.
로 정의되기 때문이다. 실제로 이것은 그림 2.1 의 예제인 instructor 릴레이션에 해당한다. 그러나
결과가 0이 아닐 수 있는 그 릴레이션에 대한 다른 가능한 인스턴스가 있다. 이러한 인스턴스 중
하나를 보이고, 왜 그 결과가 。이 아닐 수 있는지를 설명해 보라.
3.33 대학교 스키마를 사용하여 Comp. Sci. 학과에서 오후 시간대(즉 정오에 끝나거나 그 이후에 종
료에 최소한 한 개 이상의 분반이 있었던 각 과목의 ID와 제목을 찾는 SQL 질의를 작성하라.
(중복 항목이 있는 경우 제거해야 한다.)
관련도구
IBM DB2, IBM Informix, Oracle, SAP Adaptive Server Enterprise(예전의 Sybase) 및 Microsoft SQL
Server# 포함한 많은 관계형 데이터베이스 시스템을 상업적으로 이용할 수 있다. 게다가 PostgreSQL
및 MySQL(특정 상업적 사용을 제외하고는 무료)을 포함한 여러 오픈 소스 데이터베이스 시스템을 무
료로 내려받아 사용할 수 있다. 일부 상용 업체는 특정 사용 제한이 있는 시스템의 무료 버전을 제공하
기도 한다. 여 기에는 Oracle Express판, Microsoft SQL Server Express 및 IBM DB2 Express-C가 포
함된다.
더 읽어보기
참고문헌
[Chamberlin et al. (1976)] D. D. Chamberlin, M. M. Astrahan, K. P. Eswaran, P. P. Griffiths, R.
A. Lorie, J. W. Mehl, P. Reisner, and B. W. Wade, “SEQUEL 2: A Unified Approach to Data
Definition, Manipulation, and Control ', IBM Journal of Research and Development, Volume 20,
Number 6 (1976), pages 560-575.
크레딧
이번 장도 계속해서 SQL에 대해서 다룬다. 이번에는 좀 더 복잡한 형태의 SQL 질의, 뷰 정의, 트
랜잭션, 무결성 제약 조건에 대해서 다루고 SQL 데이터 정의, 권한 허가에 대해서 자세히 다룬다.
4.1 조인 표현식
(집합 연산을 사용한 경우를 제외하고) 3장에서 사용한 모든 예제 질의에서 카티션 곱(Cartesian
product) 연산자를 사용하여 다수의 릴레이션 정보를 결합해 보았다. 이 절에서는 프로그래머가 좀
더 자연스러운 방식으로 질의를 작성하고 카티션 곱만으로 수행하기 어려운 질의를 표현할 수 있
한 것이다. /£>가 98988인 학생은 2018년 여름에 수강한, BIO-301 과목 분반 1 의 grade 속성이 널
4.1.1 자연조인
이 질의는 일부 과목을 수강한 학생만 출력한다. 어떠한 과목도 수강하지 않은 학생은 출력되지 않
는다.
다. 앞에서 보았던 카티션 곱과 where 절의 술어를 사용하면 다수의 릴레이션을 조인할 수 있다.
“몇몇 과목을 수강한 대학교에 있는 모든 학생에 대해, 해당 학생의 이름과 그 학생이 수강했던
는 "student natural join 柩んes”라는 구문은 자연 조인을 수행하여 얻게 되는 릴레이 션으로 대체된
select4],ム,…,ム
from rx natur지 join r2 natur이 join ... natural join rm
where P;
from Eヽ,E1,,,.,E〃
의 카티션 곱을 계산한다. 카티션 곱 결과에 where 절을 적용하여 조건에 해당하는 튜플만 추출한
1 표기 대칭의 경우 SQL은 쉼표로 표시된 카티션 곱이 키워드 cross join으로 표시되도록 허용한다. 따라서 1from student,
takes"는 “from student cross join Sんes”와 같이 동등하게 표현될 수 있다.
2 결과적으로, 일부 시스템에서는 원래 릴레이션 이름이 포함된 속성 이름(예: student.ID 또는 takes."》을 사용하여 자연 조
인 결과의 속성을 참조하지 못할 수 있다. 몇몇 시스템에서는 허용하지만 다른 시스템에서는 허용하지 않으며 일부는 조인
속성(즉 두 릴레이션 스키마에 모두 표시되는 속성)을 제외한 모든 속성에 대해 허용하기도 한다. 그러나 릴레이션 이름 없
이 〃。me과 cose」イ와 같은 속성 이름을 사용할 수 있다.
Chapter 4 匏 SQL 119
그 이유를 알아보기 위해, 와 fakes의 スト연 조인은 (ID, name, dept_name, tot_cred, course_
id, sec_id) 속성을 가지고 있지만, course 릴레이션은 (course_id, title, dept_name, credits) 속성을
가지고 있음에 주목한다. 결과적으로, 이 두 릴레이션의 자연 조인을 수행하기 위해서는 두 입력 릴
학생이 자신이 소속한 학과가 아닌 다른 학과에서 수강한 과목에 대해 모든 (학생 이름, 과목 이름)
join ... using 연산을 수행하려면 속성 이름의 목록이 필요하다. 두 입력 모두 반드시 명시된 이름
의 속성을 가져야 한다. 八 join r2 using(ん, ん) 연산을 고려해 보자. 이 연산은 厶의 ち과 々의 h 튜
4.1.2 조인조건
4.1.1 절에서 자연 조인을 어떻게 표현하는지 알아보았다. 또한 join ... using 절을 이용해서 특정
속성에 대해서 일치되는 값만 이용한 자연 조인을 하는 방법을 알아보았다. SQL은 임의의 조인 조
건을 정할 수 있는 다른 형태의 조인을 지원한다.
on 조건은 조인을 수행할 릴레이션에 대한 일반적인 술어를 정할 수 있다. 이러한 술어는 SQL
문에서 where 절 술어와 마찬가지로 사용될 수 있다. 차이점은 where라는 단어 대신에 on이라는
단어를 사용한다는 것뿐이다. using 조건과 같이 on 조건은 조인식의 가장 마지막 부분에 나타난다.
select *
from student join takes on student.ID = takes.ID;
120 PART 1 관계형 언어
인하게 된다. 이 러한 경우의 조인식은 student natural join rakes와 거 의 같은 결과를 나타내 게 된
다. 왜냐하면 자연 조인 역시 student 튜플과 takes 튜플에서 서로 일치하는 튜플을 조인하기 때문
select *
from student, takes
where student.ID = takes.ID;
on 조건은 모든 SQL 술어를 표현할 수 있다. 그러므로 on 조건을 사용한 조인식은 자연 조인보
다 훨씬 더 풍부하게 조인 조건을 표현할 수 있다. 하지만 조금 전의 예제에서 볼 수 있듯이 on 조
4.1.3 외부 조인
가령 모든 학생의 ID. name, dept_name, tot_cred^ 그 학생들이 수강한 과목의 목록을 줄력하고
select *
from student natural join takes;
70557인 Snow 학생을 살펴보면 과목을 전혀 듣지 않았다. Snow는 student 릴레이션에는 나타나
Chapter 4 중급 SQL 121
지만, takes 릴레이션에는 Snow의 /。가 나타나지 않는다. 이럴 때 Snow는 자연 조인의 결과에는
나타나지 않을 것이다.
가지고 있는 정보를 결과에 더하고, course_id, sec_id, semester, yw와 같이 takes 릴레이션에 나
타나 있는 정보는 널 값으로 입력하게 된다. 이러한 방식으로 외부 조인에서 Snow 학생의 튜플을
보존한다.
• 왼쪽 외부 조인(left outer join)은 left outer join 연산의 왼쪽에 나타난 릴레이션의 튜플만 보존
한다.
, 오른쪽 외부 조인 (right outer join)은 ri 앙it outer join 연산의 오른쪽에 나타난 릴레이션의 튜플
만 보존한다.
채운다.
select *
from student natural left outer join takes',
이 결과에는 내부 조인의 결과와는 다르게 /。가 70557인 Snow 학생이 포함되어 있다. Snow의 튜
플은 takes 릴레이션의 스키마에 나타나는 속성에 대해서는 널 값을 포함하고 있다.コ
select ID
from student natural left outer join takes
where courseJd is mdl;
right outer join 은 left outer join 연산과 대칭적이다. 조인 연산의 오른쪽에 있는 릴레이 션에
존재하는 튜플 중에서 조인 연산의 왼쪽에 있는 릴레이션의 튜플과 연결되지 않은 튜플은 널 값을
select *
from takes natural right outer join student',
추가한다ド
2017년 봄에 수강한 과목이 있다면 해당 과목의 분반 정보도 함께 출력하라. 그리고 Comp. Sci. 학
과의 어떤 학생도 과목 분반을 수강하지 않았더라도 2017년 봄에 개설한 모든 과목 분반을 출력하
라.,,와 같은 질의는 다음과 같이 작성할 수 있다.
select *
from (select *
from student
where dept-name = 'Comp. Sci.')
natural full outer join
(select *
from takes
where semester = 'Spring' and year = 2017);
4 왼쪽 및 오른쪽 외부 조인만 구현하는 이러한 시스템, 특히 MySQL에서는 이 방법이 정확히 외부 조인을 작성하는 방법이다.
124 PART 1 관계형언어
select *
from student left outer join takes on student.ID = takes.ID',
select *
from student left outer join takes on true
where student.ID = takes.ID;
on 조건을 이용한 왼쪽 외부 조인을 사용한 이전의 질의 결과는 (70557, Snow, Physics, 0, null,
null, null, null, null, null) 튜플을 포함하고 있다. 왜나하■면 takes 릴레이션에는 ID = 70557을 만
족하는 튜플이 존재하지 않았기 때문이다. 하지만 방금 수정한 질의에서는 모든 튜플이 조인 조건
만족하는 튜플이 존재하지 않기 때문에 name = "Snow"로 외부 조인을 수행할 때마다 student.ID
일반적인 조인과 외부 조인을 구별하기 위해서 SQL에서는 일반적인 조인을 내부 조인(inner join)
이라는 용어로 사용한다. 일반적인 조인 절은 외부 조인을 의미하는 것이 아니라 내부 조인을 의미
노트 4.1 SQL 및 다중 집합 관계 대수 4부
select *
from student join takes using (//));
select *
from student inner join takes using (ID);
4.오 뷰
하지만 그렇게 한다면 instructor, course, section 릴레이션에 갱신이 일어날 때마다 저장된 질의
대신 SQL은 질의가 정의하는 (위에서 언급한) “가상 릴레이션”을 제공한다. 이러한 릴레이션은
질의의 결과를 개념적으로 포함하고 있다. 가상 릴레이션은 미리 계산해서 저장하는 것이 아니라
가상 릴레이션을 사용할 때마다 질의를 수행해서 결과를 얻어 낸다. 3.8.6절에서 with 절을 사용하
4.2.1 뷰정의
에게 제공해야 한다.
장하고 있다. 뷰 릴레이션에 접근할 때마다 질의 결과를 계산하여 튜플을 생성한다. 이처럼 뷰 릴레
제될 때까지 계속 사용할 수 있다는 점에서 뷰는 with 문과 다르다. with 구문으로 정의한 명명된
하위 질의는 그것을 정의한 질의에만 국한된다.
select coursedd
from physicsJalL2017
where building = 'Watson';
릴레이션이 수정될 경우 해당 뷰 릴레이션의 상태는 최신이 아니게 된다. 이러한 문제를 없애기 위
한다. 그리고 질의에서 뷰 릴레이션이 나타날 때마다 그 자리에 저장된 질의 표현식을 바꿔 넣는다.
4.2.3 실체화뷰
결과도 달라질 것이다. 결과적으로 실체화 뷰의 내용이 갱신되어야 한다. 비슷하게 교수의 급여가
록 지원하고 있다.
Chapter 4 중급 SQL 1 오9
찾아보지 않아도 되기 때문에 질의에 빠르게 응답하는 데 사용될 수 있다. 물론 실체화 뷰로부터
4.2.4 뷰의 갱신
입하기 위해서는 salary 값을 입력해야 한다. 이러한 삽입 문제를 해결하기 위해서 다음과 같은 두
가지 접근 방법이 있을 수 있다.
ID가 69987인 교수가 없고, Taylor 건물에는 어떤 학과도 소속되어 있지 않다고 가정하자. 이
러한 경우에 가능한 방법은 instructor 릴레이션에 ('69987', 'White', null, "“〃)라고 입력하거
'Taylor')와 같은 튜플이 포함되지 않기 때문에 원래의 질의가 원하는 결과가 아니다. 그러므로 널
값을 사용해서 並 에 원하는 갱신을 하기가 어렵다.
department
뷰에 (,25566'. 'Brown', 'Biology,, 100000) 튜플을 삽입한다고 하자. 이 튜플은 instructor 릴레이
션에 삽입되지만, 뷰에 표현된 선택 조건을 만족하지 않는다면 historyinstructors 뷰에 나타나지
않을 것이다.
SQL: 1999는 다량의 클래스를 통해 갱신을 허용하는 뷰에서 삽입, 갱신, 삭제가 이루어질 때 좀
더 복잡한 규칙을 가진다. 하지만 규칙은 너무 복잡해서 여기서 다루지 않는다.
4.3 트랜잭션
이 실행되는 순간에 암묵적으로 트랜잭션이 시작된다고 명시하고 있다. 트랜잭션은 다음의 SQL
문 중 하나로 끝나야 한다.
로시작한다.
송금하는 금액을 빼고, 입금 계좌에 송금하려는 금액을 더해야 한다. 첫 번째 계좌에서 금액을 뺐는
학생이 과목을 성공적으로(즉 적절한 성적을 얻는 것으로) 마무리해서 takes 릴레이션을 수정할 때
태로 남아 있지 않게 된다.
적이다.
6 JDBC나 ODBC와 같은 응용 프로그램 인터페이스를 사용해서 자동 커밋을 해제하는 표준화된 방법은 각각 5.1.1 절과
5.1.3절에서 알아볼 것이다.
Chapter 4 중급 SQL 133
좀 더 나은 대안은 SQL: 1999 표준으로, 키워드 begin atomic ... end로써 여러 SQL 문을 둘러
싸게 하여 트랜잭션 개념을 지원한다. 키워드 사이에 있는 모든 문은 단일 트랜잭션에 속해 있는데,
17장에서 트랜잭션의 다양한 특성을 배우고, 18장과 19상에서는 트랜잭션 구현에 관한 다양한
쟁점을 다룬다.
4.4 무결성 제약 조건
약 조건은 릴레이션을 생성하는 데 쓰이는 create table 명령어의 일부로 정의한다. 하지만 무결성
제약 조건을 alter table table-name add constraint 명령어를 이용해서 이미 존재하는 릴레이션에
수 있다. 이러한 명령어가 실행되면 시스템은 릴레이션이 주어진 특정 조건을 만족하는지 확인한
그 명령어는 거절된다.
4.4 .1 단일 릴레이션에 관한 제약 조건
3.2 절에서 create table 명령어를 사용하여 테이블을 정의하는 방법을 다루었다. create table 명령
어는 무결성 제약 조건 문장을 포함하는 명령어다. 추가로, 주 키 제약 조건도 포함되며 이 외에도
create table 명령어에 포함되는 많은 것이 존재한다. 허용하는 무결성 제약 조건은 다음과 같다.
• not null
• unique
• check(〈술어〉)
다. 이러한 경우에 〃のwe과 budget 속성에 대해서 널 값을 금지하고 싶으면 다음과 같이 정의할 수
있다.
not null 명세는 이 속성에서 널 값의 삽입을 못하게 하는데, 이것은 도메인 제약 조건(domain
constraint)의 한 예다. not null인 도메인에 널 값을 삽입하게 하는 어떠한 형태의 데이터베이스 수
정도 오류 메시지를 발생시킨다.
4.4.3 Unique 제약 조건
SQL은 다음과 같은 무결성 제약 조건을 제공한다.
unique (&,%,...,当“)
Chapter 4 중급 SQL 135
4.4.4 Check 절
SQL 표준에 따르면 check 절의 술어는 하위 질의를 포함한 임의의 술어가 될 수 있다. 그러나
현재 널리 사용되고 있는 데이터베이스 시스템 중에 하위 질의를 check 절의 술어에 포함하는 방
법을 제공하는 것은 없다.
136 PART 1 관계형언어
4.4.5 참조 무결성
이션에 존재해야 한다는 것이다. 이러한 제약 조건이 없으면 존재하지 않는 학과 이름을 입력하는
것이 가능해진다.
일반적인 형식의 참조 무결성 제약 조건은 SQL로 직접 명시할 수 없다. SQL 표준은 그러한 제약
있다.
다(즉 갱신을 수행하는 트랜잭션이 롤백된다). 하지만 foreign key 절은 참조되는 릴레이션에서 삭
제나 갱신 동작이 제약 조건 위반을 발생시키면 그 동작을 거부하는 대신, 시스템이 참조하는 릴레
이션의 튜플을 변환하는 절차를 저장함으로써 나중에 복원할 수 있다. course 릴레이션에 대한 다
8 일부 시스템. 특히 MySQL은 기본값을 지원하지 않으며, 참조된 릴레이션의 속성을 지정해야 한다.
138 PART 1 관계형언어
department 릴레이션의 튜플 삭제는 삭제된 그 학과를 참조하는 course 릴레이션의 튜플도 "연
서 참조하는 튜플의 dept_name 필드를 새로운 값으로 갱신한다. SQL은 또한 foreign key 절이
4.4.6 제약 조건 명명
무결성 제약 조건에 이름을 할당할 수 있다. 이러한 이름은 이전에 정의된 제약 조건을 삭제하려는
경우 유용하다.
이름이 없으면 먼저 시스템별 특성을 사용하여 제약 조건에 대한 시스템에 종속된 이름을 식별해
다. 하지만 그다음 단계에서 위반이 제거될 수 있다. 예를 들어, 주 키 "Me을 가지는 person 릴레
을 다시 유지하게 된다.
Mary에 해당하는 튜플을 삽입할 때 spouse 속성을 null 값으로 정하고 후에 갱신한다. 이러한 기술
은 구현이 복잡하며 또한 속성 이 null 값을 가지 지 못하면 할 수 없다.
SQL 표준은 이 절에서 이야기하는 무결성 제약 조건을 명시할 수 있는 추가적인 구조를 제공한다.
하지만 이러한 구문은 대부분 데이터베이스 시스템에서 지원되지 않고 있으므로 실제 사용에 주의
해야 한다.
SQL 표준의 정의에 따르면, check 절의 술어는 하위 질의를 포함한 임의의 술어를 사용할 수
있다. 만약 데이터베이스 구현이 check 절에서의 하위 질의를 지원한다면, section 릴레이션에 대
해서 다음과 같은 참조 무결성 제약 조건을 명시할 수 있다.
존재하는 식별자인지 확인한다. 이러한 조건은 section 릴레이션에 튜플이 삽입되거나 삭제되었을
을 가르치는 교수가 적어도 한 명 있어야 한다는 것이다. 이러한 조건을 강제하기 위해서 section
릴레이션의 (course_id, sec_id, semester, year) 속성에 teaches 릴레이션의 속성을 참조하는 외래
할수있다.
수 있다.
주장이 생성되었을 때 시스템은 그것이 타당한지 테스트한다. 주장이 올바르다면 데이터베이스
한 테스트는 상당한 양의 부하를 일으킬 수 있다. 따라서 주장은 신중히 사용되어야 한다. 주장을
9 강의는 다른 강의실에는 원격으로 표시되지 않는다고 가정한다! "교수는 해당 학기의 두 과목을 같은 시간에 가르칠 수 없
음”을 지정하는 대안적인 제약 조건은 유효하지 않을 수 있는데, 이는 과목이 때때로 교차 목록에 있지 않을 수 있기 때문이
다. 즉 같은 과목에 두 개의 식별자와 제목이 부여된다.
Chapter 4 중급 SQL 141
그림 4.10 주장 예제
나 create assertion 구문을 지원하는 시스템은 없다. 하지만 5.3절에서 언급할 트리거를 지원하는
3.2 절에서 소개한 기본 데이터 타입에 추가로, SQL 표준에서는 날짜와 시간과 관련된 몇 가지 데
이터 타입을 제공한다.
date '2018Q4-25'
time '09:30:00,
timestamp *2018-04-25 10:29:01.45,
142 PART 1 관계형언어
date나 time 값 d에서 각각의 영역을 추출하기 위해서 extract(ガe/d from d)를 사용할 수 있
는데, 여기에서 fie Id는 year, month, day, hour, minute, second 중 하나다. 시간대 정보는
4.5.2 타입변환및서식 함수
은 타입인 임의의 개수의 인자를 취하며 맨 처음에 나타나는 null이 아닌 인자를 반환한다. 예를 들
decode 함수는 叩ルe를 match 값과 비교하여 일치가 발견되면 속성값을 해당 대체 값으로 바꾼다.
일치하지 않으면 속성값을 기본으로 설정된 대체 값으로 바꾼다. 이때 반드시 데이터 타입이 일치
해야 한다는 요구 사항은 없다. 편의상 null 값은 match 값으로 나타날 수 있으며 보통의 경우와 달
4.5.3 기본값
tot_cred 속성의 기본값으로 〇을 선언한다. 그 결과, student 릴레이션에 튜플이 삽입될 때 tot_cred
4.5.4 대형객체타입
은 데이터형 이름의 일부인 “lob”은 “Large OBject”를 나타낸다. 다음과 같이, 대형 객체 데이터 타
입을 갖는 속성을 선언할 수 있다.
그램을 작성한 호스트 언어에서 그 객체를 다룬다. 예를 들어 (5.1.1 절에서 다루는) JDBC 응용 프
로그램 인터페이스는 전체 대형 객체 대신 위치자를 가지고 올 수 있도록 한다. 그리하여 한 번에 다
가지고 오기보다는 작은 부분으로 나눠서 요청된 대형 객체를 가지고 오도록 해당 위치자를 사용한다.
4.5.5 사용자정의타입
(structured data type)으로, 중첩 레코드 타입, 배열, 다중 집합으로 된 복잡한 데이터 타입이다. 정
형 데이터 타입은 이번 장에서는 다루지 않고 8.2절에서 다룬다.
여러 속성이 같은 데이터 타입을 가질 수도 있다. 예를 들어, 학생 이름과 교수 이름을 저장하기
오류일 것이다. 마찬가지로, 달러로 표시된 화폐 단위를 파운드로 표시된 화폐 단위와 비교하는 것
노트 4.2 시간적유효성
시간 간격을 정의하도록 지정하는 구문을 제공하는 것이다. Oracle 12c의 구문을 예로 사용해 보
スト. instructor^ 위한 SQL DDL은 sfarjdme와 end_date 속성이 유효 시간 간격을 지정해야 한
start_date date,
end date date,
period for valid time (start/ate, endjiate),
-);
이나 비교를 잘 탐지할 수 있어야 한다. 이런 종류의 검사를 지원하기 위해 SQL은 distinct type을
제공한다.
146 PART 1 관계형 언어
여기서 수치형끼리 더하기가 가능하나, 그 더하기 결과를 Dollars 타입의 어떤 속성으로 돌려서 저
SQL은 이전에 생성한 타입을 삭제하거나 변경하기 위한 drop type과 alter type 절을 제공한다.
SQL(즉 SQL: 1999)에 사용자 정의 타입을 추가하기 전, 유사하지만 미묘하게 다른 개념인
(SQL-92에서 소개된) 도메인(domain) 타입을 갖고 있었다. 도메인은 기초형(underlying type)에 무
결성 제약 조건을 더할 수 있다. 예를 들어, 다음과 같이 어떤 도메인 DDollars를 정의할 수 있다.
Dollars 타입을 사용한 것처럼 도메인 DDollars를 속성 타입으로 사용할 수 있다. 하지만 타입과
11 키워드 final은 이 문에서 실제로 어떤 의미도 없다. 다만 SQL: 1999 표준에서 요구할 뿐이다. 그 때문에 여기에서는 다루지
않는다. 일부 SQL 엔진에서는 final 키워드를 생략할 수 있다.
Chapter 4 중급 SQL 147
이 절에서 설명하는 create type 및 create domain 구문은 SQL 표준의 일부이지만 여기에 설명된
이러한 구문 형식은 대부분의 데이터베이스 엔진에서 완벽히 지원되지 않는다. PostgreSQL의 경
우, create domain 구문을 지원하나 create type 구문과는 그 문법과 실제 내용이 다르다.
IBM DB2는 create distinct type 구문을 사용하는 create type 버전을 지원하지만, create
domain은 지 원하지 않는다. Microsoft SQL Server는 SQL create domain 요소와 유사한 도메 인
제약 조건을 지원하는 create type 버 전을 구현한다.
〇racle은 여기에 설명된 두 구문인 create type, create domain을 지원하지 않는다. Oracle,
IBM DB2, PostgreSQL 및 SQL Server는 서로 다른 형식의 create type 구문을 사용하여 객체 지
향 타입을 지원한다.
그러나 SQL은 8.2절에서 학습할 더 복잡한 객체 지향 타입 시스템도 정의하게 해 준다. 타입은
예를 들어,"旬〃由ne과 lastname으로 구성된 Name 타입과 같은 구조를 가질 수 있다. 서브타이핑
(subtyping)도 허용된다. 예를 들어, Person 타입에는 Student, Instructor 등의 서브타입(subtype)
이 있을 수 있다. 상속 규칙은 객체 지향 프로그래밍 언어의 규칙과 유사하다. 객체 지향 프로그래
4.5.6 고유키값생성하기
수 있지만 이러한 문은 기존의 모든 ID를 확인해야 하므로 시스템의 성능 저하를 불러올 수 있다.
된 구문은 Oracle 및 DB2의 구문과 흡사하다. 예를 들어, instructor 릴레이션에서 교수 ID를 “ID
독립적인 시퀀스 카운터(sequence counter: 순차적인 ID 값 생성기) 객체를 생성하며, SQL 질의를
통해 이 시퀀스 객체로부터 다음 값을 가져올 수 있게 한다. 다음 값을 얻기 위해 매번 호출하면 시
그 테이블에 질의의 결과를 삽입하는 문이다. SQL:2003에서는 질의의 결과를 포함하는 테이블을
create table t! as
(select *
from instructor
where dept-name = 'Music')
with data;
데이터를 테이블에 채우도록 한다. 일부 DBMS 는 create table ... like와 create table ...as 등과
질의문을 이용해서 정의할 수 있다는 점에서 위의 create table ...as 문은 create view 문과 매
(name space)을 가지고 있었다. 그래서 사용자는 다른 릴레이션에서는 (기존 릴레이션에 사용한)
똑같은 이름을 사용하려 하지 않았다. 현재 데이터베이스 시스템은 릴레이션에 이름을 붙일 때 3단
접속해야 한다. 사용자는 자신의 신원 확인을 위해 일반적으로 사용자 이름과 암호를 제공해야 한
catalog5, univschema.course
create schema와 drop schema 구문을 이용하여 스키마를 생성하거나 제거할 수 있다. 대부분
의 데이터베이스 시스템은 사용자 계정이 생성됨과 동시에 사용자 계정 이름과 같은 스키마 이름
있다.
인덱스는 데이터의 정확성 때문에 필요한 것은 아니다. 왜나司・면 인덱스는 중복 데이터 구조이
면 다음과 같이 작성한다.
시도는 실패하게 된다. 인덱스 생성 시도가 성공하면 그 키 선언을 위반한 튜플을 삽입하려는 후속
시도는 실패하게 된다. 데이터베이스 시스템이 SQL 표준의 unique 선언을 지원하는 경우 unique
특성이 중복된다.
인덱스를 삭제하려면 인덱스에 대해 지정된 인덱스 이름이 필요하다. drop index 명령문의 형
식은 다음과 같다.
이스가 자동으로 생성하는 인덱스 및 생성할 추가 인덱스를 결정하는 방법은 14장에서 더 자세히
다룬다.
4.7 권한
다음과 같이 데이터베이스 일부에 대한 여러 형태의 권한을 사용자에게 할당할 수 있다.
• 데이터를읽을권한
• 데이터를갱신할권한
• 데이터를삭제할권한
는다.
Chapter 4 중급 SQL 153
한도 사용자에게 부여할 수 있다. 일부 형태의 권한을 소유한 사용자는 자신의 권한을 타 사용자에
4.7.1 특권 부여 및 취소
SQL 표준은 select, insert, update, delete에 대한 특권을 포함한다. 허용 가능한 모든 권한의 축약
형태로서 all privileges 특권을 사용할 수 있다. 새로운 릴레이션을 생성하는 사용자는 그 릴레이션
에 대한 모든 특권을 자동으로 부여받는다.
포함한다면 update 키워드 다음의 괄호에 갱신 권한을 부여할 속성 목록을 선택적으로 나타내야
한다. 만일 속성 목록을 생략한다면 릴레이션의 모든 속성에 갱신 특권을 부여하게 된다.
릴레이션에 대한 insert 권한은 사용자가 릴레이션에 튜플을 삽입할 수 있도록 한다. 또한 insert 특
권은 속성의 목록을 지정할 수 있다. 릴레이션에 대한 어떤 삽입이든지 이 속성만 지정해야 하고,
해야 한다.
public이라는 사용자 이름은 시스템에서 현재와 앞으로 사용할 모든 사용자를 지칭한다. 그래서
시스템은 현재와 앞으로의 모든 사용자에게 public에 부여한 특권을 묵시적으로 부여한다.
기본적으로는 특권을 부여받은 사용자/역할은 또 다른 사용자/역할에게 특권을 부여할 수 없다.
4.7.2 역할
교수인지를 별도로 식별하는 것이다. 시스템은 이 두 정보를 사용해 각 교수의 권한을 결정할 수
있다. 새로운 교수가 채용되면 사용자 식별자를 그에게 부여하고 그를 반드시 교수로 식별해야 한
보안 문제를 일으킬 수 있다. 더욱이 교수가 대학교를 떠나거나 비교육적 역할로 이동할 경우 새
instructor 암호를 생성해서 모든 교수에게 안전한 방식으로 배포해야 한다. 사용자가 자신의 아이
사용자에게 부여할 수 있는 임의의 권한을 역할에 부여할 수 있다. 권한이 사용자에게 부여되는
사용자에게 특권을 부여하듯이 다음의 문에서 예시하듯 역할에 특권을 부여할 수 있다.
• 사용자/역할에 직접 부여한 모든 특권
든 특권을상속하게 된다.
부여된 역할이 수여한 모든 특권을 가지게 된다. 그래서 만약 사용자 Amit이 dean 역할을 수여했
다면, 추가적으로 Amit은 자신이 직접 수여한 특권과 dea”에게 부여된 권한도 받고, 거기에다가
dean 역할에 (직간접적으로) instructor, teaching_assistant 역할 등이 부여되었다면 후자의 두 역
4.7.3 뷰에대한권한
대학교 예제에서 한 직원이 지질학과에 근무하는 모든 교수진의 급여를 알고 싶다고 하자. 이 직원
select *
from geo-instructor,
4.7.4 스키마에 대한 권한
정을 할수있다.
Chapter 4 중급 SQL 157
특권을 포함한다. SQL의 references 특권은 update 특권과 비슷한 방식으로 특정 속성에 수여한
4.7.5 특권양도
일부 형태의 권한을 수여받은 사용자는 그 권한을 다른 사용자에게 양도하는 것이 가능하다. 기본적
으로, 특권을 수여받은 사용자나 역할은 다른 사용자나 역할에 그 특권을 수여할 권한이 없다. 특권
그림 4.11 권한 부여 그래프(U“ U2, ... , 4는 사용자를 의미하고, DBA는 데이터베이스 관리자를 의미한다)
4.7.6 특권취소
한을 받으므로 u4의 권한도 a으로부터 취소해야 한다. 하지만 &는 a과 u2 둘 다로부터 권한을
부여받았다. 데이터베이스 관리자가 “로부터 온 teaches 릴레이션에 대한 갱신 권한을 취소하지
려고 시도할 수도 있다. 예를 들어, 처음에 데이터베이스 관리자가 "에 권한을 수여하고, 이어서
수 있다. 그러나 일단 관리자가 "의 권한을 취소하기만 하면 권한 그래프의 최상위 노드에서 "
또는까지의 경로가 사라진다는 점에 주목할 필요가 있다. 따라서 SQL은 양 사용자 모두로부터
권한이 취소되는지 잘 확인해야 한다.
restrict 대신에 취소가 연쇄적으로 일어나야 한다는 것을 지칭하는 키워드 cascade를 사용할 수
Chapter 4 중급 SQL 159
있다. 그러나 이전 예제에서 한 것처럼, 연쇄 취소는 기본적으로 수행되기 때문에 생략할수 있다.
instructor 역할을 부여한 상황에서, 나중에 dean 역할을 (아마도 Satoshi가 대학교를 떠났기 때문
이러한 상황에 대처하기 위해 SQL은 사용자라기보다 역할이 특권을 수여할 수 있도록 허용한
된 현재 역할은 (일부 특수한 사례를 제외하고는) 널이다. set role role_name을 실행하여 세션과
연관된 현재 역할을 설정할 수 있다. 이렇게 구체화한 역할을 그 사용자에게 부여해야 한다. 그렇지
세션과 관련된 현재 역할로 설정된 수여자에게 특권을 부여하려면, 현재 역할이 not null인 경우
에만 grant 문에 다음의 절을 추가하면 된다.
granted by current_role
로부터 (dean 역할을 포함한) 역할/권한을 취소하는 것은 Satoshi가 그 부여를 실행한 사용자였다
하더라도 수여자가 dean 역할로 설정하게 한 특권 취소로까지는 이어지지 않을 것이다. 그러므로
4.7.7 행 수준권한
는 릴레이션을 사용하는 질의에 자동으로 더하면 술어를 반환한다. 이 술어는 sys_context 함수를
160 PART 1 관계형 언어
사용할 수 있는데, sys_context는 질의가 대신하여 실행하는 사용자의 식별자를 반환한다. takes
릴레이션의 데이터에 접근하는 학생들의 예제에서 다음의 술어는 takes 릴레이션과 연관된다.
4.8 요약
필요는 없다.
과는 무효화된다.
않도록 보장한다.
우 중요하다. 대부분의 데이터베이스 시스템에서 SQL 표준의 일부는 아니지만, 인덱스 생성을
있게 해 준다.
용어정리
• 조인타입 〇 연쇄 갱신
〇 자연 조인 。주장
° using과 on을 갖는 내부 조인 • 데이터 타입
。왼쪽, 오른쪽, 전체 외부 조인 。 날짜와 시간 타입
° using과 on을 갖는 외부 조인 。기본값
• 뷰정의 。 대형 객체
。실체화 뷰 ◊ clob
。뷰 관리 〇 blob
。뷰 갱신 。사용자 정의 타입
• 트랜잭션 。고유 타입
。커밋 작업 。도메인
。롤백 작업 。타입 변환
〇 원자적 트랜잭션 • 카탈로그
• 제약조건 • 스키마
° 무결성 제약 조건 • 인덱스
。도메인 제약 조건 • 특권
〇 Unique 제약 조건 。특권 유형
〇 Check 절 〇 select
。 참조 무결성 〇 insert
〇 연쇄 삭제 〇 update
162 PART 1 관계형언어
。특권 부여 • 뷰에 대한 권한
。특권 취소 • 실행 권한
。특권 부여를 위한 특권 • 호출자특권
° (권한) 부여 옵션 • 행 수준권한
• ' 가상 사설 데이터베이스(VPD)
실전문제
4.1 교수의 이름과 함께 2017년 봄에 강의한 모든 과목의 제목을 찾으려고 한다. 다음의 SQL 질의를
고려해 보자.
4.3 SQL의 outer join 연산을 사용하지 않고도 외부 조인 표현식을 평가할 수 있다. 이를 예시하기 위
해 outer join 표현식을 사용하지 않고 다음의 각 SQL 질의를 어떻게 재작성할 수 있는지 보여라.
4.4 가령 모든 속성을 not null로 선언한 세 개의 릴레이션, r(A, B), s(B, 〇, t(B. 4)가 있다고 해 보
スト. 다음의 표현을 생각해 보자.
b. r natural left outer join (s natural left outer join り의 결과가 속성 C에 대해서는 널 값을
가지지만 속성。에 대해서는 널이 아닌 값을 가지는 r, s, f의 인스턴스가 있겠는가? 있다면
Chapter 4 중급 SQL 163
4.5 SQL 질의 작성 테스트 한글로 표현한 질의를 SQL 문으로 정확히 변환했는지 보기 위해, 복수
의 데이터베이스상에서 해당 SQL 질의를 실제로 실행해 보고 사람이 각 테스트 데이터베이스상
에 나타난 질의 결과가 한글로 명시한 의도대로 잘 일치하는지 확인한다.
4.7 그림 4.12의 직원 데이터베이스를 생각해 보자. 이 데이터베이스의 SQL DDL 정의를 제시하라.
a. 이러한 제약 조건을 위반하는 모든 (instructor, section) 조합을 반환하는 SQL 질의를 작성하라.
b. 이러한 제약 조건을 강제하는 SQL 주장을 작성하라. (4.4.8절에서 논의한 바와 같이, 그러한
주장이 SQL 표준의 일부분임에도 불구하고 현세대 데이터베이스 시스템은 주장을 지원하지
않는다.)
164 PART 1 관계형 언어
4.10 주어 진 릴레 이 션 a(name, address, Me)와 b(name, address, sH〃ワ)가 있다고 하자. natural join
문법 을 사용하지 않는 대 신, on 조건을 갖는 full outer join 연산을 사용하여 a natural full outer
join か를 어떻게 표현할 수 있을지 보여라. coalesce 연산을 사용해서 이러한 일을 수행할 수도 있
다. 결과 릴레이션은 〃初e과 address 속성에 대한 복사본을 두 개 이상 가지지 못하며, 〃와 わ의
일부 튜플이 〃。“e과 address 속성에 널 값을 가지고 있다고 해도 해당 해결책이 옳게 동작해야
한다.
연습문제
from 절에 natural join seグ汕2을 추가해도 위 질의의 결과는 바뀌지 않을 수 있다. 왜 그러한지
그 이유를 설명하라.
4.15 아래의 질의를 자연 조인을 사용하지 않고 대신 using 조건을 갖는 내부 조인을 사용하여 재작성
하라.
select *
from section natural join classroom
4.16 대학교 스키마를 사용한 SQL 질의를 작성하여 대학교에서 어떤 과목도 수강한 적이 없는 각 학
생의 ID를 찾는 질의를 작성하라. 이것을 하위 질의나 어떤 집합 연산 없이 (외부 조인을 사용해)
작성하라.
select ID
from student
except
select sJd
from advisor
where iJD is not null
4.18 그림 4.12의 데이터베이스에 대해서, 관리자가 없는 각 직원의 ID를 찾는 질의를 작성해 보라. 여
기서 직원은 관리자 목록이 없으며 널 관리자도 없을 수 있다. 외부 조인을 사용한 질의를 작성해
보고, 외부 조인이 전혀 없는 질의로도 바꿔 보라.
select *
from student natural full outer join takes
natural full outer join course
4.23 Satoshi라는 관리자가 어떤 권한을 수여할 때, 사용자 Satoshi가 아니라 왜 관리자 역할로 권한 부
여를 수행하는지 설명하라.
4.25 사용자가 또 다른 릴레이션 r2를 참조하는 외래 키를 사용하여 새로운 릴레이션 rl을 생성한다고
가정하자.「2에 대한 어떤 권한 특권이 해당 사용자에게 필요한가? 그러한 권한 부여 없이 왜 이
것을 쉽게 허용하면 안 되는가?
더 읽어보기
참고문헌
[Astrahan et al. (1976)] M. M. Astrahan, M. W. Biasgen, D. D. Chamberlin, K. P. Eswaran,
J. N. Gray, P. P. Griffiths, W. F. King, R. A. Lorie, P. R. McJones, J. W. Mehl, G. R. Putz이u,
I. L. Traiger, B. W. Wade, and V. Watson, “System R, A Relational Approach to Data Base
Management ', ACM Transactions on Database Systems, Volume 1, Number 2 (1976), pages 97-
137.
[Chamberlin et al. (1976)] D. D. Chamberlin, M. M. Astrahan, K. P. Eswaran, P. P. Griffiths, R.
A. Lorie, J. W. M아il, P. Reisner, and B. W. Wade, “SEQUEL 2: A Unified Approach to Data
Definition, Manipulation, and Control
* , IBM Journal of Research and Development, Volume 20,
Number 6 (1976), pages 560-575.
[Chamberlin et al. (1981)] D. D. Chamberlin, M. M. Astrahan, M. W. Biasgen, J. N. Gray, W.
F. King, B. G. Lindsay, R. A. Lorie, J. W. Mehl, T. G. Price, P. G. Selinger, M. Schkolnick, D.
R. Slutz, I. L. Traiger, B. W. Wade, and R. A. Yost, “A History and Evaluation of System R \
Communications of the ACM, Volume 24, Number 10 (1981), pages 632-646.
[Melton and Simon (2001)] J. Melton and A. R. Simon, SQL: 1999, Understanding Relational
Language Components, Morgan Kaufmann (2001).
크레딧
고급 SQL
는 방법, 절차적 동작을 지원하기 위해 SQL을 확장하는 방법, 혹은 절차적 언어로 정의된 함수가
SQL은 강력한 선언형 질의어를 제공한다. SQL로 질의를 작성할 때 범용의 프로그래밍 언어로 동
일한 질의를 작성하는 것보다 일반적으로 훨씬 쉽다. 그러나 데이터베이스 프로그래머는 적어도
가능한 질의가 존재한다는 의미다. 그러한 질의를 작성하기 위해서 더욱 강력한 언어에 SQL을
내장할 수 있다.
167
168 PART 1 관계형언어
수로 결과를 가져올 수 있도록 한다. SQL의 동적 SQL 요소는 프로그램이 실행 시간에 SQL 질
의를 구성하고 완료할 수 있도록 한다.
나는 ODBC(5.1.3절)로 처음에는 C 언어를 위해, 이후에 C++, C#, Ruby, Go. PHP, 그리고
않는다.
SQL을 범용 언어와 접목하는 데 주요한 과제는 이러한 언어가 데이터를 다루는 방식이 서로 다
르다는 점이다. SQL에서 데이터의 기본적인 타입은 릴레이션이다. SQL 구문은 릴레이션에 대해
동작을 수행하고 결과로서 릴레이션을 반환한다. 프로그래밍 언어는 보통 한 번에 하나의 변수에
대응한다. 따라서 이러한 두 종류의 언어를 하나의 응용 프로그램으로 통합하기 위해서는 프로그
5.1.1 JDBC
JDBC 표준은 Java 프로그램이 데이터베이스에 접속할 수 있는 응용 프로그램 인터페이스(appli
cation program interface, API)를 정의한다. (JDBC라는 단어는 원래 Java Database Connectivity
의 약어이지만, 이제 풀네임은 더 이상 통용되지 않는다.)
5.1.1.1 데이터베이스접속
jdbc:mysql: 이다.
한 번 데이터베이스 접속이 열리면 프로그램은 접속을 사용해서 실행을 위한 SQL 구문을 데이터
SQL 구문을 전달하는 메소드를 호출하도록 해 주는 객체다. 예제는 conn 접속에 대해 Statement
접근자(stmt)를 생성한다.
1 허용되는 매 개변수가 다른 여 러 버전의 getConnection() 메소드가 있다. 여 기서는 가장 흔히 사용되는 버전을 사용한다.
2 버전 4 이전에 드라이버를 찾는 것은 하나의 인자를 가진 Class.forName을 호출함으로써 수동적으로 이루어졌다. 이 클래
스는 getConnection 호출 이전 코드 줄에 있는 java.sql.Driver 인터페이스를 구현하는 구체적인 클래스를 가리킨다.
Chapter 5 고급 SQL 171
구문을 실행하기 위해 SQL 구문이 (결과 집합을 반환하는) 질의인지 또는 update, insert,
5.1.1.3 예외및 자원 관리
SQL 메소드 실행은 예외 사항 발생으로 이어질 수 있다. try{ ...} catch{ ... } 구문은 JDBC 호출
에서 발생되는 어떠한 예외 사항(오류 조건)을 받아서 적절한 처리를 할 수 있도록 해 준다. JDBC
성해야 한다.
사항으로 인해 종료되면 폐쇄를 호출한 Java 구문이 실행되지 않기 때문에 실패하게 된다. 이런 이
체는 try 구문의 중괄호({})가 아니라 소괄호(())안에서 수행된다. 소괄호 안에서 개방된 자원은 try
블록 끝에 이르면 자동으로 폐쇄된다. 이것은 프로그래머가 접속이나 구문을 폐쇄하지 않고 그대
이용해 접속을 명시적으로 폐쇄했고 stmt.close()를 이용해 구문을 명시적으로 폐쇄했다. 그러나
실제로는 자동으로 폐쇄되기 때문에 꼭 그럴 필요는 없다.
5.1.1.4 질의결과검색
아 있다면 그것을 받아 온다. next() 메소드의 반환값은 튜플을 받아 왔는지를 나타내는 Boolean
값이다. 받아 온 튜플의 속성은 get으로 시작하는 이름을 가진 다양한 메소드를 사용해서 검색한
다. getString() 메소드는 (Java String 객체로 값을 변환해서) 기본 SQL 데이터 타입을 검색할 수
있지만 getFloat()와 같은 더 제한적인 메소드도 사용될 수 있다. 다양한 get 메소드의 인자는 문
자열로 명시된 속성 이름이나 튜플 내의 얻고자 하는 속성의 위치를 나타내는 정수일 수 있다. 그
5.1.1.5 준비된구문
어 들인 다음 SQL 구문을 만들기 위해 Java 문자열 조작을 사용한다고 가정해 보자. 사용자가 작
은따옴표와 같은 어떤 특별한 문자를 입력한다면 결과적인 SQL 구문은 입력을 점검하는 별도의
가 다음의 Java 표현식을 사용해서 문자열을 연결시켜서 만들어지고 질의는 Statement 객체의
"insert into instructor valuesC " + ID + " + name + " ", " +
“+ dept.name + " " + salary + ")"
위 예제가 성가신 작업으로만 여겨질 수 있지만, 상황은 더 나빠질 수 있다. SQL 삽입(SQL
injection)이라 불리는 기술은 데이터를 훔치거나 데이터베이스에 손상을 주려는 악의적인 해커에
의해 사용될 수도 있다.
그것은
준비된 구문의 사용은 입력 문자열이 삽입된 탈출 문자를 가지기 때문에 이러한 문제를 방지할
프로그래머는 사용자 입력 문자열을 오직 준비된 구문의 인자를 통해서만 데이터베이스에 전달해야 한다.
사용자 입력 값을 가지고 문자열을 만들어 SQL 질의를 작성하는 것은 매우 심각한 보안상의 문제를 발생시
결과를 초래한다. 이러한 구문이 Java 프로그램 소유자의 권한으로 실행되기 때문에 drop table과
같은 엄청난 손상을 가하는 SQL 구문이 실행될 수 있다. 일부 데이터베이스는 아직도 다수의 문장
소드로 반드시 등록되어야 하고 결과 집합에서 이 메소드와 비슷한 get 메소드로 검색할 수 있다.
5.1.1.7 메타데이터특성
않는다. 그러한 선언은 SQL DDL 구문의 부분이다. 따라서 JDBC를 사용하는 Java 프로그램은 프
진다.
터베이스 접속을 다루는 것으로 가정한다. getColumns() 메소드는 카탈로그 이름(널은 카탈로그
이름이 무시되는 것을 의미한다), 스키마 이름 패턴, 테이블 이름 패턴, 열 이름 패턴의 네 개의 매
개변수를 가지고 있다. 스키마 이름, 테이블 이름과 열 이름의 패턴은 이름이나 패턴을 명시하는 데
사용될 수 있다. 패턴은 SQL 문자열 매칭 문자인 꺙'와 “一”를 사용한다. 예를 들면, “%”는 모든 이
름과 매칭된다. 명시된 이름이나 패턴을 만족히는 스키마 테이블의 열만 검색된다. 결과 집합의 각
메타데이터 정보는 이러한 업무에 사용되는 코드를 만들기 위해 사용될 수도 있다. 예를 들면, 릴레
도록 작성되어야 한다. 이와 유사하게 질의문, 질의의 수행, 정형화된 테이블로 결과를 출력하는 코
5.1.1.8 다른특징
import psycopg2
기능에 포함되어 있지는 않기 때문에 행 집합의 사용에 대해서는 자세하게 다루지 않는다.
포함한 구문은 Python을 활용하여 JDBC의 준비된 구문과 동일한 기능을 지원한다. 여기서 인자는
“%s”로 식별되며 리스트 형태로 인자 값이 제공된다. 갱신은 데이터베이스에 자동으로 커밋되지
않는다. 갱신을 거밋하기 위해서는 commit() 메소드를 호출해야 한다.
178 PART 1 관계형언어
다. 그러나 JDBC와 다르게 드라이버 종류에 따라서 API의 사소한 차이가 존재할 수 있다. 특히
5.1.3 ODBC
Open Database Connectivity(ODBC) 표준은 응용 프로그램이 데이터베이스에 접속을 열고, 질
그림 5.5는 ODBC API를 사용한 C 코드의 예다. ODBC를 이용하여 서버와 통신하기 위한 첫
단계는 서버와의 접속을 만드는 것이다. 그러기 위해서 프로그램은 먼저 SQL 환경과 데이터베이
스 접속 핸들(database connection handle)을 할당한다. ODBC는 타입 HENV. HDBC, RETCODE
속 핸들과 연결할 서 버, 사용자 식별자와 암호를 포함하는 몇 개의 인자를 가지고 있다. 상수 SQL_
한다. C 언어의 변수는 질의 결과의 속성과 결합되고 SQLFetch를 사용하여 결과 튜플을 추출할
void 〇DBCexam이e()
(
RETCODE error;
HENV env; /* environment *
/
HDBC conn; /* database connection *
/
SQLAIIocEnv(&env);
SQLAIIocConnect(envz &conn);
SQLConnect(connz "db.ya拒•edu"z SQL_NTS/ 〃avi"z SQL_NTSZ
“avipasswd”, SQL_NTS);
(
char deptnamet80];
float salary;
int lenOutl lenOut2;
HSTMT stmt-
5.1.4 내장 SQL
SQL 표준은 C, C++, Cobol, Pascal, Java, PL/I, 그리고 Fortran 등과 같은 다양한 종류의 프로그
래밍 언어에서 SQL을 내장할 수 있도록 정의하고 있다. SQL 질의를 내장하는 언어를 호스트(host)
언어의 컴파일러로 컴파일하게 된다. 이것이 내장 SQL과• JDBC나 ODBC와의 주요한 차이점이다.
내장 SQL을 위한 정확한 문법은 SQL이 내장되는 언어에 종속적이다. 더 자세한 사항은 사용하
고자 하는 특정 내장 언어의 사용자 설명서를 참고하라.
Chapter 5 고급 SQL 181
노트 5.1 내장형데이터베이스
스를 구현한 일부 패키지 중에 하나가 사용될 수 있다. 이런 패키지로는 Java DB, SQLite, 그리고
HSQLDB 등이 있다. MySQL의 내장형 버전도 있다.
내장형 데이터베이스 시스템은 서버 기반 데이터베이스 시스템의 많은 기능이 부족하다. 데이터
베이스 추상화는 필요하나 대규모 데이터베이스를 지원할 필요가 없거나 대규모 트랜잭션 처리가
필요 없는 응용 프로그램에는 적합할 수 있다.
할 수 있다. 전처리기가 SQL 구문을 식별하는 데 사용하는 생성자가 문법적으로 호스트 언어의 후
속 버전에서 소개된 호스트 언어 문법과 충돌할 수 있다.
Microsoft Language Integrated Query(LINQ) 기능인데 이것은 내장 SQL 질의를 호스트 언어로
변환하기 위해 전처리기를 사용하는 대신 호스트 언어를 확장한 것이다.
SQL은 함수, 프로시저, 메소드의 정의를 허용한다. 이런 것은 SQL의 절차형 구성요소나 Java,
C, C++ 등과 같은 외부 프로그래밍 언어에 의해 정의된다. 우선 SQL의 정의를 보고 5.2.3절에서
외부 언어를 사용하여 정의하는 방법을 살펴본다.
학과의 이름을 받아서 그 학과 교수의 수를 반환하는 함수를 생각해 보자. 이 함수는 그림 5.6과 같
다.4 이 함수는 아래와 같이 12명 이상의 교수를 가진 모든 학과의 이름과 예산을 반환하는 질의에
사용될 수 있다.
4 자신의 함수와 프로시저를 작성한다면, 디버깅할 때 (함수를 대체해서) 코드를 수정하기 쉽도록 create보다는 'create or
replace”를 써야 한다.
Chapter 5 고급 SQL 183
그림 5.7 SQL의테이블함수
SQL 표준은 테이블 함수(table function)라 불리는 테이블 자체를 함수의 결과로 반환하는 함수
를 지원한다. 그림 5.7에서 정의된 함수를 보자. 이 함수는 특정한 학과의 모든 교수를 포함하는 테
이블을 반환한다. 함
*수의 매개변수는 함수 이름의 접두사セ加""亦/epr_a4"?e)로 해서 참조하
는 것을 주의하자.
select *
from table(instructor-of('Finance'));
프로시저나 함수는 5.1 丄5절에서 기술된 JDBC 문법처럼 동적 SQL로부터 호출될 수 있다.
변수는 declare 구문을 사용해서 선언되고 어떤 유효한 SQL 데이터 타입이라도 가질 수 있다.
복합문은 be이n ... end의 형태를 가진다. 즉 begin과 end 사이에 다수의 SQL 구문을 포함할
수 있다. 지역 변수는 5.2.1 절에서 보듯이 중문 안에서 선언될 수 있다. begin atomic ...end 형태
의 중문은 그 안에 포함된 모든 문장이 단일 트랜잭션으로 수행되도록 한다.
repeat
sequence of statements',
until boolean expression
end repeat
leave 문은 반복문을 빠져나갈 때 사용되며 iterate는 나머지 구문을 건너뛰어 반복문의 시작에서
다음 튜플로부터 시작한다.
if boolean expression
then statement or compound statement
elseif boolean expression
then statement or compound statement
else statement or compound statement
end if
SQL은 또한 C/C++ 언어의 case 문(3장에서 다루었던 case 표현)과 비슷한 case 문을 제공한다.
그림 5.8은 프로시저 구문에 대한 더 큰 예를 보여 준다. 그림에서 정의된 register Student 함수
186 PART 1 관계형언어
함수는 성공했다는 것을 알리는 값으로 。보다 크거나 같은 값을, 에러 상태를 알리는 값으로 음수
예외 처리 핸들러는 이러한 조건이 발생하면 begin end 구문을 닫고 빠져나가는 행동을 취한다. 또
5.2.3 외부언어루틴
과적으로 프로그래머는 반드시 각 데이터베이스 제품을 위해서 새로운 언어를 배워야 한다. 대안
SQL은 Java, C#, C, C++ 등과 같은 프로그래밍 언어로 함수를 정의할 수 있다. 이렇게 정의된
함수는 SQL보다 더 효율적일 수 있으며 SQL로 수행되지 못하는 계산이 이러한 함수에 의해 수행
될 수도 있다.
SQL 표준이 프로시저와 함수에 대한 문법을 정의하지만 대부분의 데이터베이스는 표준을 엄격하
게 따르지는 않으며 지원되는 문법에서도 상당한 차이가 존재한다. 이러한 상황이 발생하는 한 가
지 이유는 이러한 데이터베이스가 문법이 표준화되기 전부터 프로시저와 함수를 지원했으며, 계속
해서 원래 문법을 지원했기 때문이다. 여기에서 각 데이터베이스에서 지원하는 문법을 나열하기는
다른 방법도 가능하다. 정확한 방법은 데이터베이스에 따라 다르다. 그러나 함수가 이러한 상황을
시스템 코드와 함께 적재되어 실행된다. 하지만 이렇게 처리하는 것은 프로그램의 버그가 데이터
가지고 있다. 보안보다 효율적인 성능을 우선시하는 데이터베이스 시스템의 경우 이렇게 프로시저
를 실행할 수 있다. 보안에 더 관심을 가지는 데이터베이스 시스템은 코드를 별도의 분리된 부분으
188 PART 1 관계형 언어
Java 함수를 실행하는 것을 허용한다. Microsoft SQL Server는 데이터베이스 프로세스 내에서 실
행하기 위해서 프로시저를 공통 언어 실행(Common Language Runtime, CLR)으로 컴파일하는
5.3 트리거
시키기 위한 유용한 수단이다. 예를 들어, takes 릴레이션에 튜플 하나가 삽입될 때마다 학생의 전
물품의 재고가 최소한도 이하로 내려가면 주문이 자동적으로 이루어진다. 물품에 대한 재고량이
트리거는 데이터베이스 외부에 대한 갱신은 수행할 수 없다. 그렇기 때문에 재고 보충의 예에서
이제 SQL에서 트리거를 구현하는 방법에 대해서 살펴보자. 여기서 보여 주는 문법은 SQL 표준에
정의되어 있지만 대부분의 데이터베이스는 비표준 문법을 사용한다. 여기서의 문법이 그러한 시스
템에서 지원되지 않지만 우리가 서술하는 개념은 구현에 상관없이 적용 가능하다. 노트 5.3에서 비
표준 트리거 구현에 대해 살펴본다. 각 시스템에서 트리거 문법은 함수와 프로시저 작성을 위한 시
SQL의 삽입 문장은 릴레이션의 여러 튜플을 삽입할 수 있고, 트리거 코드의 for each row 절은 명
시 적으로 각각의 삽입된 행에 대해 반복된다. referencing new row as 절은 삽입된 행의 삽입 후
로 남겨 둔다.
갱신의 경우, 트리거는 어느 속성의 갱신이 트리거를 실행하게 하는지를 명시할 수 있다. 다른
속성에 대한 갱신은 트리거를 실행시키지 않는다. 예를 들어, takes 릴레이션의 grade 속성에 대한
그림 5.10은 takes 릴레이션에 있는 튜플의 grade 속성이 갱신되었을 때 최신의 student 튜플의
tot_cred 속성값을 유지하기 위해 사용하는 트리거를 보여 준다. 이 트리거는 널이나 下’ 값으로 있
던 과목이 성공적으로 이수되어 grade 속성이 갱신될 때에만 총이수학점이 증가하는 연산을 실행
포함하고, grade가 성공적인 이수를 나타내면 takes 릴레이션에 삽입하도록 하는 연산이 표현되게
트리를 가지고 있는지를 검사하고 그 학생이 들었던 과목을 shs에서 삭제하는 것이다.
로 만들 수 있는 사건을 지원한다.
다. 잘못된 행동이 실행되어 오류를 발생시키는 대신 트리거가 갱<1, 삽입, 삭제가 올바르게 수행
되도록 문제를 수정하기 위한 행동을 취할 것이다. 예를 들어, 이름이 department 릴레이션에 없는
나타내기 위해 삽입된 학점의 값이 공백인 경우를 가정해 보자. 우리는 널 값으로 그 값을 대체하
는 트리거를 정의할 수 있다. 그러한 수정을 수행하기 위해서 set 구문을 사용할 수 있다. 이와 같은
체에 단일 동작을 수행할 수도 있다. 그렇게 하기 위해 for each row 절 대신 for each statement
트리거나 행 트리거에 관계없이 before 트리거와 함께 사용할 수 없고, after 트리거와 함께 사용할
이지만 alter trigger trigger_name disable(어떤 데이터베이스 시스템은 disable trigger trigger_
트리거가 SQL: 1999 전에는 SQL 표준이 아니었지만 SQL 기반 데이터베이스 시스템은 트리거
를 많이 사용했다. 불행히도 각 데이터베이스 시스템은 자신만의 트리거를 위한 문법을 고안해서
호환성이 없어졌다. 여기서 사용된 SQL: 19995] 트리거에 대한 문법은 IBM DB2와 Oracle 데이터
노트 5.3 비표준트리거문법
여기서 서술된 트리거 문법이 SQL 표준의 일부분이고, IBM DB2에서 지원하지만 대부분의 다른
데이터베이스 시스템은 트리거를 명세하기 위해 비표준 문법을 사용하고 있고, SQL 표준에 있는
모든 기능을 구현하고 있지는 않다. 아래에 일부 차이점에 대한 개요를 서술한다. 더 자세한 사항
은 각 시스템의 사용자 설명서를 참고하라.
예를 들어, Oracle 문법은 SQL 표준 문법과 달리 row 키워드가 referencing 구문에 나타나지 않
는다. 그리고 atomic 키워드가 begin 후에 나오지도 않는다. update 구문으로 둘러싸인 select 문
5.3.3 트리거가부적합한경우
5.3.2 절에서 본 것처럼 트리거가 유용하게 사용되는 경우도 많지만, 어떤 경우에는 다른 기술을 이
용하여 더 적합하게 처리할 수 있다. 예를 들어, 연쇄(cascade) 기능을 사용하는 대신, 트리거를 사
을 더 어렵게 만든다.
할수있다.
트리거는 매우 신중히 사용되어야 한다. 왜냐하면 실행 시간에 검출되는 트리거 오류가 트리거
스템은 일반적으로 이러한 트리거 연결고리의 길이에 제한을 두고(예를 들면, 16이나 32같이), 이
보다 긴 트리거 연결고리를 갖는 경우 오류로 처리한다. 다른 시스템은 처음에 트리거를 유발한 수
트리거는 매우 유용한 용도로 사용될 수 있지만 대안이 존재하면 최대한 피하는 것이 좋다. 많은
coursedd prereqdd
BIO-301 BIO-1 이
BIO-399 BIO-1 이
CS-190 CS-101
CS-315 CS-190
CS-319 CS-101
CS-319 CS-315
CS-347 CS-319
5.4 재귀 질의
6 prereq의 인스턴스는 앞에서 설명한 것과는 다르다. 그 이유는 재귀 질의를 설명하면 명백해질 것이다.
196 PART 1 관계형 언어
SQL은 create temporary table 명령을 사용해서 임시 테이블을 생성할 수 있다는 것을 기 억하자.
temporary table은 질의를 수행하는 트랜잭션 동안에만 존재하고 트랜잭션이 끝날 때 삭제된다. 게
다가ガ"ルWPreregs의 두 개의 인스턴스가 동시에 수행된다면 각각은 자시만의 임시 테이블의 사
본을 얻게 된다. 만약 두 인스턴스가 사본을 공유했다면 그 결과는 올바르지 않을 것이다.
하고 일치하는 속성의 이름을 바꾸는 것이다. 이러한 상황이라면 도착 가능성이 순환으로 나타난
다. 하지만 이미 방문한 도시는 제거되기 때문에 함수는 올바르게 동작한다.
5.4.2 SQL에서 재귀
반복을 사용하여 이행 폐포를 명시하는 것은 다소 불편하다. 대안적인 방법으로 재귀적 뷰 정의를
• CS-347에 대한 선행 과목
• CS-347에 (직접 혹은 간접적 인) 선행 과목에 대한 선행 과목
있다.
198 PART 1 관계형 언어
SQL 표준은 뷰(혹은 임시 뷰)를 표현할 때 with recursive 절을 사용하여 재귀의 제한적인 형태
를 제공한다. 예를 들면, 구체적으로 이행 폐포를 표현하기 위해 재귀 질의가 사용될 수 있다. 이미
그림 5.16 SQL에서재귀질의
질의는 적어도 이전과 같은 수의 튜플들의 집합을 반환할 것이며, 추가적인 튜플을 반환하는 것도
가능할 것이다.
• 재귀적 뷰에서 집계
질의가 단조롭지 않다면 뷰의 의미는 정의하기 힘들다. 따라서 SQL은 질의가 단조로워야 한다. 재
SQL 역시 with recursive를 대신해서 create recursive view를 사용하여 재귀적으로 정의된 영
구적 인 뷰 생성을 허용한다. 일부 시스템의 경우 다른 문법으로 재귀 질의를 지원한다. Oracle은 계
층적 질의라고 부르는 start with/connect by prior 문법을 통해 지원한다一더 자세한 사항은 각 시
스템의 사용자 설명서를 참고하라.
9 Oracle 12.c 버전부터 이러한 문법이 기존의 계층적 문법에 추가되었다. recursive 키워드는 생략되고 여기의 예제처럼
union 대신 union all 사용을 요구한다.
200 PART 1 관계형 언어
5.5 고급 집계 기능
앞에서 살펴본 SQL의 집계 지원은 상당히 강력하고, 대부분의 공통적인 작업을 쉽게 다룬다. 그러
나 기본 집계 기능을 사용해서 효율적으로 구현하기 어 려운 작업이 있다. 그러한 일부 작업을 다루
5 .5.1 순위화
이 집합의 백분위수를 구하는 것이다. 물론 이러한 질의를 여태까지 살펴본 SQL 구조를 이용해서
순위화는 order by 명세를 사용하여 수행할 수 있다. 다음 질의로 각 학생의 순위를 얻을 수 있다.
결과물의 튜플이 순위에 의해 정렬된 것이 아니기 때문에 튜플들의 순서가 정해지지 않았음을 주
10 student grades 뷰를 생성하기 위한 SQL 문은 takes 릴레이션에 있는 문자 등급을 숫자로 바꾸고 해당 과목에 대한 학점 수
를 이용해서 각 과목에 대한 등급에 대한 가중치를 매겨야 하기 때문에 약간 복잡하다. 이 뷰의 정의가 문제 4.6의 목표다,
Chapter 5 고급 SQL 오01
때에는 주의가 필요하다. SQL에서 nulls first 혹은 nulls last> 사용해서 널 값이 출현하는 위치를
사용자가 명세할 수 있다. 예를 들어,
select ID, rank () over (order by GPA desc nulls last) as shrank
from student.grades\
학생의 순위는 위 질의에서 명시하는 것처럼 (1+더 높은 평점을 가진 학생의 수)가 된다” 그러
나 각 학생 순위의 이러한 계산은 릴레이션의 크기에 비례하는 시간이 걸린다. 그래서 전체 시간
다중 rank 표현식은 단일 select 문장 내에서 사용될 수 있는데, 동일한 select 절에서 두 rank
표현식을 이용하여 해당 학과 내의 순위와 전체 순위를 구할 수 있다. 흥미로운 사실은 순위화
11 만약 학생이 어떤 과목도 수강하지 않아 널 GPA를 갖는다면 미묘한 기술적 차이가 존재한다. SQL에서 널 값 비교가 동작하
는 방식 때문에 널 GPA를 갖는 학생들이 다른 학생들의 count 값에 영향을 미치지 않는다.
202 PART 1 관계형 언어
select *
from (select ID, rank() over (order by (GPA) desc) as s.rank
from student-grades)
where sjrank <— 5;
동순위가 있는 경우 마지막 순위가 임의로 잘릴 수 있다. 이러한 “상위 ”(top,ガ 질의의 정확한 문
법은 시스템마다 상이하다. 노트 5.4를 참고하라. 상위 n 질의의 생성자는 분할을 지원하지 않는다.
순위화를 수행하지 않는 각 분할에서 상위 “ 튜플을 추출할 수 없다.
는 (r - 1 )/(〃 - 1)로 정의할 수 있다1해당 분할에 오직 하나의 튜플만 존재하면 널 값으로 정의한
분할을 입 력으로 받아 같은 수의 튜플을 가지는 〃개의 버킷으로 나눈다 " 각 튜플에 대해 ntile(〃)은
노트 5.4 상위 N 질의
IBM DB2와 Oracle의 가장 최신 버전에는 limit 절과 동일한 기능을 제공하는 fetch first 10 rows
only가 있다. Microsoft SQL Server는 분리된 limit 절을 추가하지 않고 select 절에 이러한 기능
을 추가했다. select 절을 select top 10 ID, G/X로 직성할 수 있다.
Oracle(현재 그리고 이전 버전)은 이러한 기능을 위해 row number 개념을 제공한다. 특별하면서
도 숨겨진 속성인 mwnwn은 결과 릴레이션의 튜플에 대해서 검색된 순서대로 붙인 번호다. 이 속
성은 포함 질의 안에 where 절에서 사용될 수 있다. 그러나 이런 기능의 사용은 행이 order by 절
에 의해 정렬되기 전에 row,"加이 결정되기 때문에 조금 까다롭다. rovv〃",n을 적절히 사용하기 위
해서는 중첩 질의가 다음과 같이 사용되어야 한다.
select *
from (select ID, GPA
from student grades
order by GPA desc)
where rownum <= 10;
5. 5.2 윈도우
윈도우 질의는 튜플의 범위에 대한 집계 함수를 계산한다. 이것은 예를 들어, 시간의 고정된 범위에
에 따라 날마다 변동이 심하다(예를 들면, 눈보라, 홍수, 허리케인, 지진 기간에는 판매량이 줄어들
수 있다). 그러나 충분히 긴 기간에 대해서는 변동이 적어질 것이다(날씨 관련된 판매량 하강이 “회
복”을 보이게 된다). 주식 시장 동향 분석이 윈도우 개념을 사용한 또 다른 예다. 다양한 “이동 평
균이 기 업과 투자 웹 사이트에서 발견된다.
해 이미 살펴본 기능을 사용해서 SQL 질의를 작성하는 것은 비교적 쉽다. 하지만 매 3일에 대해
이 러한 작업을 하고자 한다면 질의는 복잡해진다.
표되므로 윈도우 정의의 결과는 2017, 2018, 2019년에 대한 값들의 평균이다. 매년의 평균이 유사
한 방법으로 계산된다. 릴레이션 tot,redits의 가장 빠른 해에 평균은 그해 자체이고, 그다음 해는
preceding 대신 following 키워드를 사용할 수 있다. 예제에서 이렇게 한다면, year 값이 윈도우
의 끝 대신 시작을 명시하게 된다. 비슷하게 현재 튜플의 앞에 윈도우 시작, 현재 튜플 뒤에 윈도우
끝을 명시할 수 있다.
row 대신에 range 키워드를 사용하는 것은 윈도우 질의가 특정 개수의 튜플이 아니라 특정한
값을 갖는 모든 튜플을 대상으로 한다는 것을 의미한다. 예를 들어, rows current row는 정확히 하
5. 5.3 피벗팅
유행하는 옷의 종류를 알고자 하는 상점을 생각해 보자. 옷은 품목명, 색, 크기에 의해 구별될 수 있
item_name은 (skirt, dress, shirt, pants) 중 하나, color는 (dark, pastel, white) 중 하나, clothes_size
Microsoft SQL Server, Oracle과 같은 SQL 제품은 크로스탭 생성을 허용하는 pivot 절을 지원
Chapter 5 고급 SQL 207
select *
from sales
pivot (
sum(り”〃〃〃りり
for color in ('dark: 'past이', 'white')
)
pivot을 사용한 질의는 pivot 생성자 없이 기본 SQL 생성자를 사용해 작성될 수 있다. 그러나
pivot 생성자는 이러한 질의 작성을 단순화한다.
5.5.4 롤업과큐브
SQL은 cube와 rollup 연산을 사용하여 group by 연산자의 일반화를 제공한다. cube와 rollup 연
산은 다수의 group by 질의가 단일 질의에서 수행되고 결과도 단일 릴레이션으로 반환되도록 해
준다.
데이터 분석은 다양한 방법으로 집계된 데이터를 볼 필요가 있다. SQL rolhip과 cube 생성자는
다수의 질의를 작성하는 대신 단일 질의를 사용해 이러한 다수의 집계 연산을 간략하게 할 수 있는
방법을 제공한다.
이 질의의 결과는 그림 5.19와 같다. 위 질의는 union 연산을 사용하는 다음 질의와 동일하다.
여기서 ()는 빈 group by 리스트를 의미한다. r이lup 절에 나열된 속성의 각 전위(prefix) 속성(빈
이다. 다른 그룹은 다른 스키마를 생성한다. 다른 그룹의 결과로 공통의 스키마를 만들기 위해서는
다음 그룹을 생성한다.
다수의 rollup과 cube는 단일 group by 절에서 사용될 수 있다. 예를 들어, 다음의 질의가 있을 때
16 SQL의 외부 합집합(outer union) 연산은 공통의 스키마를 갖지 않는 릴레이션들의 합집합(union)을 구하는 데 사용될 수 있
다. 결과로 얻어지는 스키마는 입력으로 들어오는 모든 속성의 합집합이 된다, 각 입력 튜플은 해당 튜플에 없는 속성에 대
해서는 널 값으로 채워서 출력 튜플로 매핑된다. 합집합 질의는 외부 합집합으로 작성될 수 있다. 그리고 이 경우 위 질의처
럼 속성 이름을 널을 이용해 널 값 속성임을 명시적으로 표시할 필요가 없다.
210 PART 1 관계형언어
coalesce를 사용하는 다음의 질의를 살펴보자. 그러나 이것은 널 품목 이름과 색상을 잘못해서
모두 all로 변환할 수 있다.
5.6 요약
• SQL 질의는 내장형과 동적 SQL을 통해서 호스트 언어로부터 호출될 수 있다. ODBC와 JDBC
표준은 C와 Java 언어 프로그램으로부터 SQL 데이터베이스에 접근하기 위한 응용 프로그램 인
터페이스를 정의한다.
용어정리
• JDBC • 샌드박스
• 준비된구문 • 트리거
• SQL 삽입 • 이행 폐포
• 메타데이터 • 계층도
• 갱신 가능한 결과 집합 • 임시테이블생성
• ODBC • 기본질의
• 내장 SQL • 재귀 질의
• 내장형 데이터베이스 • 고정점
• 저장된프로시저와함수 • 단조
• 테이블함수 • 윈도우
• 매개변수화된뷰 • 순위화함수
• 영구저장모듈(PSM) • 크로스탭
• 예외조건 • 피벗테이블
• 핸들러 • 피벗
• 외부언어루틴 • SQL group by cube, group by rollup
212 PART 1 관계형 언어
실전문제
그림 5.20의 JDBC API를 사용하는 Java 코드를 참고하라. userid, password, machine name 등
이 모두 올바르다고 가정하자. Java 프로그램이 수행하는 것을 정확하게 서술하라(즉 Java 구문이
수행하는 것에 대한 한 줄씩의 서술이 아닌 “그것은 장난감 부서의 관리자를 찾는다.”와 같은 문
장을 만들라).
5.2 입력 매개변수로 Res니tSet을 갖고 JDBC 메타데이터 특성을 사용하는 Java 함수를 작성하고 열
제목으로 적절한 이름을 가지고 표의 형태로 결과를 출력하라.
import java.s 이.
;
*
public 이ass Mystery {
public static void main(String[] args) {
try (
Connection con=DriverManager.getConnection(
z,jdbc:oracle:thin:star/X®//edgar.cse.lehigh.edu:1521/XEz/)
q = "s이ect mname from mgr where enam은 = ?”;
PreparedStatement stmt=con.prepareStatement();
)
(
String q;
String empName = "dog";
boolean more;
ResultSet result;
do {
stmt.setString(1z empName);
result = stmt.executeQuery(q);
more = result.nextO;
if (more) {
empName = result.getString("mname/z);
System.out.println (empName);
)
} while (more);
s. 이 ose();
con.closeO;
)
catch(Exception e){
e.printStackTraceO;
)
)
)
5.3 주어진 과목 이전에 수강해야 하는 모든 선행 과목을 찾고자 한다. 이것은 어떤 과목이 주어지면
해당 과목의 선행 과목뿐만 아니라 선행 과목의 선행 과목을 모두 찾아야 한다는 것을 의미한다.
• 결과를출력한다.
5.6 그림 5.21 의 은행 데이터베이스를 고려해 보자. 다음과 같이 정의된 branch_cust 뷰가 있다고 흐ト자.
5.7 그림 5.21 의 은행 데이터베이스를 고려해 보자. 다음 동작을 수행하는 SQL 트리거를 작성하라.
5.10 문제 5.9의 릴레이션을 이용해서 연도별, 월별, 거래날짜별로 거래된 주식의 수, 거래의 수, 총 거
래 금액을 보여 주는 보고서를 생성할 수 있는 SQL 질의를 작성하라.
5.11 롤업을 사용해서 group by cube(a, b, c, 分를 어떻게 표현하는지 보여라. 단, 하나의 group by만
사용해야 한다.
연습문제
잘못된 입력에 대해서 주의 깊게 검사해야 한다. SQL 질의가 예외 상황을 발생시키지 않도록 주
의하라. 로그인 시 사용자가 잘못된 비밀번호를 입력할 수 있기 때문에 예외 상황이 발생할 수 있
으나 이런 예외 상황을 적절히 처리해서 다시 비밀번호를 입력할 수 있도록 해야 한다.
5.13 메소드 static void printTable(String r);을 포함하는 MetaDisplay 클래스를 Java로 정의해야
한다고 가정하자. 이 메소드는 입력으로 릴레이션 이름 r을 가지고 질의 ,select * from r”을 실행
하고, 테이블의 윗부분에 속성 이름이 표시되는 멋진 테이블 형식으로 결과를 출력한다.
연봉을 계산하는 avg.sa/aり 함수를 작성하라. 그리고 이 함수를 이용해서 "First Bank”의 평균
급여보다 더 많은 평균 급여를 받는 직원이 있는 회사를 찾는 SQL 질의를 작성하라.
加a〃의 튜플0, p2, 3將, part-id p?인 부품은 paH-id p1 인 부품의 직 접 하위 부품이고 %이 p2
5.17 문제 5.16의 릴레이션 스키마를 다시 생각해 보자. 모든 하위 부품의 비용을 포함한 -P-100" 부품
의 총비용을 찾도록 비재귀적 SQL을 사용한 JDBC 함수를 작성하라. 부품이 다른 하위 부품으로
다중으로 속할 수 있는 것을 고려하라. 원한다면 Java로 재귀를 사용해도 좋다.
5.18 저장된 프로시저와 함수를 활용할 수 있도록 자신이 사용하는 데이터베이스 시스템의 언어를 이
용하여 문제 5.12를 재작성하라. 대부분의 시스템은 SQL 표준과 다른 문법을 사용하기 때문에
사용하는 시스템의 온라인 문서를 참고하라. 특히 교수의 를 입력으로 받아 문제 5.12에서 명
세된 형태대로 출력하는 프로시저를 작성하라. 교수가 존재하지 않거나 강의하는 과목이 없다면
적 절한 메시 지를 출력하라.
5.20 트리거 실행이 또 다른 트리거의 실행을 유발할 수 있다. 대부분의 데이터베이스 시스템은 연쇄
트리거 유발의 깊이에 제한을 가한다. 그 이유를 설명하라.
)
select building, room-number, time^loLid, count(
*
from r
group by rollup (building, roomjuimber, timeslotjd)
관련도구
더 읽어보기
비록 재귀 질의에 대한 논의가 SQL 문법에 초점을 맞추고 있지만 관계형 데이터베이스에서 재귀를
위한 다른 접근 방법이 있다. 데이터 로그는 Prolog 프로그래밍 언어에 기반한 데이터베이스 언어이고
27.4절(온라인으로 이용 가능)에서 자세히 설명한다.
Chapter 5 고급 SQL 오 17
rollup이나 cube를 포함하여 SQL에 있는 OLAP 기능은 SQL1999에서 소개되었다. 그리고 순위화와
분할과 함께 윈도우 함수는 SQL2003에서 추가되었다. 윈도우 함수를 포함하여 OLAP 기능은 오늘날
대부분의 데이터베이스에서 지원된다. 비록 대부분 SQL 표준 문법을 따르지만 약간씩 차이가 존재한다.
더 スト세한 사항은 자신이 사용하는 시스템의 사용자 설명서를 참고하라. Microsoft의 M니tidimensional
Expressions(MDX)는 OLAP 큐브 질의를 위해 설계된 SQL과 유사한 질의어다.
크레딧
데이터베이스 설계
이를 갱신하는 프로그램의 설계, 데이터 접근을 제어하는 보안 기법의 설계를 포함하는 복잡한 작
업이다. 설계 과정에서 사용자의 요구가 중심적인 역할을 한다. 2부는 데이터베이스 스키마 설계에
초점을 두고, 설계 작업 중의 다른 부분도 설명한다.
6장은 상위 데이터 모델인 개체-관계(E-R) 모델을 설명한다. E-R 모델은 모든 데이터를 테이블
로 표현하는 것 대신에, 개체(entity)라 불리는 기본 객체와 이 객체들 간의 관계(relationship)를 구
분한다. 이 모델은 종종 데이터베이스 스키마 설계의 첫 번째 단계로 사용된다.
219
Chapter 6
지금까지 주어진 데이터베이스 스키마를 가정하고 질의와 갱신을 표현하는 방법에 대해 학습했다.
이터 모델에만 초점을 둔다. E-R 모델은 데이터베이스에서 표현할 개체를 식별하고, 이 개체들의
연관성을 표현하는 방법을 제공한다. 궁극적으로 데이터베이스 설계는 관계형 데이터베이스 설계
와 연관된 제약 조건의 집합으로 표현한다. 따라서 이 장은 E-R 설계를 릴레이션 스키마 집합으로
6.1 설계 과정의 개요
이를 갱신하는 프로그램의 설계, 데이터 접근을 제어하는 보안 기법의 설계를 포함하는 복잡한 작
6.1.1 설계단계
소규모 응용 프로그램의 경우, 응용 프로그램의 요구 사항을 이해하는 데이터베이스 설계자가 생
렵다. 응용 프로그램의 완벽한 데이터 요구 조건을 이해하는 사람을 찾기도 어렵다. 데이터베이스
221
222 PART 2 데이터베이스 설계
준다.
• 다음으로 설계자는 데이터 모델을 선택하고, 선택한 데이터 모델의 개념을 적용함으로써 이러한
이스의 모든 개체 집합, 개체의 속성, 개체들 간의 관계, 그리고 개체와 관계에 대한 제약 조건을
명시한다. 일반적으로 개념적 설계 단계는 스키마의 그래픽 표현을 제공하는 개체-관계 다이어
지 확인하고, 중복되는 사항을 제거한다. 이때 물리적으로 어떻게 저장할 것인지 자세히 규정하
델이며, 이 단계는 일반적으로 개체-관계 모델로 정의한 개념적 스키마를 관계형 스키마로
6.1.2 설계대안
데이터베이스 설계 과정의 중요한 부분은 사람, 장소, 물건 같은 다양한 “유무형”의 형태를 설계할
때 어떻게 표현할 것인지 결정하는 것이다. 개체(entity)라는 용어는 이렇게 식별할 수 있는 항목을
지칭하는 데 사용한다. 대학교 데이터베이스에서 개체의 예로는 교수, 학생, 학과, 과목, 그리고 과
중복성은 관계형 스키마에서도 발생할 수 있다. 우리가 지금까지 사용한 대학교 예제에서 분
는 없다고 가정해 보자. 동일하게, 릴레이션의 관점에서 과목이 제공하는 각각의 분반에 대해서
다. 간단한 예로서 물품을 구매하는 고객을 생각해 보자. 이 물품의 판매는 고객과 물품 간의 관계
도전적인 문제라는 것은 의심의 여지가 없다. 사실 과학과 “좋은 취향[good taste)”의 조합을 요구
하고 있다는 것을 알게 될 것이다.
6.2 개제-관계 모델
E-R 모델은 실세계 조직의 의미와 상호작용을 개념적 스키마로 표현하는 데 매우 유용하다. 그
러므로 많은 데이터베이스 설계 도구가 E-R 모델의 개념에 기반을 두고 있다. E-R 데이터 모델은
세 가지 기본 개념인 개체 집합, 관계 집합, 속성을 가지고 있다. E-R 모델은 또한 E-R 다이어그램
(E-R diagram)이라는 연관된 다이어그램 형태의 표현을 지닌다. 1.3.1 절에서 간략히 살펴보았듯
이, E-R 다이어그램은 데이터베이스의 전체 논리적 구조를 도식화하여 표현한다. E-R 다이어그램
6.2.1 개체 집합
도 있다. 그러므로 677-89-9011 이라는 perso〃ーid는 특정 개인을 대학교 내에서 유일하게 구분할
혹은 양쪽 어 디 에도 속하지 않을 수 있다.
90000을 가질 수 있다.
ID 속성은 동일한 이름의 교수가 둘 이상 있을 수 있으므로, 교수를 유일하게 식별하기 위해 사
생을 파악하는 것 이외에 과목에 대한 정보도 제공해야 한다. 과목은 course_id, title, dept_name,
student
ID
name
tot_cred
다. 교수와 관련된 속성은 ID, name, sa/め다. 학생과 관련된 속성은 ID, name, 이다. 주
6.2.2 관계 집합
에 참여(participate)한다.
를 (Cl, C2) 쌍으로 특징지을 수 있다. (C2, C1) 쌍은 제외한다. E-R 다이어그램에서 다이아몬드
앞에서 student 개체의 속성을 보았으며, 이 장 뒷부분에서 sec〃"의 속성을 살펴볼 것이다. 복잡
해 보자. 즉 개체 집합 instructor, student, prq/ecf의 연관을 표현해 보자. 각각의 과제는 다수의 연
관된 학생과 다수의 연관된 교수를 가질 수 있다. 뿐만 아니라 과제에 참여하고 있는 학생은 과제
에서 그 학생을 지도하는 연관된 교수 한 명을 반드시 가지고 있어야 한다. 당분간 과제와 교수, 과
수 없음에 주목하자.
6.3 복합속성
1 미국에서 사용하는 주소 형식을 가정한다. 이 형식은 zip code라 불리는 숫자 형태의 우편번호를 포함한다.
오30 PART 오 데이터베이스설계
instructor 개체 집합에 주소를 하나 추가한다고 가정 해 보スト. 주소는 street, city, state, postal一
instructor
ID
name
first_name
middleJnitial
last_name
address
street
street _number
street_name
apt_n umber
city
state
zip
[phone_number ]
date jjf_birth
age ()
우)일 수도 있고, 모르는 값(그 값이 실제로 존재하는지 여부를 모르는 경우)일 수도 있다.
6.4 대응카디널리티
하다.
한다.
(a) One-to-one
(d) Many-to-many
다음과 같다.
음을 나타낸다.
참여다.
6.5 주 키
어야 한다.
6.5.1 개체 집합
개별 개체는 개념적으로 구분된다. 하지만 데이터베이스의 관점에서 개체 간의 차이점은 개체의
하면 안 된다는 것이다.
용 가능하다.
을 정의한다.
236 PART 2 데이터베이스 설계
6.5.2 관계집합
이 집합 R의 개별 관계를 나타낸다.
이 집합 R의 개별 관계를 나타낸다.
만약 주 키의 속성 이름이 개체 집합들 간에 유일하지 않으면 속성을 서로 구별할 수 있도록 이
이 관계 집합에 대한 수퍼 키를 형성한다.
(이 경우 위의 두 가지 해석이 동일해진다.)
한다.
6.5.3 약한 개체집합
section 개체를 다시 살펴보자. 이 개체는 과목 식별자, 학기, 연도, 분반 식별자에 의해 유일하게
면 seefiow과 course 사이의 관계가 하나의 속성 속으로 암묵적으로 내재되기에 바람직한 모습은
아니다.)
이러한 중복성을 다루는 또 다른 방법은, section 개체에 courseJd 속성을 저장하지 않고 남
238 PART 2 데이터베이스 설계
의 section 개체는 서로가 다르다고 해도, 서로 다른 과목에 해당하는 분반은 동일한 secjd, year,
한다.
한 개체 집합 co"パe에 의존한다.
2 후에 다시 밝히겠지만, section 개체 집합으로부터 최종적으로 생성하는 관계형 스키마는, (비록 section 개체 집합으로부터
제거했지만) course Jd 속성을 분명히 가지고 있음에 주목하자.
Chapter 6 E-R 모델을 사용한 데이터베이스 설계 239
관계다.
instructor 개체 집합에 대해 ID, name, dept_name, salary 속성을 포함하기로 결정했다. 여기에
합을 고려하자.
가진다.
주 키이기 때문에 instructor 개체 집합에 중복되어 있고, 따라서 제거될 필요가 있다.
정을 피할 수 있도록 도와준다.
• time_slot 개체 집합은 time_slot_id 속성을 포함하고, 이 속성이 주 키이며,' {(day, start_ time,
좋은 개체-관계 설계는 중복된 속성을 지니지 않는다. 대학교 예제에 대한 개체 집합과 각각의
3 이후에 time_slot 개체 집합으로부터 생성한 릴레이션에 대한 주 키가 dqv와 门。〃」而e을 포함하고 있음을 살펴보겠다. 그
러나 d아와 口加」而e이 time_slot 개체 집합의 주 키의 일부분을 형성하지는 않는다.
4 day, endjime을 포함하는 복합 속성에 대해 mee〃カg과 같은 이름을 선택적으로 부여할 수도 있다.
Chapter 6 E-R 모델을 사용한 데이터베이스 설계 오41
마침내 우리는 본문에서 지금까지 사용해 온 대학교 조직에 해당하는 E-R 다이어그램을 그림
6.15와 같이 표현할 수 있다. 이 E-R 다이어그램은 대학교 E-R 모델의 텍스트 설명과 동일하지만
몇 가지 제약 조건을 추가했다.
우리의 대학교 데이터베이스에서 각각의 교수는 정확히 하나의 연관된 학과를 가져야 한다는
이 E-R 다이어그램에 기반하여 우리가 사용하는 다양한 릴레이션 스키마를 도출하는 방법을
E-R 모델과 관계형 데이터베이스 모델은 둘 다 실세계 조직의 추상적이고 논리적인 표현이다. 두
가지 모델이 서로 비슷한 설계 원리를 지니므로 E-R 설계를 관계형 설계로 변환할 수 있다. (E-R
모델을 사용한) 데이터베이스 설계의 각 개체 집합과 각 관계 집합에 대해 (상응하는 개체 집합이
Chapter 6 E-R 모델을 사용한 데이터베이스 설계 오43
6.7.1 강한 개체 집합의 표현
있다. 이것은 각 튜플이 개체 집합의 특정한 개체에 해당한다는 사실에 직 접적으로 기반한다.
성 address6^ 대해 생성된 스키마는 street, city, state, postal_code 속성을 가진다. street은 복합
유도 속성은 관계형 데이터 모델이 명시적으로 표현하지 않는다. 그러나 다른 데이터 모델은 저
6.8의 E-R 다이어그램을 고려해 보자. 여기서 instructor^] 주 키는 /。다. 이 다중값 속성에 대해서
다음과 같은 릴레이션 스키마를 생성할 수 있다.
교수의 각 전화번호는 이 스키마의 릴레이션에서 유일한 튜플로 표현된다. 따라서 /。가 22222이
6.7.3 약한 개체집합의표현
6 .7.4 관계집합의표현
R을 관계 집합, 生, … , 册을 관계 집합 氏에 참여하는 각 개체 집합의 주 키의 합집합으로 형성
된 속성의 집합, 그리고 (만약 있다면) 仇, b2, ... , 瓦,을 R의 설명 속성이라 하자. 이 관계 집합을 다
5 선택적으로 외래 키 제약 조건은 “on delete cascade" 절을 가질 수 있다. 이런 경우. 만약 coarse 개체를 삭제하면 해당
course 개체를 참조하는 모든 section 개체가 자동으로 삭제된다. 이 구문이 없으면 course 개체를 삭제하기 전에 과목을 참
조하는 모든 분반(section)을 삭제해야 한다.
246 PART 2 데이터베이스 설계
변경했다. advisor 관계 집합이 sれ以에서 instructor^. 다대일 관계이기 때문에 advisor 릴레이
션 스키마의 주 키는 s_">다.
집합으로부터 생성한 릴레이션을 삭제했기 때문이다. 우리는 다중값 속성으로부터 생성된 릴레이
대해 살펴보겠다.
year 속성을 가진다. section 개체 집합에 대한 스키마는 (그중에서도) course_id, sec_id, semester,
year 속성을 포함한다. sec_course 릴레이션의 모든 (course_id, sec_id, semester, yew)의 조합은
또한 section 스키마에 대한 릴레이션에도 존재하고, 그 역도 성립한다. 따라서 sec_course 스키마
키마는 중복된 것이므로, E-R 다이어그램을 기반으로 한 관계형 데이터베이스 설계에 존재할 필요
가 없다.
6.7.6 스키마의 결합
속성으로 이루어진다.
결합할 수 있다.
6.8 E-R의확장된특성
측면은 기본 E-R 모델에 대한 확장을 통해 더 적절하게 표현할 수 있다. 이 절에서 구체화, 일반화,
사람들을 모델링하기 위해 perso〃이라는 개체 집합을 ID, name, street, ciヶ라는 속성으로 정의한다.
Chapter 6 E-R 모델을 사용한 데이터베이스 설계 249
6.8.1 구체화
• employee
• student
수 있다.
는 학생의 두 가지 세분화를 만들 수 있다. 앞서 보았듯이, student 개체는 ID, name, street, city,
분류할 수 있다.
로 설명할 수 있다. 예를 들면, instructor 개체는 rank 속성으로 조금 더 설명할 수 있고, secretary
개체는 hours_per_week 속성으로 더 자세히 기술할 수 있다. 뿐만 아니라 secretary 개체는 비서의
직원 개체의 그룹을 구별하는 특성은 직원이 수행하는 일이다. 이와 더불어, 직원이 임시직인지 또
사각형으로 표현한다.
6.8.2 일반화
다른 이름을 가지고 있다. 일반화로 표시하기 위해 속성은 반드시 공통된 이름을 가져야 하며 상
위 개체 person으로 나타내야 한다. 6.8.1 절의 예제에서 보았듯이 속성 이름으로 ID, name, street,
イタ를 사용하기로 한다.
실질적으로, 일반화는 구체화의 단순한 반대다. 조직의 E-R 스키마를 설계하는 과정에서 이 두
을 가지고, person 개체와 정확히 동일한 관계에 참여한다면 person 개체 집합을 구체화할 필요가
없을 것이다.
고 차이점을 감추기 위해 쓰인다. 또한 공유된 속성이 되풀이되지 않도록 표현을 절약할 수 있다.
6.8.3 속성 상속
E-R 모델의 주어진 부분이 구체화에 의해 도달했든 일반화에 의해 도달했든 상관없이 결과는
기본적으로 동일하다.
는 것이다.
6.8.4 구체화/일반화에 대한 제약 조건
된다.
6.8.5 통합화
E-R 모델의 한 가지 제약점은 관계들 간의 관계를 표현하지 못한다는 것이다. 이러한 구성이 필요
한 예를 들어 보면, 이전에 보았던 instructor, student, project 간의 proj_guide라는 삼진 관계다
조합을 표현할 수 없게 한다. 기본적인 E-R 모델링 구성을 이용하면 그림 6.19와 같은 E-R 다이어
그램을 얻는다(간략히 하기 위해 개체 집합의 속성은 생략했다).
project
evaluation
6.8.6.1 일반화의 표현
일반화를 포함하는 E-R 다이어그램을 릴레이션 스키마로 변환하는 두 가지 방법이 있다. 여기서
나의 시도로서, 직원과 학생이 추가적으로 person 릴레이션에 나타난다고 생각해 보자. 불행히도
학생의 경우 name, street, city 정보는 person 릴레이션과 학생들을 위한 student 릴레이션에 중복
emp/oyee로부터는 이 정보를 제거할 것을 제안해 준다. 그렇게 한다면 그 결과는 우리가 제시했던
첫 번째 방법과 정확하게 동일해진다.
6.8.6.2 통합화의표현
변환한다.
정의하는 관계 집합의 주 키다. 통합화를 위해 별도의 테이블이 요구되지는 않는다. 관계를 정의할
6.9 개체-관계 설계 쟁점
만). E-R 모델에서 이 정보를 표현하는 올바르게 표현하는 방법은 관계 stud_dept를 사용하는 것
이다. 속성을 통한 암시적 인 표현이 아니 라 학생과 학과 간의 관계를 명시적으로 표현하기 때문이
있기 때문이다J
세 번째 흔한 실수는 다중값 속성이 필요한 상황에서 단일값 속성을 포함하는 관계를 사용
를 추가하는 것이다. marks_in 관계는 속성 marks를 가진다. 그림 6.22d에 표시한 대안은 stud_
7 E-R 스키마로부터 관계 스키마를 생성할 때. advisor 관계 집합으로부터 생성한 스키마에 그 속성이 나타날 수 있다. 그러
나 나중에 보겠지만 이 속성은 advisor 관계 집합에 나타나서는 안 된다,
오58 PART 오 데이터베이스설계
6.9.2 개체 집합 대 속성 사용의 비교
전화가 위치한 사무실이나 집일 수 있으며, 핸드폰은 아마도 ,mobile" 값으로 표현되었을 것이다.
속성으로 다루는 것은 교수가 각기 정확하게 하나의 전화번호를 가지고 있음을 의미한다. 전화를
(a) (b)
중요한 차이점은 전화를 하나의 개체로 다루는 것이 전화의 위치, 형태(휴대용, IP 전화, 혹은 일
반전화), 전화를 공유하는 사람들 등 전화에 관한 부가적인 정보를 저장하고자 하는 상황을 더 잘
모델링할 수 있다는 것이다. 따라서 전화를 하나의 개체로 취급하는 것이 속성으로 취급하는 것보
반면에 (교수의) name 속성을 개체로 다루는 것은 적절하지 않다. (전화의 경우와는 달리) name
속성으로 하는 것이 적절하다.
6.9.3 개체 집합 대 관계 집합 사용의 비교
어떤 객체를 개체 집합으로 표현할 것인가 아니면 관계 집합으로 표현할 것인가는 항상 명확하지
된 상태를 보여 준다.
지만, rahs의 사용이 더 간결하기 때문에 아마도 바람직할 것이다. 그러나 교무처에서 다른 정보를
과목 등록 기록과 연결한다면, 그것을 독립적인 개체로 표현하는 것이 최선의 방법일 것이다.
6.9.4 이진 대 비이진 관계 집합
parent 삼진 관계를 만들 수 있다. 그러나 이러한 관계는 mother와 father 두 이진 관계로 표현할
(a) (b)
그림 6.25 삼진 관계 대 세 개의 이진 관계
Chapter 6 E-R 모델을 사용한 데이터베이스 설계 261
・ 七, ㈤를 &에삽입
직관적인 방법으로 이러한 과정을 〃ー진 관계 집합에 대해서도 일반화할 수 있다. 따라서 개념적
분해할 수 없다. 만약 그렇게 (분해)한다면 Katz 교수가 Shankar와 Zhang 학생과 함께 프로젝트 4
entity set
attributes:
simple (Al),
composite (A2) and
relationship set multivalued (A3)
derived (A4)
identifying
relationship set
for weak entity set primary key
many-to-many many-to-one
relationship relationship
one-to-one
relationship
role indicator
disjoint
generalization
total
weak entity set generalization
반화를 나타내기 위해 삼각형을 이용했었다. 속성에 타원을 이용하고 관계에 다이아몬드를 이용하
는 표기법은 Chen이 E-R 모델링 개념을 도입한 논문에서 사용했던 원래의 E-R 다이어그램 형식
과 유사하다.
6.10.2 절에서 설명할 통합 모델링 언어(UML) 이용이 증가함에 따라 UML 클래스 다이어그램
형태와 더 가깝게 하기 위해 이 책의 E-R 표기 법을 수정했다. 이 연관성은 6.10.2절에서 보다 명확
하게 밝힐 것이다. 이전 표기 법들과 비교해 볼 때, 새로운 표기법은 속성의 표현에서 더욱 간결함을
E-R 다이어그램의 개체 집합과 그러한 개체로부터 생성된 릴레이션 스키마의 중요한 차이점
중 하나는, 加의 dept_name 속성과 같이 E-R 관계에 상응하는 릴레이션 스키마의 속성이
E-R 다이어그램의 개체 집합에서 나타나지 않는다는 것이다. 어떤 데이터 모델링 도구는 설계자가
동일한 개체에 대해 두 가지 뷰 중에서 선택을 하는 것을 허용한다. 그 두 가지 뷰 중 하나는 그 속
6.10.2 통합모델링언어
여기에서 UML의 다른 부분을 자세히 다루지는 않는다. 대신 데이터 모델링과 관련된 UML 부
램 구성체를 보여 준다. E-R 모델은 개체를 모델링하는 데 반해 UML은 실제로 객체를 모델링한
다. 객체는 개체와 비슷하게 속성을 가지면서도, 주기적으로 객체의 속성을 기반으로 값을 계산하
라서 클래스 다이어그램은 속성뿐만 아니라 메소드도 표현한다. 객체는 8.2절에서 다룬다. UML은
복합 속성이나 다중값 속성을 지원하지 않으며, 유도 속성은 인자를 가지지 않는 메소드와 동일하
각 public, private, protected 접근을 의미)으로 시작하는 것을 허용한다. private 속성은 그 클래스
버전 1.3 이후의 UML은 E-R 다이어그램에서 사용된 것과 동일한 다이아몬드 기호를 사용하여
relationship
attributes
overlapping
generalization
disjoint
generalization
weak-entity E2
composition
하여 표시한다.)
이 장에서 이루어진 스키마 설계에 대한 논의로 인해 스키마 설계가 데이터베이스 설계의 유일한
6.11.1 기능 요구사항
모든 조직은 엔터프라이즈 응용 프로그램에서 어떤 종류의 기능을 지원할지에 대한 규칙을 가지고
된다. 기능을 계획하는 것 외에도 설계자는 기능을 지원하기 위해 구축할 인터페이스를 계획해야
만한다.
모든 사용자가 모든 데이터를 보거나, 모든 트랜잭션을 수행할 권한이 있는 것이 아니다 인증부
작업이 어떻게 사용자들 사이의 경로를 취하는가를 포함한다. 그래서 워크플로는 데이터베이스에
6.11.3 스키마의진화
데이터베이스 설계는 일반적으로 일회성 활동이 아니다. 조직의 요구 사항은 계속해서 바뀌게 되
영구적인 것으로 예상되는 근본적인 제약 조건과, 변경될 것으로 예측되는 제약 조건을 구분하
한편으로 교수는 오직 하나의 학과만 가질 수 있다는 정책에서 나중에 겸임이 허용되는 정책으로
변경될 수도 있다. 각 교수당 하나의 학과만 가지도록 허용하는 데이터베이스 설계는 겸임이 허용
겸임을 허용하는 경우라면, instructor 릴레이션을 수정하지 않으면서 추가적인 관계를 더함으로써
설계에서 더 큰 변화를 요할지도 모른다. 좋은 설계는 현재의 정책을 고려할 뿐만 아니라, 예상되거
6.1 오 요약
의 집합이 개체 집합이다.
• E-R 다이어그램으로 명시한 데이터베이스 설계는 릴레이션 스키마의 집합으로 표현할 수 있다.
데이터베이스의 각 개체 집합과 각 관계 집합에 대해 유일한 릴레이션 스키마가 존재하는데, 그
• E-R 설계 시 흔하게 발생하는 실수가 많이 있기에 주의를 기울여야 한다. 또한 조직의 미묘한
세부 사항에 따라 정확성이 좌우되는 여러 가지 선택 사항이 존재한다. 여기에는 개체 집합, 관
• UML은 널리 사용되는 모델링 언어다. UML 클래스 다이어그램은 일반적인 목적의 데이터 모
델링뿐만 아니라 클래스를 모델링하기 위해서도 널리 사용된다.
용어정리
• 설계과정 。주 키
° 개념적 설계 • 관계와관계집합
° 논리적 설계 。이집 관계 집합
° 물리적 설계 ° 관계 집합의 차수
。다대일 관계 。식별관계
° 다대다 관계 • 구체화와일반화
• 전체참여와부분참여 • 통합화
• 약한 개체 집합과 강한 개체 집합 • 설계선택
° 구별자 속성 • 통합 모델링 언어(UML)
실전문제
6.3 가장 좋아하는 스포츠 팀의 점수 통계를 기록하는 E-R 다이어그램을 설계하라. 개최한 경기, 각
경기의 점수, 각 경기의 선수, 각 경기에서 개인별 득점 통계를 저장해야 한다. 요약을 위한 통계
는 계산 방법에 대한 설명과 함께 유도 속성으로 모델링해야 한다.
6.5 E-R 다이어그램은 그래프로 볼 수도 있다. 다음은 조직의 스키마 구조 용어로 무엇을 의미하는가?
a. 그래프가 연결되어 있지 않다.
b. 그래프가 사이클(cycle)을 가지고 있다.
6.6 (그림 6.29b의 이진 관계를 사용한) 그림 6.29a의 삼진 관계 표현을 생각해 보자イ속성은 나타내지
않았다).
(c)
6.9 advisor 관계 집합이 일대일이라고 가정해 보자. 일대일 카디널리티 제약 조건을 적용하는 것을
보장하기 위해。れ公” 릴레이션에 요구되는 추가적인 제약 조건에는 어떤 것들이 있는가?
a. 그 이유를설명하라.
b. 복잡한 check 제약 조건이나 주장(assertion)(4.4.8절 참조)(불행히도 이러한 특성은 최근 널
리 이용되고 있는 데이터베이스들이 제공하지 않는다)을 이용하여 전체 참여 제약 조건을 어
떻게 적용할 수 있는지 설명하라.
272 PART 2 데이터베이스 설계
간 간격의 집합인 valid_time(유효 시간)이라 불리는 새로운 데이터 타입을 정의한다. 그리고
validjime 속성을 각각의 개체와 관계에 연결하여 개체 또는 관계가 유효한 시간대를 기록한다.
연습문제
6.15 환자의 집합과 의사의 집합으로 이루어진 병원을 위한 E-R 다이어그램을 그려라. 각 환자와 수
행된 여러 가지 검사와 진찰의 기록을 연결한다.
a. 문제 6.1
b. 문제 6.2
c. 문제 6.3
d. 문제 6.15
터베이스는 화물의 위치와 위치의 이력(history)을 저장할 수 있어야 한다. 위치는 트럭, 비행기,
공항, 창고 등이 될 수 있다.
설계는 E-R 다이어그램, 관계형 스키마의 집합, 그리고 주 키와 외래 키 제약 조건을 포함한
일련의 제약 조건을 포함해야 한다.
관련도구
사용하면 이 책과 동일한 방식으로 개체를 표현하는 E-R 다이어그램을 만들 수 있다. 관계를 만들려면
Flowchart 도형 모음에서 다이아몬드를 사용하는 것을 추천한다. Orow.わ는 E-R 다이어그램을 지원하
는 또 다른 온라인 다이어그램 편집 기다.
상용 도구로는 IBM Rational Rose Modeler, Microsoft Visio, ERwin Data Modeler, Poseidon for
UML 및 SmartDraw가 있다.
더 읽어보기
참고문헌
[Chen (1976)] P. P. Chen, "The Entity-Relationship Model: Toward a Unified View of Data ", ACM
Transactions on Database Systems, Volume 1, Number 1 (1976), pages 9-36.
[NIST (1993)] NIST. "Integration Definition for Information Modeling (IDEF1X)", Technical
Report Federal Information Processing Standards Publication 184, National Institute of Standards
and Technology (NIST) (1993).
[Thalheim (2000)] B. Thalheim, Entity-Relationship Modeling: Foundations of Database
Technology, Springer Verlag (2000).
크레딧
일부는 제대로 설계한 E-R 다이어그램에 존재하기도 하지만 조직에 대한 추가 정보도 필요할지
모른다.
dency)의 관점에서 정규형을 정의할 것이다. 그러나 우선은 주어진 개체-관계 설계에서 도출한 스
키마의 관점으로 관계형 설계의 문제점에 대해 살펴본다.
6장에서 공부한 개체-관계 설계는 관계형 데이터베이스 설계를 생성하기 위한 훌륭한 출발점이
다. 6.7절에서 E-R 다이어그램으로부터 릴레이션 스키마 집합을 직접 생성하는 것이 가능하다는
사실을 알았다. 이를 통해 생성한 스키마 집합의 장점(혹은 단점)은 E-R 설계를 처음부터 얼마나
잘 작성하였는가에 달려 있다. 이 장 후반부에서 릴레이션 스키마의 집합이 얼마나 바람직한가를
277
278 PART 2 데이터베이스 설계
있다.
새로운 학과를 하나 만든다고 가정해 보자. 위의 수정한 설계에서 학과에 교수가 적어도 한 명 이
만, 수정된 설계는 building과 ん。翹에 대해서 널 값을 가지는 튜플을 생성해야 한다. SQL을 공부
할 때 알아본 바와 같이 널 값이 문제를 일으키기도 한다. 그러나 만약 널 값이 문제가 되지 않는다
Chapter 7 관계형 데이터베이스 설계 279
고 판단한 경우 수정한 설계를 계속해서 이용할 수 있지만, 앞서 언급한 중복성 문제는 여전히 발
생한다.
7.1.1 분해
in_dep 스키마에서 정보의 반복 문제를 방지하는 유일한 방법은 in_dep 스키마를 두 개의 스키마
구성된 극단적인 경우를 생각해 보자. 이 경우에 어떤 종류의 흥미로운 관계도 표현할 수 없다. 다
음으로 아래의 employee 스키마를 분해하기로 결정한 조금 덜 극단적인 경우를 보자(6.8절 참조).
인기가 높은 이름이 존재하기 때문에 이러한 상황은 실제로 발생할 수 있다. 물론 개개인은 이 조
employee
natural join
그림 7.3 나쁜 분해로인한 정보 손실
을 가지고 있음에도 불구하고, 다음과 같은 면에서 실제로는 정보를 덜 가지고 있다. 우리는 어떤
decomposition)라고 부른다.
7.1.2 무손실분해
다면, 그 분해는 무손실 분해라고 한다「 릴레이션 r(R)의 인스턴스 대신 八(4)과 ら(4)의 인스턴스
select *
from (select Rx from r)
natur 지 join
(select R2 from r)
1%⑺ X n&(r) = r
r C ロムセ)X n4(r)
도 실제로는 정보다.
7.1.3 정규화이론
우리는 이제 각각이 “좋은 형식(형태)”인 스키마 집합을 도출하기 위한 일반적인 방법론을 정의한
1 역자 주: 그림 7.3에서 상단에 있는 릴레이션이 r(R) 인스턴스에 해당하고. 가운데 왼쪽은 r,(«,), 오른쪽은 %(&) 인스턴스에
해당한다.
2 함수 종속의 왼쪽에 나타나는 어떤 속성도 널 값을 가질 수 없다고 가정하는 것으로 무손실의 정의를 기술할 수 있다. 이것
은 문제 7.10에서 더 자세히 탐구한다.
282 PART 2 데이터베이스 설계
• 주어진 릴레이션 스키마가 “좋은 형식”인スI 결정한다. 7.3절에서 다룰 것인데, 다양한 형식(정규
형이라고 부름)이 존재한다.
분해하며, 각 릴레이션 스키마는 적절한 정규형이 되도록 한다. 이때 (적용한) 분해는 무손실 분
해여야 한다.
7.오 함수종속을사용한분해
7.2.1 표기관습
• 일반적으로 속성의 집합으로 그리스 문자를 쓴다(예를 들어, a). 릴레이션 스키마를 참조하기 위
3 대부분의 실제 대학에서 교수는 둘 이상의 학과와 연관될 수 있다. 예를 들면. 공동 임용(joint appointment)이나 겸임 교수
(adjunct faculty)의 경우가 이에 해당한다. 동일하게. 학생은 두 개(또는 그 이상)의 전공이나 부전공을 가질 수 있다. 간소화
된 대학교 스키마는 각 교수와 학생이 오직 하나의 (기본) 학과에 소속되어 있는 것을 모델링한다.
Chapter 7 관계형 데이터베이스 설계 283
• 따라서 표기법 r(R)은 스키마 R을 가진 릴레이션 r을 의미한다. r(R) 표기법을 사용하면 릴레이
션과 스키마 둘 다 참조한다.
간결성을 위해 속성 이름은 데이터베이스 스키마 내에서 하나의 의미만 가지고 있다고 가정한다.
7.2 .2 키와함수종속
실제 세계 제약 조건 중에서 가장 널리 쓰이는 유형은 공식적으로 키(수퍼 키, 후보 키, 주 키) 王는
r, キ ん이면 ”K! キ 4K]가 성립해야 한다는 것이다. 이는 어떠한 厂(R)의 적법한 인스턴스에 존재하
는 서로 다른 두 개의 튜플은 속성 집합 K에서 동일한 값을 가질 수 없다는 뜻이다.4 즉 만일,■에 있
4 함수 종속 논의에서 우리는 SQL의 세 가지 값 논리(three valued-logic) 동등식(=)이 아닌 일반적인 수학적 의미의 동등식
(늬을 사용한다. 다르게 말하자면, 함수 종속을 논의할 때 널 값이 없다고 가정한다.
284 PART 2 데이터베이스 설계
이 표현할 수 있다.
A B C D
a\ b\ 4
a\ 42
め ち % d2
% 3
。3 % 德
5 여기에서 릴레이션이 집합이라고 가정함에 유의한다. SQL은 다중 집합을 다루고, 속성의 집합 K에 대한 SQL의 주 키 선언
은 t.m = 이면 ム = 4임을 요구할 뿐만 아니라, 중복된 튜플 또한 없어야 함을 요구한다. SQL은 또한 집합 K 내의 속
성에는 널 값을 대입할 수 없음을 요구한다.
Chapter 7 관계형 데이터베이스 설계 285
함수 종속을 사용하여 어떤 분해가 무손실 분해임을 증명할 수 있다. R, /?„ R?는 스키마를 표현하
• R、n R? —> R[
• R、C R? t R?
• 自 C 自가 〃의 주키다.
7.3 정규형
7.3.1.1 정의
키마 R은 BCNF에 있다.
BCNF 다.
이제 우리는 BCNF 형태가 아닌 스키마를 분해하는 일반적인 규칙에 대해 알아보겠다. R이
• (a u P)
, (7? - (P - a))
7.3.1.2 BCNF와종속성보존
데이터베이스 일관성 제약 조건을 표현하기 위한 몇 가지 방법을 살펴본 바 있다. 이는 주 키 제약
조건, 함수 종속, check 제약 조건, 주장, 트리거 등이다. 데이터베이스가 갱신될 때마다 이러한 제
약 조건을 검사하는 것은 큰 비용이 소모될 수 있으며, 따라서 제약 조건을 효과적으로 검사할 수
이를 설명하기 위해서 대학교 조직을 운용하는 방식에 작은 변화를 준다고 가정해 보자. 그림
그림 7.6 dept_advisor 관계 집합
록 하는 것이다,
iJD — dept.name
sJD, deptJiame -> iJD
이 설계에서 교수가 dept_advisor 관계에 참여할 때마다 학과명을 반복해야 한다. dept_advisor
(sJD, iJD)
(i」D, deptJiame)
7.3.2 제3정규형
8 기술적으로 속성이 그 어떤 하나의 스키마에도 나타나지 않는 함수 종속이 여전히 암묵적으로 성립하는 것이 가능하다. 논
리적으로 이를 내포하고 있는 다른 종속이 존재할 수 있기 때문이다. 이러한 경우는 7.4.4절에서 다룬다.
9 제2정규형을 생략했다는 사실을 알 수 있다. 제2정규형은 역사적으로만 중요성을 지니고 실제로는 제3정규형 또는 BCNF
중 하나가 항상 더 좋은 선택이다. 문제 7.19에서 제2정규형을 탐구한다. 제 1 정규형은 분해가 아닌 속성의 도메인과 관련되
는데. 이는 7.8절에서 설명한다.
Chapter 7 관계형 데이터베이스 설계 291
가진) 정규형이다.
iJD — dep5ame
sJD, dept-name —> IJD
종속성을 보존하는 BCNF 설계가 존재하지 않을 때 BCNF와 3NF 사이에 상반관계가 발생함을
1. BCNF
2. 무손실
3. 종속성 보존
선택해야 한다.
10 이러한 종속은 이행 종속(transitive dependency)(문제 7.18 참고)의 예다. 3NF의 원래 정의는 이행 종속에 관한 것이었다.
이 책에서 사용한 정의는 원래의 것과 동일하지만 이해하기가 더 쉽다.
292 PART 2 데이터베이스 설계
확인해야 한다. 그렇지 않으면 갱신을 수행하고 난 후 제약 조건의 위반을 감지하였는데 그 위반을
7.3.4 상위정규형
따라서 phone-munber와 childー〃ame은 다중값 속성이 되며, E-R 설계로부터 스키마를 생성하는
규칙에 따라 각 다중값 속성 phone_numberS\ child_name(^\ 대해 하나씩 두 개의 스키마를 갖게
된다.
(ID, child-name)
(ID, phone-number)
한다.
Chapter 7 관계형 데이터베이스 설계 293
7.4 함수 종속 이론
7.4.1 함수 종속 집합의 폐포
A - B
A^C
CG - H
CG t I
Bt H
A - H
시/4] = 시,包
ハ网=t2[B]
한다.
=t2[H]
에 나오는 규칙에서 속성의 집합으로 그리스 문자<a, 仇》…)를 사용하고, 개개의 속성을 위해 로
F+ = F
apply the reflexivity rule /* Generates all trivial dependencies */
repeat
for each functional dependency/ in F'r
apply the augmentation rule on f
add the resulting functional dependencies to F+
for each pair of functional dependencies/, and f2 in F「
if/, and/, can be combined using transitivity
add the resulting functional dependency to F+
until F+ does not change any further
그림 7.7 尸를계산하는절차
7.4.2 속성 집합의 폐포
resulta;
repeat
for each functional dependency (3 ー 丫 in 尸 do
begin
if P C result then result := result U y;
end
until {result does not change)
번째 단계는 옳다. 우리는 resi山의 어떠한 부분집합。에 대해서도 a 一,。라고 주장한다. a 一 result
발생하면, res”"에 A가 추가된 것을 증명한 것이다. 그렇지 않다면, B(B# A)가 추가된다. 이 주장
7.4.3 캐노니컬 커버
주어진 집합과 동일한 폐포를 갖는 간소화된 함수 종속의 집합을 이용함으로써 위배를 확인하
이질적인 속성의 정의를 이용할 때는 함축의 방향에 주의해야 한다. 만약 좌측과 우측을 바꾸었
戶게서 유추될 수 있는지를 확인한다. 그러기 위해서는 丫+(丫의 폐포)를 戶게서 계산한다. 이때 y+
가。의 모든 속성을 포함한다면 A는 a에서 이질적이다.
『F
repeat
Use the union rule to replace any dependencies in Fc of the form
叫ー仇 and oq — % with oq — P)P2-
Find a functional dependency a — p in £, with an extraneous
attribute either in a or in p.
/* Note: the test for extraneous attributes is done using F[, not F */
If an extraneous attribute is found, delete it from a t p in
until (Fc does not change)
어야 한다.
A - BC
B- C
4 TB
AB-C
ん 一 BC
A B
300 PART 2 데이터베이스설계
A — B
B - C
능한 것이다.
"={"2一B-C, 0/4}
F[= (A - B, B -AC,C - B}.
乙={/ - C, C - 8, 5 -Z}
7. 4.4 종속성 보존
compute F+;
for each schema Ri in D do
begin
Fj : = the restriction of F+ to 7?,;
end
F' :=0
for each restriction Fi do
begin
F' = F'\J Fi
end
compute F'+\
if (尸,+ =尸+) then return (true)
else return (false);
그림 7.10 종속성보존을위한검사
정만 검사하는 것만으로도 충분한지에 대해서 생각해 보자. 尸'= 工 U 尸2 U … U 尸“이라 하자. 尸’는
스키마 R의 함수 종속의 집합이지만 일반적으로 アナ ド이다. 그러나 Pr F일지라도, F,+ = 尸+가
될 수 있다. 만약 후자가 참이라면 ド의 모든 함수 종속은 尸’에 의해 논리적으로 함축되며, 따라서
요하기 때문에 비용이 크다. 그림 7.10의 알고리즘을 적용하는 대신 다음의 두 가지 대안을 생각해
보자.
첫째, 만약 尸의 각각의 원소가 분해의 하나의 릴레이션에서 검사될 수 있다면 그 분해는 종속성
적용할수밖에 없다.
의 a - (3에 대해 적용한다.
result = a
repeat
for each & in the decomposition
t = {result n R)+ n &
result = result U t
until {result does not change)
결과로 나오는 속성 집합을 心"〃에 더한다. 이 일련의 단계는 £하에서 res”〃의 폐포를 계산하
7.5.1 BCNF 분해
불행히도 후자의 절차는 릴레이션 스키마가 분해되었을 경우에는 동작하지 않는다. 즉 릴레이션
a 7• (a+ - a) n 7?,.
result := {&};
done := false;
while (not done) do
if (there is a schema Ri in result that is not in bcnf)
then begin
let a -> p be a nontrivial functional dependency that holds
on & such that a+ does not contain A, and a n P = 0;
result(result — Rj U (& - P) U ( a, P);
end
else done := true;
이제 릴레이션 스키마를 BCNF를 만족하는 형태로 분해하는 일반적인 방법을 기술해 보자. 그림
알고리즘이 무손실 분해만 생성해 내는지를 보기 위해서 兄를 (R, - P)와 (a, p)로 대체하면 종속
a - p가 보존되고 (/?, -p)n (a, p) = a가 됨을 주목하자.
만약 a n p = 0임을 요구하지 않았다면 a n p에 있는 속성은 (R, - p) 스키마에 나타나지 않았을
• 아래의함수종속은
따라서 class 스키마를 분해한 결과로 course, classroom, secガ。れ의 세 릴레이션 스키마가 나오고
7.5.2 3NF 분해
depLadvisor (sー〃),i_ID、depUiame)
알고리즘은 R을 (iJD, dept_name) 스키마로, R?를 (sJD, dept_name, iJD) 스키마로 생성한다.
을 적용해 보자. 7.5.1.2절에서 나열한 함수 종속의 집합은 캐노니컬 커버다. 그 결과, 알고리즘은
같은 세 스키마 course, classroom, section을 생성한다.
Chapter 7 관계형 데이터베이스 설계 307
앞 예제에서 3NF 알고리즘의 흥미로운 특성을 볼 수 있다. 결과는 3NF일 뿐 아니라 BCNF인
경우도 존재한다. 이것은 BCNF 설계를 만드는 다음과 같은 대안적인 방법을 시사한다. 먼저 3NF
알고리즘을 사용한다. 그런 다음 BCNF가 아니면서 3NF 설계에 속하는 스키마에 대해서 BCNF
알고리즘을 적용하여 분해한다. 만약 결과가 종속성을 보존하지 않는다면 3NF 설계로 되돌린다.
3NF 알고리즘은 캐노니컬 커버에서 각 종속에 대해 명시적으로 스키마를 구축하여 종속성 보존을
보장한다. 또한 3NF 알고리즘은 분해할 스키마의 후보 키를 최소한 하나의 스키마가 포함하도록
보장하므로 무손실 조인 분해도 보장한다. 문제 7.16은 이것이 무손실 분해를 보장하는 데 충분하
다는 증거에 대한 통찰력을 제공한다.
알고리즘이 3NF 설계를 생성하는지 확인하려면, 분해로 생성된 각 스키마 R,를 고려한다. 3NF
여부를 검사하기 위해서 함수 종속의 우측 항이 단 하나의 속성인 것만 고려하면 충분하다는 것을
3NF의 정의를 만족함을 보여야 한다. 합성 알고리즘에서 R를 생성한 (함수) 종속이 a - p라고 가
정하자. 8는 4에 속하고 함수 종속 a - p로 인해 R,를 생성하였으므로, 8는 a 또는 卩에 속해야 한
다. 다음과 같은 세 가지 가능성을 고려할 수 있다.
정하여 교수가 다양한 학과와 연계되어 있을 수 있는 경우를 생각해 보면, 다음과 같은 릴레이션을
가질 수 있다.
ハ(ID, name)
r2 (ID, dept-name, street, city)
있다.
7.6.1 다중값종속
r(R)이 릴레이션 스키마이고, a C /?, p C R이라 하자. a와 0 사이에 존재하는 다중값 종속은 아
래와 같이 표현한다.
af p
위의 다중값 종속은 다음을 만족할 때 R에서 보존성립, 유지)한다고 한다. 릴레이션 儿R)의 어떠한
적법한 인스턴스에서, r에 속하는 ム[a] = ら[이인 모든 튜플의 쌍 ム, ム에 대해 다음 조건을 만족하
爪R 一例=か我 一因
,冊=,冊
♦スームレー 。]
이 정의는 보이는 것보다는 덜 복잡하다. 그림 7.13은 ム, t2, 6. 厶를 테이블 형태로 표현한 것이다・
복되어야 하고, 주소에 대해서도 교수와 연계되어 있는 각각의 학과에 대해 반북해야 한다. 교수와
주소의 관계는 교수와 학과와의 관계와 독립적이기 때문에 이러한 중복은 불필요하다. /。가 22222
인 어떤 교수가 물리학과와 연계되어 있다면, 우리는 해당 학과(물리학과)가 교수의 모든 주소와
a 0 R—a — p
n Q ] . . . Clj ai+ 1 • .り % i ,, %
h Cl ] ... dj ル + 1 •• ■bJ 4+ 1 • ・1%
田... a. ai+ 1 •• .り 4+ 1 • •
,4 <7|... a. ■bi り + i • , 〇〃
그림 7.13 a-p의테이블표현
310 PART 2 데이터베이스설계
다는 것을 알 수 있다.
ID - street, city
릴레이션「이 주어진 다중값 종속을 만족하지 못한다면 튜플을「에 추가함으로써 다중값 종속을
7.6.2 제4정규형
R은 제4정규형(4NF)이다.
릴레이션 스키마의 집합의 각 원소가 4NF에 속하도록 설계된 데이터베이스 설계는 4NF에 속한다.
4NF의 정의가 BCNF의 정의에서 다중값 종속을 사용한 것만 다름을 주목한다. 따라서 모든
4NF 스키마는 BCNF에 속한다. 이 사실을 확인하기 위해, 만약 스키마 R이 BCNF에 속하지 않는
다고 가정하자. 그러면 a가 수퍼 키가 아니면서 a ー。인 자명하지 않은 함수 종속이 R에 대해 존
재함을 기억하자. a ー。가 aメ。를 내포하므로, (BCNF에 속하지 않는다고 가정한) 릴레이션 스
키마 R은 4NF에 속할 수 없다.
7. 6.3 4NF 분해
4NF와 BCNF와의 유사성은 스키마를 4NF로 분해하는 알고리즘에도 적용된다. 그림 7.16은 4NF
분해 알고리즘을 보여 준다. 다중값 종속을 사용한 것과。+의 凡에 대한 한정(즉。,詹 사용한 것
result := {火};
done := false;
compute Z)+; Given schema &, let Di denote the restriction of D+ to 火,
while (not done) do
if (there is a schema 火/ in result that is not in 4NF w.r.t. D)
then begin
let a p be a nontrivial multivalued dependency that holds
on 氏 such that a l 火/ is not in », and a G P = 0;
result := (result - Rj U (火/ ー。)U (a, 0);
end
else done := true;
(JD, dept-name)
(ID, street, city)
• メR)이 릴레이션 스키마이고,。를 R에서 함수 종속과 다중값 종속의 집합이라고 하자. ハ国)과
RI n R] —1 R J
RI n R-)—» 火2
한 종속 중 적어도 하나가 보존된다면 n&(r) X し,⑺ = 厂임을 보여야 한다. 다음으로 nK|(r) X
ルセ) = 厂이면 r(R)은 이러한 종속 중 적어도 하나를 만족한다는 것을 보여야 한다. 완전한 증명에
대한 참고문헌은 “더 읽어보기” 절을 참조한다.
7.7 다른정규형들
제4정규형이 결코 “궁극'의 정규형은 아니다. 앞에서 보았듯이, 다중값 종속은 함수 종속의 개념만
으로는 이해할 수 없는 정보의 일부 반복 형태를 이해하고 제거하는 데 도움이 된다. 다중값 종속
of inference rule)도 없다는 점이다. 이 때문에 PJNF와 DKNF는 극히 드물게 사용된다. 28장에서
이러한 정규형에 대해 좀 더 자세히 다룬다.
생성한다.
은 제1정규형이 아니다.
street^ ciヶ의 구성요소 속성으로 구성된 address와 같은 복합 속성도 원자적 도메인이 아니다.
정수는 원자적이라고 볼 수 있으며 따라서 정수의 집합은 원자적 도메인이다. 그러나 정수의 모
든 집합의 집합은 원자적인 도메인이 아니다. 차이점은 일반적으로 정수는 조각을 가지지 않는다
기 때문이다. 그러나 중요한 쟁점은 도메인 자체가 무엇인가가 아니라 도메인 원소를 데이터베이
처음 두 글자는 부서를 나타내며 나머지 네 숫자는 그 부서 내에서 직원의 고유한 번호다. 이러한
볼 때 원자적이지 않다. 그러나 식별자를 분할하여 식별자의 일부를 학과의 약어로 해석하는 시도
태가 된다. 분반을 위한 교수의 집합이나 교수를 위한 분반의 집합을 하나만 유지하는 것이 정보의
우에 유용하므로 E-R 모델은 이 두 가지를 지원한다. 개체가 복잡한 구조를 가지는 많은 도메인에
서 제 I 정규형 표현을 쓰도록 강제하는 것은 개발자에게 불필요한 부담을 준다. 왜냐하면 개발자는
데이터를 원자적으로 변환하는 코드를 작성해야 하기 때문이다. 또한 데이터를 원자 형태에서 원
7.9 데이터베이스설계절차
3. r(R)은 릴레이션의 임시적인 설계의 결과가 될 수 있는데, 이것이 원하는 정규형을 만족하는지
검사한다.
모든 개체를 제대로 분별하여 E-R 다이어그램을 신중하게 정의하면, E-R 다이어그램에서 생성한
(변환한) 릴레이션 스키마는 더 이상의 정규화를 필요로 하지 않는다. 그래도 개체 집합의 속성 간
이므로, 비이진 관계는 상대적으로 드물게 나타난다. 사실 어떤 E-R 다이어그램의 변형은 비이진
관계 집합을 표현하는 것이 어렵거나 불가능하게 되어 있다.
함수 종속은 조악한 E-R 설계를 감지하도록 도와준다. 만일 생성된 릴레이션 스키마가 원하는
정규형에 속하지 않는다면 E-R 다이어그램에서 문제를 고칠 수 있다. 즉 데이터 모델링의 일부분으
로서 공식적으로 정규화를 수행할 수 있다. 반면에 E-R 모델링을 수행하는 동안 정규화를 설계자의
직관으로 남겨 두고, E-R 모델에서 생성한 릴레이션 스키마에 정규화를 공식적으로 수행할 수 있다.
하는 과정은 4NF 설계를 생성하려는 경향이 있다. 만약 다중값 종속이 보존되는데 이에 대응하는
함수 종속에 의해 함축되지 않는다면, 이 다중값 종속은 보통 다음과 같은 원인 중 하나로 인해 생
성된다.
• 다대다 관계 집합
다대다 관계 집합의 경우, 각각의 관련된 개체 집합은 자기 고유의 스키마를 가지고 관계 집합에 대
해서는 추가적인 스키마가 존재한다. 다중값 속성의 경우, 그 속성과 개체 집합의 주 키로 구성된
7.9.2 속성과관계의명명
한다.
두 사용 가능하다.
줄 수 있다.
7.9.3 성능을위한역정규화
점이 있다.
7.9.4 다른설계상의쟁점
정규화로 해결되지 않는 데이터베이스 설계의 몇 가지 측면이 나쁜 데이터베이스 설계를 초래한
다. 시간이나 시간 범위에 속하는 데이터가 바로 그러한 문제점을 지니고 있다. 여기에 예를 들겠지
318 PART 2 데이터베이스설계
이션을 사용하기 위해서 매년 새로운 질의를 작성해야 한다. 질의는 또한 많은 릴레이션을 참조할
수 있기 때문에 더 복잡해진다.
7.10 시간데이터모델링
11 유효한 시간(valid time)과 트랜잭션 시간(transaction time)을 구별하는 시간 데이터의 다른 모델도 있다. 트랜잭션 시간은
어떤 사실을 데이터베이스에 저장할 때 기록된다. 단순성을 위해 이 러한 세부 사항은 무시한다.
Chapter 7 관계형 데이터베이스 설계 319
집합이 있고 여기에 시간에 따라 변하는 주소를 연계하고 싶다고 가정하자. 주소에 시간 정보를 추
개체는 학생이 대학교에 입학한 날짜부터 졸업한(혹은 그만둔) 날짜까지 유효한 시간을 가질 수도
있다. 관계도 연관된 유효한 시간을 가질 수 있다. 예를 들어, prereq 관계는 한 과목이 언제 다른
결정한다.
것이다.
위 릴레이션의 인스턴스는 그림 7.17에서 확인할 수 있다. 각 튜플은 연관된 유효한 간격을 가지고
있다. SQL:2011 표준에 따르면, 간격은 왼쪽에서 닫혀 있고, 오른쪽에서 열려 있다. 즉 튜플은 시
작 시각(왼쪽)에 유효하고 종료 시각 바로 직전까지도 유효하지만, 종료 시각에는 유효하지 않다.
)로 표시한다. 따라서 SQL:2011 의 간격은 왼쪽이 닫혀 있고, 오른쪽이 열려 있으므로 [start, end)
형식이다. SQL 표준에 따르며, 9999-12-31 이 가능한 가장 큰 날짜다.
지 않을 수도 있다.
를 해결할 수 있다. 그러나 결론적으로 이 해결책은 올바르지 않다. 왜냐하면 주 키 제약이 중첩되
에 속하는 각 튜플 $,(즉 s, G チ)는 s,B = レ!를 만족하고 모든 s, 의 시 간 간격의 합집합은 (/, “)를 포
함한다.
학생 성적 증명서의 기록은 학생이 과목을 수강한 당시의 과목 제목을 참조해야 한다. 따라서
록해야 한다. 대학교 스키마에서 takes.course_id는 course를 참조하는 외래 키다. takes 튜플의 연
음과 같이 선언할 수 있다.
이 선언은 튜플이 시작과 끝으로 지정된 간격에서 유효함을 명세(그렇지 않으면 일반 속성임을 지
정)한다.
범위가 겹치면 true를 반환하고 그렇지 않으면 false를 반환한다. 시간 주 키는 course 릴레이션에
지 않도록 보장한다.
322 PART 2 데이터베이스 설계
7.11 요약
터베이스 스키마를 체계적으로 설계하는 방법에 대해서 알아보았다. 함정은 중복되는 정보와 일
• 6장은 E-R 설계로부터 관계형 데이터베이스 설계의 개발과 언제 스키마를 안전하게 결합할 수
있는지를 다루었다.
• 캐노니 컬 커버는 주어진 함수 종속의 집합과 동등한 함수 종속의 집합인데, 특정한 방식으로 최
• 릴레이션을 BCNF로 분해하는 알고리즘은 무손실 분해를 보장한다. 주어진 함수 종속의 집합에
• 무손실, 종속성 보존이며, 적절한 정규형에 속함에도 불구하고 잘못된 데이터베이스 설계의 가
할 필요가 있다.
는 이유는 관계형 데이터 모델이 탄탄한 수학적인 기초에 기반하고 있기 때문이다. 이는 우리가
용어정리
• 분해 • 공리
° 손실 분해 • 암스트롱의공리
。무손실 분해 • 정당성
• 정규화 • 완전성
• 함수종속 • 함수적으로결정된다
. 적법한인스턴스 • 이질적인속성
• 수퍼 키 • 캐노니컬커버
• R 이 尸를 만족(충족)한다 • ■의 凡에 대한 한정
• 함수종속 • 종속성보존 분해
• 이행종속 。튜플 생성 종속
• 폐포 • 역정규화
• 제4정규형 (4NF) • 크로스탭
•。의 凡에 대한 한정 • 시간데이터
• 제5정규형 (5NF) , 스냅샷
• 도메인-키 정규형(DKNF) • 시간함수종속
• 원자적 도메인 • 시간주키
• 제1정규형 (1NF) • 시간 외래 키
• 고유역할 가정 • 시간조인
실전문제
(4 B, C)
(A, D, £).
A - BC
CD - E
B - D
E A
A - BC
CD - E
BtD
E—A
R의 후보 키를 나열하라.
7.11 BCNF 분해 알고리즘에서 함수 종속 a - (3를 이용하여 릴레이션 스키마 r(a, 伙 丫)를 r,(a. P)와
r2(a, 丫)로 분해한다고 가정해 보자.
a. 분해된 릴레이션이 어떤 주 키와 외래 키 제약 조건을 보존한다고 예상하는가?
b. 만약 위에서 분해된 릴레이션에서 외래 키 제약 조건이 강요되지 않는 경우, 잘못된 갱신으로
인해 발생할 수 있는 비 일관성 의 예를 들어 보라.
7.12 4, ... , *R 을 스키마。의 분해라고 흐卜자. “(U)는 릴레이션이고, r, = 期。り라 하자. 다음이 성
림함을 증명하라.
“£ムX々X…Xら
7.14 다음 종속들의 집합을 사용하여 주어진 함수 종속의 집합에 대해 하나 이상의 캐노니컬 커버가
있을 수 있음을 보여라.
X T N y f XZ, Z f XY.
7.15 캐노니컬 커버를 생성하는 알고리즘은 한 번에 하나의 이질적인 속성만 제거한다. 만약 이질적인
속성으로 추정되는 두 개의 속성을 한 번에 삭제하는 경우 무엇이 잘못될 수 있는지, 문제 7.14의
함수 종속을 사용하여 설명하라.
result := 0;
I* fdcount is an array whose zth element contains the number
of attributes on the left side of the zth FD that are
not yet known to be in a+ */
for z := 1 to I尸I do
begin
let。― y denote the zth FD\
fdcount [z] := |p|;
end
/* appears is an array with one entry fbr each attribute. The
entry fbr attribute 力 is a list of integers. Each integer
i on the list indicates that A appears on the left side
of the zth FD */
for each attribute A do
begin
appears [A] := NIL;
for z :二 ! to I尸I do
begin
let 卩fy denote the zth FD;
if /4 £ P then add z to appears [A];
end
end
addin (a);
return (result);
7.18 프라임(prime) 속성을 적어도 하나의 후보 키에서 나타나는 속성이라고 하자. a와。를 a ー。는
Chapter 7 관계형 데이터베이스 설계 327
• A가 후보키에서나타난다.
• A 가 후보 키에 부분적으로 종속이지 않다.
모든 3NF 스키마가 2NF에 속함을 보여라(힌트 모든 부분 종속이 이행 종속임을 보여라).
7.20 R이 BCNF에 속하지만 4NF에는 속하지 않는 릴레이션 스키마 R과 (함수) 종속의 집합의 예를
들어 보라.
연습문제
7.23 정보의 중복과 정보 표현의 불가능의 뜻이 무엇인지 설명하라. 왜 이러한 각각의 특성이 잘못된 관
계형 데이터베이스 설계를 나타내는지 설명하라.
7.25 함수 종속의 정의를 이용하여 각 암스트롱의 공리(재귀, 증가, 이행 규칙)가 정당함을 주장하라.
(4 B, C)
(C, D, £).
A 一 BCD
BC - DE
Bf D
D-»A
a. 8+를구하라.
b. 암스트롱의 공리를 이용하여 AG가 수퍼 키 임을 증명하라.
c. 위의 함수 종속의 집합 尸에 대한 캐노니 컬 커버를 구하라. 각각의 유도되는 단계를 설명하라.
d. 캐노니컬 커버를 기반으로 주어진 스키마의 3NF 분해를 제시하라.
e. 본래 함수 종속 집합 F를 이용하여「의 BCNF 분해를 들어 보라.
AB - CD
B - D
DE t B
DEG - AB
AC — DE
A BC
BD - E
CD — AB
3NF 분해 알고리즘을 사용하여 R의 3NF 분해를 생성하고 수행한 작업에 대해 설명한다. 아래의
내용을 포함해야 한다.
a. 모든 후보키목록
b. 尸에 대한 캐노니컬 커버. 이 캐노니컬 커버를 생성하기 위한 절차에 대한 설명
Chapter 7 관계형 데이터베이스 설계 329
AB - CD
D t C
DE - B
DEH - AB
AC f DC
3NF 분해 알고리즘을 사용하여 R의 3NF 분해를 생성하고 수행한 작업에 대해 설명한다. 아래의
내용을 포함해야 한다.
a. 모든 후보키목록
b. 尸에 대한캐노니컬커버
c. 알고리즘의 단계에 대한 설명
d. 최종분해
7.44 주어진 두 릴레이션 r(A, B, validtime)과 s(B. C, va〃山""e)에서 validtime은 유효한 시간 간격을
나타낸다. 이때 두 릴레이션의 시간 자연 조인을 계산하는 SQL 질의를 작성하라. && 연산자를
사용하여 두 간격이 겹치는지 확인할 수 있고, * 연산자를 사용하여 두 간격의 교집합을 계산할
수 있다.
더 읽어보기
I Maier (1983)]는 정규화에 대한 자세한 내용, 함수 종속과 다중값 종속 이론을 제공하는 고전적 인 교과
서다.
참고문헌
I Armstrong (1974)] W. W. Armstrong, “Dependency Structures of Data Base Relationships^,, In
Proc, of the 1974 IFIP Congress (1974), pages 580-583.
I Codd (1970)] E. F. Codd, “A Relational Model for Large Shared Data Banks ', Communications of
ihe ACM, Volume 13, Number 6 (1970), pages 377-387.
|Codd (1972)] E. F. Codd. "Further Normalization of the Data Base Relational Model ', In [Rustin
(1972)], pages 33-64 (1972).
I Maier (1983)] D. Maier, The Theory of Relational Databases, Computer Science Press (1983).
[Rustin (1972)] R. Rustin, Data Base Systems, Prentice Hall (1972).
크레딧
응용 프로그램의 설계 및 개발
로그램은 모바일 플랫폼뿐만 아니라 웹 기반으로 광범위하게 사용된다. 9장에서 데이터를 저장하
고 검색하기 위해서 데이터베이스를 사용하는 대화식 응용 프로그램을 중심으로 응용 프로그램을
331
아】apter 8
복합 데이터 타입
데이터 타입은 엄격한 관계형 모델에서 원칙적으로 지원되지 않는다. 그러나 관계형 모델에서 도
한다. 신속한 개발이 필요한 웹 응용이 이러한 도메인 중 하나다. 이러한 응용에서 데이터 관리가
다양한 속성이 존재하며 속성은 자주 새롭게 추가될 수 있다. 일부 속성은 복잡한 데이터를 포함할
데이터 교환은 반구조형 데이터 표현의 또 다른 중요한 동기다. 어쩌면 많은 응용에서 저장보
333
334 PART 3 응용 프로그램의 설계 및 개발
관계형 모델은 현대의 응용이 요구하는 저장과 데이터 교환을 지원하기 위해 몇 가지 형태로 확장
되어왔다.
8.1.1.1 유연한스키마
서 각 튜플은 필요한 속성만 가지고 나머지는 널 값을 갖도록 한다. 이러한 표현 방식을 스파스 칼
8.1.1.2 다중값데이터타입
속성을 키-값 쌍으로 저장하는 키-값 맵을 허용하는 표현도 가능하다. 키-값 맵(key-value map)
한 데이터는 배열로 처리될 수도 있다. 실제로 이러한 스트림 데이터(stream data)를 배열로 처리하
는 것은 (시간, 데이터)와 같이 분리된 튜플로 저장하는 것보다 훨씬 덜 공간을 차지한다. 시간을 명
8.1.1.3 중첩데이터타입
펴본다. 이러한 표현은 어떤 고정된 스키마를 따라야 한다는 강제가 없기 때문에 유연하다고 말
용된다.
8.1.1.4 지식표현
인간 지식의 표현은 인공지능 분야의 오래된 목표였다. 복잡도의 차이는 있으나 다양한 모델이 이
러한 목표를 위해서 제안되었다. 이런 모델은 사실과 사실의 규칙을 표현할 수 있다. 웹의 성장과
는 이전 지식 표현 방식보다 더 유리하다.
이전에 배웠던 E-R 모델처럼 RDF 모델은 속성을 가지며 다른 객체와의 관계를 갖는 객체로 데
8.1.2 JSON
그림 8.1 은 JSON으로 표현된 데이터의 예다. 객체는 특정한 고정된 스키마를 따를 필요가 없기
"ID": "22222",
"name": {
"firstname: "Albert",
"lastname: "Einstein"
),
"deptname": "Physics",
"children":[
{"firstname": "Hans", "lastname": "Einstein" ),
{"firstname": "Eduard", "lastname": "Einstein" }
]
)
JSON을 사용해 결과를 반환한다. 예를 들어, 이메일 사용자 인터페이스는 사용자를 인증하거나 이
메일 리스트를 보여 주기 위해 이메일 헤더 정보를 가져오거나 이메일의 내용을 가져오거나 이메
각 단계에서 교환되는 데이터는 복잡하며 내부적인 구조를 가지고 있다. 복잡한 구조를 표현하
° 집계 함수를 사용하여 행들의 집합에 JSON 객체 생성을 허용하는 SQL 확장도 있다. 예를
들어, PostgreSQL에서 json_agg 집계 함수는 JSON 객체들의 집합으로부터 단일 JSON 객
FOR JSON AUTO 절을 제공하는데 이것은 SQL 질의의 각 행을 JSON 배열의 하나의 원
소로 만들어 준다.
• SQL 질의는 경로 생성자 등을 사용해서 JSON 객체로부터 데이터를 추출할 수 있다. 예를 들어,
PostgreSQL에서 v가 JSON 타입이고 속성 “ID”를 갖는다면 v-'ID'는 v의 ID 속성값을 반환한
338 PART 3 응용 프로그램의 설계 및 개발
이러한 확장의 정확한 문법과 의미는 특정 데이터베이스 시스템에 따라 다르다. 자세한 설명을
8.1.3 XML
XML 데이터 표현은 텍스트에서 어떤 정보를 표시하기 위해서 홑화살괄호(0)로 둘러싸인 태그
(tag)를 추가한다. 태그는 참조하는 텍스트의 시작과 끝을 표시하는〈tag〉와〈/tag〉가 쌍으로 사용
된다. 예를 들어, 문서의 제목은 다음과 같이 표시될 수 있다.
태그는 아래와 같이 릴레이션 이름과 속성 이름을 태그로 표시하는 관계형 모델을 표현하는 데 사
용될 수 있다.
<course>
<course_id> CS-101 </course.id>
<title> Intro, to Computer Science </title>
<dept_name> Comp. Sci. </dept_name>
<credits> 4 </credits>
</course>
관계형 스키마와 달리 새로운 태그가 쉽게 추가될 수 있다. 적절한 이름과 함께 인간이 이해할
수 있거나 이름을 이용하여 데이터의 의미를 추측할 수 있다는 점에서 데이터는 자체 문서화self
documenting) 되었다고 할 수 있다.
태그는 관계형 모델에서 불가능한 계층적 구조를 만드는 데 사용될 수 있다. 계층적 구조는 기 업
다. 구매 주문은 다양한 정보를 포함하는데 중첩된 표현은 구매 주문과 관련된 모든 정보를 하나의
고려해야 한다). XML은 데이터를 태깅하는 단일화된 방법을 제공한다. 두 기업체는 구매 주문서
에 사용되는 태그와 그것이 의미하는 것에 대해서 당연히 동의를 해야 한다.
〈purchase.o「d 은 r>
<identifier> P-101 </identifier>
<p 니 rchas 은「>
<name> Cray Z. Coyote </name>
<address> Route 66, Mesa Flats, Arizona 86047, USA </address>
v/p 니 rchas 은 r>
<supplier>
vnam은〉Acm은 S니ppli은s </name>
<address> 1 Broadway, New York, NY, USA </address>
〈/supplier〉
<itemlist>
<item>
vid은ntifi은r> RS1 </id은ntifier>
<description> Atom powered rocket 외ed </description>
〈quantity〉2 v/q니antity>
<price> 199.95〈/pric은〉
</item>
<item>
<identifier> SG2 〈/id은ntifier〉
〈description〉S니perb glue 〈/d은scription〉
<quantity> 1 </quantity>
<unit-of-measure> liter〈/니nit-of-measur은〉
<price> 29.95 </price>
</item>
</itemlist>
〈totaLco아〉429.85〈/totaLco아〉
• SQL 질의는 XML 데이터 타입을 갖는 값으로부터 데이터를 추출할 수 있다. 예를 들어 XPath
언어는 XML 문서로부터 원하는 부분의 데이터만 추출하는 것이 가능한 "경로 표현(path
expression)”을 지원한다.
8.1.4.1 트리플표현
여기서 ID, /。/ 그리고 1D2는 개체의 식별자다. 개체는 RDF에서 자원(resource)으로 불린다. E-R
역시 따옴표 없이 표현된다.
관계에 의해서 제공된다. 예를 들어, 1이01은 instructor 인스턴스로 식별되고 00128은 student의
인스턴스다. RDF의 문법에 따라 Comp. Sci. 학과의 식별スト는 comp_sci로 표시된다. 학과의 유일
Chapter 8 복합 데이터 타입 341
운 식 별자를 만들었다. "sec「'이 semester, year, sec_id 속성을 가지며 CS-101 에 대한 관계 course
를 갖는 section을 식 별한다.
그림에서 관계는 대학교 스키마에서도 존재했던 fakes와 teaches 관계를 포함한다. instructors,
E-R 모델이나 관계형 스키마와 달리 RDF는 새로운 속성이 객체에 쉽게 추가될 수 있으며 새로
운 타입의 관계로도 쉽게 생성될 수 있다.
8.1.4.2 RDF의그래프 표현
RDF 표현은 매우 자연스럽게 그래프로 해석될 수 있다. 개체와 속성값은 노드로 표현될 수 있고
속성 이름이나 관계는 노드 간의 간선으로 표현될 수 있다. 속성/관계 이름은 대응되는 간선의 레
이블로 볼 수 있다. 그림 8.4는 그림 8.3 데이터에 대한 그래프 표현이다. 객체는 타원으로 표시되
고 속성값은 사각형으로 표시된다. 관계는 관계를 식별하는 연관된 레이블이 있는 간선으로 표시
데이터 출처로부터 가져온 사실을 저장하는 것이다. ''Washington. D.C. is the capital of U.S.A.”라
는 사실을 고려해 보자. 이러한 사실은 두 개의 노드를 연결하는 capital-of라고 레이블된 간선으로
표현될 수 있다. 여기서 하나의 노드는 Washington, DC라는 개체이고 다른 하나는 USA.라는
개체다.
들어, “어떤 도시가 U.S.A.의 수도입니까?”라는 질의는 capital-of로 레이블된 간선을 검색하고
U.S.A.의 도시로 연결된 개체를 찾으면 응답할 수 있다(타입 정보가 이용 가능하고 개체 타입 City
를 표현하는 노드에 instance-of 간선으로 연결된 Washington. D.C.가 존재한다면 이 질의는 또한
검증될 수 있다).
8.1.4.3 SPARQL
SPARQL은 RDF 데이터에 질의를 하기 위해 설계된 질의어다. 이 언어는 RDF 트리플처럼 보이지
만 변수를 포함하는 트리플 패턴에 기반하고 있다. 예를 들어 아래의 트리플 패턴을 살펴보자.
그림 8.3에서 보인 대학교 트리플 데이터 집합에 대해서 첫 번째 트리플 패턴은 (CS-101, title,
완벽한 SPARQL 질의는 아래와 같다. 아래 질의는 과목 이름이 "Intro, to Computer Science”인
분반을 수강하는 모든 학생의 이름을 검색한다.
select ?name
where {
?cid title "Intro, to Computer Science".
?sid course ?cid .
?id takes ?sid .
?id name ?name .
}
트리플 사이에서 공유된 변수는 트리플 각각이 매칭되는 튜플들 간의 조인 조건을 의미한다.
될 수 있다. 하나는 Washington이 미국의 수도인 2050년 마지막 날까지의 기간이고 다른 하나는
スト. 그리고 .을 〇bama와 미국을 각각 perso〃과 country 관계 간선으로 표현하는 개체와 연결하
한 한정자(qualifier)로 취급된다.
취급될 수 있다.
8.2 객체 지향
더 풍부한 타입을 제공함으로써 관계형 모델을 확장한 모델이다. 관계형 질의어 특히 SQL은 풍부
한 타입을 다루기 위해서 적절히 확장되어 왔다. 이러한 확장은 관계형 모델의 기본, 특히 데이터에
대한 선언적 접근을 유지하면서 동시에 모델링 능력을 확장하는 식으로 발전되어 왔다.
이 바람직하다.
큰 성공을 거두지 못했다. 첫 번째는 선언형 질의는 효율적인 데이터 접근을 위해서 매우 중요한데
그러한 질의가 명령형 프로그래밍 언어에 의해서 지원되지 않았다. 두 번째는 포인터를 통해 객체
8.2.1.1 사용자정의타입
SQL에 대한 객체 개념의 확장은 구조화된 사용자 정의 타입의 생성과 이러한 타입에 대한 참조,
그리고 이 러한 타입을 포함한 테이블의 생성을 가능하게 했다.’
속성은 이러한 배열과 테이블 타입으로 선언될 수 있다. 문법을 포함해서 이러한 특징의 지원은 데
integer 문법으로 지원한다. SQL Server는 테이블-값 타입을 아래의 예제와 같이 선언하는 것을
허용한다.
8.2.1.2 타입상속
이전에 정의된 타입 Person^ 테이블 people을 고려해 보자. 데이터베이스에 학생인 사람과 교
Student오キ Teacher는 모두 庄アso〃의 속성, 즉 ID, name, address를 상속받는다. Student^ leacher는
8.2.1.3 테이블상속
insert into student values ('00128', 'Zhang', '235 Coyote Run', 'Ph.D.');
접 삽입한 튜플뿐만 아니라 서브테이블 s加dems와 Zea사zers에 있는 튜플도 검색하게 된다. 그러나
단지 peop/e에만 존재하는 속성은 해당 질의에 의해서만 접근될 수 있다. SQL은 질의에서 people
대신에 “only people”을 사용해서 서브테이블이 아니라 peop/e 테이블에 있는 튜플만 검색할 수도
있다.
8.2.1.4 SQL에서참조 타입
(alias)이다. ID와 name을 이용해서 Person 튜플을 만들고 하위 질의에서 튜플에 대한 참조를 검색
하는 데 사용할 수 있다. 하위 질의는 departments 테이블에 튜플을 삽입할 때 head 속성에 대한 값
values 문장을 허용하지 않기 때문에 다음의 두 질의가 이러한 작업을 하는 데 사용될 수 있다.
있다.
348 PART 3 응용 프로그램의 설계 및 개발
people 테이블에 있는 튜플의 name 속성이다. 참조는 조인 연산을 숨기는 데도 이용될 수 있다. 이
이름과 주소를 찾기 위해서 departments와 people 릴레이션을 명시적으로 조인해야 한다. 참조의
select deref(head).name
from departments',
8.2.2 객체-관계매핑
장 명령을 수행할 수 있다. 객체와 릴레이션 간의 매핑은 데이터베이스에 있는 튜플을 갱신, 삽입,
ORM을 사용하는 부가적 혜택은 데이터를 저장하는 데 정확히 동일한 고수준의 코드를 사용해
여러 개의 데이터베이스를 사용할 수 있다는 점이다. ORM은 데이터베이스들 간의 사소한 SQL
터베이스 갱신에 대해서는 상당한 성능상의 비효율성이 있다는 점이다. 이러한 비효율성이 발견되
Hibernate ORM 시스템과 Python에 대해서 객체-관계 매핑을 지원하는 Django ORM 시스템에
대한 더 자세한 정보는 9.6.2절을 참고하라.
8.3 텍스트데이터
8.3.1 키워드 질의
정보 검색 시스템은 유용한 정보를 갖고 있는 문서에 대해서 검색할 수 있는 기능을 제공한다. 문
반환한다. 좀 더 섬세한 시스템은 질의에 대한 문서의 적합도를 측정하여 적합도 순서대로 문서를
함하는 저장된 웹 페이지를 찾아낸다. 웹 검색 엔진은 오늘날 단순한 웹 페이지 검색을 뛰어넘었다.
8.3.2 적합도 순위
8.3.2.1 TF-IDF를이용한순위화
사용하는 것이다. 여기서 기본적인 가정은 적합한 용어일수록 문서에서 자주 출현한다는 것이다.
장 단순한 방법은 단순히 더하는 것이다. 그러나 키워드로 사용한 모든 용어가 동일하지 않다. 질의
Chapter 8 복합 데이터 타입 351
IDF⑴=エ
여기서 "⑺는 용어『를 포함하는 문서의 개수를 의미한다. 용어의 집합。에 대한 문서 "의 적합도
r(d,。)=ヽ:TF(d, t) * IDF⑴
そ。
수 있도록 하고 있다.
8.3.2.2 하이퍼링크를이용한순위화
N
P[/] = 6/N + (1 — 6) *,(7[,,力 ・ P[,])
키워드 질의에 대한 문서의 적합도를 측정할 때 문서의 TF-IDF 값과 함께 연결해서 사용할 수 있다.
페이지랭크는 특정 사이트의 인기도를 측정하는 유일한 방법은 아니다. 특정 사이트가 얼마나
8.3.3 검색유효성측정
의에 대해서 검색된 문서들 중에서 실제로 적합한 문서의 비율이다. 두 번째는 재현율(recall)로 적
합한 모든 문서 중에서 검색된 적합한 문서의 비율이다. 검색 엔진은 수많은 응답을 찾아내지만 사
용자는 실제로 응답 중에서 몇 개(보통 10개 혹은 20개)만 보고 중단하기 때문에 정밀도와 재현율
한 기술이 제안되었다.
한 가지 방법은 그래프를 이용해 데이터를 표현하고 그래프에 대해서 키워드 질의를 수행하는
으로 표현할 수 있다. 키워드 검색은 그래프에서 주어진 키워드를 포함한 튜플을 찾거나 혹은 그들
“Zhang”이란 이름을 갖는 학생과 같은 경로도 이 질의에 부합될 수 있다. 이러한 질의는 사용자가
정확한 스키마를 모르거나 자신이 찾고자 하는 데이터를 위해 SQL을 작성하는 것을 원하지 않는
경우에 질의를 하거나 브라우징을 하기 위해 적절히 사용될 수 있다. 모든 사용자가 구조화된 질의
화는 되어야 한다. 이런 상황에서 결과를 순위화하기 위해서 간선들의 방향과 가중치를 배정하기
이 장의 참고문헌을 참고하라.
래프는 각 개체에 유일한 식별자를 제공할 수 있으며 각 개체는 텍스트 문서에 있는 개체의 주
사용한다.
2 이 경우, 지식 그래프는 이미 "Stonebraker developed PostgreSQL”을 기록해 놓았을 것이다. 문서에는 지식 그래프에는 없
는 많은 다른 종류의 정보가 존재할 수 있다.
354 PART 3 응용 프로ユ램의 설계 및 개발
8.4 공간데이터
데이터베이스에서 공간 데이터 지원은 위치에 기반한 데이터의 저장, 인덱스, 질의를 위해서 중요
하다.
지리정보 및 기하학적 데이터 타입은 Oracle Spatial 및 Graph, PostgreSQL의 확장인 PostGIS,
SQL Server, 그리고 IBM DB2 Spatial Extender 등과 같은 많은 데이터베이스 시스템에서 지원된다.
이 절은 공간 데이터에 대한 모델링과 질의에 대해서 살펴본다. 인덱스 및 질의 처리 기술과 같
Geospatial Consortium, OGC) 표준에 기반한 표현이 점차 많이 지원되고 있으나 현재는 데이터베
이스마다 다르다. 데이터베이스에 제공되는 특별한 문법을 배우기 위해서는 해당 데이터베이스 사
용법을 참고하라.
스트는 다각형 영역의 경계를 표시한다. 다각형은 그림 8.5에서처럼 삼각형의 집합으로 분할할 수
l(xl,yl), (x2,y2)}
object representation
표현하는데 각 튜플은 꺾은선 혹은 곡선의 식별자를 갖는다. 유사하게 다각형의 삼각화된 표현은
3차원 공간에서 점과 선분의 표현은 2차원 공간의 표현과 유사한데 유일한 차이점은 추가적인
z좌표를 갖는다는 것이다. 삼각형, 사각형, 다각형 등과 같은 평면 도형의 표현은 3차원 공간에서도
변하지 않는다. 사면체와 정육면체는 삼각형이나 사각형과 같은 방식으로 표현될 수 있다. 임의의
다면체도 다각형을 삼각화하는 것처럼 사면체로 분할해서 표현할 수 있다. 또는 다면체를 구성하
꺾은선, 곡선, 다각형 등의 서브타입을 갖는다. 이러한 타입의 텍스트 표현은 OGC 표준에 의해 정
3, 4 4)는 점 (1, 1), (2, 3), (4, 4)를 연결하는 선이고 POLYGON((1 1, 2 3, 4 4, 1 1))는 이런 점
을 연결하는 삼각형을 정의한다. 함수 ST__GeometryFromText()와 ST_GeographyFromText()는
고하라.
디자인 데이터베이스에 저장된 객체는 일반적으로 기하학적 객체다. 단순한 2차원 기하학적 객
체는 점, 선, 삼각형, 사각형, 그리고 일반적으로 다각형을 포함한다. 복잡한 2차원 객체는 이러한
단순한 2차원 객체의 합집합, 교집합, 차집합 연산으로 만들어질 수 있다. 유사하게 복잡한 3차원
산을 통해서 만들어질 수 있다. 3차원 표면은 와이어 프레임 모델(wireframe model)에 의해 표현될
수 있는데 이것은 표면을 선분, 삼각형, 사각형 등과 같은 더 단순한 객체로 모델링하는 것이다.
보만 다룬다.
고 있다.
8.4.3.1 지리정보데이터의응용
정보 등이 있을 수 있다.
수 있기 때문에 대규모 서비스 붕괴를 가져올 수 있다. GPS를 이용한 정확한 위치 검색 기능을 제
공하는 시스템과 연계된 지리정보시스템은 이러한 문제를 예방할 수 있다.
358 PART 3 응용 프로그램의 설계 및 개발
8.43.2 지리정보데이터의표현
가될 수도 있다.
다른 방법으로는 표면을 삼각화(즉 삼각형으로 분할)해서 각 삼각형을 코너의 위도, 경도, 고도로
수 있도록 할 수 있다.
8.4.4 공간질의
할 필요가 없다. 따라서 사용자는 가장 가까이에 있는 주유소가 얼마나 떨어져 있는지 알 필요가
없다.
8.5 요약
많다.
한 이러한 확장은 관계형 모델의 기본, 특히 데이터에 대한 선언적 접근을 유지하면서 동시에 모
• 관계형 모델은 현대의 응용이 요구하는 저장과 데이터 교환을 지원하기 위해 몇 가지 형태로 확
장되어 왔다.
• XML 표현은 레코드가 포함하는 속성의 집합이나 이러한 속성의 타입에 대해서 유연성을 제공
한다.
력을 제공한다.
의 결과를 순위화한다.
。 역문서 빈도
° 인기도순위
지리정보 데이터 타입과 점, 선분, 다각형을 포함하는 서브타입을 지원한다. 영역 질의, 최근접
용어정리
• 와이드칼럼 • 맵
• 스파스 칼럼 • 배열 데이터베이스
• 키-값맵 • 태그
362 PART 3 응용 프로コ램의 설계 및 개발
• 트리플 페이지 랭크
• 자원 정밀도
• 주어 재현율
• 술어 지리정보 데이터
• 목적어 기하학적 데이터
• 객체 지리정보시스템
• 지식그래프 컴퓨터 지원 설계(CAD)
• 구체화 꺾은선
• 쿼드 삼각화
• 링크드 오픈데이터 공간 네트워크
• 객체-관계 데이터 모델 공간 그래프
• 객체-관계 데이터베이스 시스템 래스터 데이터
• 객체-관계매핑 타일
• 객체 지향 데이터베이스 시스템 벡터 데이터
• 경로표현 지형학적 정보
• 키워드 부정형 삼각 네트워크
• 키워드질의 겹침
• 용어 근접 질의
• 적합도 최근접 질의
• TF-IDF 영역 질의
• 불용어 공간 그래프 질의
• 근접도 공간질의
실전문제
a. 중첩 표현을 갖는 JSON 방식
b. 중첩표현을갖는 XML 방식
c. RDF 트리플방식
d. RDF 그래프방식
8.2 그림 8.3의 대학교 스키마에 대한 RDF 표현을 활용해서 아래의 질의를 SPARQL로 작성하라.
• 밴승객수
8.4 다중값 속성을 위해 아래와 같이 명세된 타입을 갖는 Emp 릴레이션을 포함하는 스키마를 가정하자.
multiset 속성을 선언하기 위해서 821.1 절에서 설명한 SQL Server 테이블 타입 문법을 사용해
서 위의 스키마를 SQL로 정의하라.
instructor
边
name
first_name
middle_inital
last_name
address
street
street_number
street_name
apt_number
city
state
zip
{phone_number]
date_of_birth
age{)
8.7 이 장의 실전문제 각각에 대해서 “SQL 릴레이션”이란 질의와의 적합도를 계산하라. 용어 빈도와
역문서 빈도의 정의를 사용하라.
8.8 페이지랭크를 계산하는 데 사용된 척도를 릴레이션으로 표현하는 방법을 설명하라. 그리고 페이
연습문제
8.11 821.3절에 있는 people 테이블과 people의 하위에 생성된 와 teachers 테이블을 참고하
라. 제3정규형으로 동일한 정보를 표현하는 릴레이션 스키마를 정의하라. 서브테이블에 존재하는
제약 조건을 상기하고 관계형 스키마의 모든 데이터베이스 인스턴스가 상속성을 갖는 스키마의
인스턴스로 표현될 수 있도록 관계형 스키마에 부과되어야 할 모든 제약 조건을 기술하라.
8.12 서브타입과 서브테이블을 활용한 구체화를 포함하고 있는 그림 8.9의 E-R 다이어그램을 참고하
여 다음 물음에 답하라.
8.13 데이터베이스에 있는 튜플들의 집합에 대해서 키워드 질의를 수행한다고 가정하자. 각 튜플은 몇
개의 속성을 가지머 각 속성은 몇 개의 단어를 갖는다. 용어 빈도의 개념이 이런 상황에 적합한
더 읽어보기
참고문헌
[Manning et al. (2008)] C. D. Manning, P. Raghavan, and H. Schiitze, Introduction to Information
Retrieval, Cambridge University Press (2008).
[Salton (1989)] G. Salton, Automatic Text Processing, Addison Wesley (1989).
[Stonebraker (1986)] M. Stonebraker, "Inclusion of New Types in Relational Database Systems”,In
Proc, of the International Conf on Data Engineering (1986), pages 262-269.
[Stonebraker and Rowe (1986)] M. Stonebraker and L. Rowe, Fie Design of POSTGRES”,In
Proc, of the ACM SIGMOD Conf, on Management of Data (1986), pages 340-355.
크레딧
응용 프로그램의 개발
바일 앱(app) 인터페이스다.
9.7절에서 대규모 웹 응용 개발에서 성능과 관련된 사항을 논의한다. 마지막으로 9.8절에서 공격에
대해 복구 가능한 응용을 개발하는 데 중요한 보안 문제를 다루고, 9.9절에서 암호화와 응용 프로
367
368 PART 3 응용 프로그램의 설계 및 개발
프로그램과 마찬가지로 실제 사용자 본인이 맞는지 인증하기 위해서 사용자 ID와 비밀번호가 필요
하다. 응용 프로그램은 이 인증 정보를 사용해서 사용자의 이름, 신청한 과목의 목록과 같은 정보를
로그램이 수많은 인터페이스를 제공한다. 회사에서 제품의 판매, 구매, 회계, 급여, 인사, 재고 관리
취향에 관한 입력을 하지 않아도 각 사용자에 대해서 개인화된 페이지를 제공할 수 있다. 그렇게
할 수 있다. 예를 들면, 지금까지 사용자가 본 뉴스의 목록을 이용해서 개인화된 뉴스를 제공할 수
있다.
술은 Java Servlet, Java Server Page(JSP), Active Server Page(ASP), 혹은 PHP와 Python 등과
같이 다양하다.
• 응용 프로그램은 개인 장치, 주로 모바일 장치에 설치된다. 그리고 API를 통해서 백엔드 응용과
통신하면서 데이터베이스에 직접 접근하지 않는다. 백엔드 응용은 사용자 인증을 포함한 서비스
감소하고 있다. 백엔드는 요구하는 작업을 수행하기 위해 모바일 앱이나 Java 코드 안에서 호출될
9.오 웹의 기본
http://www.acm.org/sigmod
URL의 첫 부분은 웹상의 문서에 어떻게 접근할지를 나타낸다. “http”는 웹 페이지가 Hyper
Text Transfer Protocol HTTP)에 의해 접근될 것임을 나타낸다. 이 규약은 웹 문서를 전송하기
위한 규약이다. “https”는 HTTP 규약의 보안 버전을 사용해야 함을 나타내며 오늘날 선호되는 형
<html>
<body>
<tabl은 border>
<tr> <th>ID</th> vth>Nam은</th> <th>Department</th> </tr>
< tr> <td>00128</td> <td>Zhang</td> <td>Comp. Sci.</td> </tr>
< tr> <td>12345</td> <td>Shankar</td> <td>Comp. Sci.</td> </tr>
< tr> <td>19991</td> <td>Brandt</td> <td>History</td> </tr>
</table>
</body>
</html>
따라서 URL은 웹 서버의 프로그램이 가진 위치를 나타낼 식별자와 프로그램에 인자로 넘어갈
https://www.google.com/search?q=silberschatz
가지고 프로그램을 실행한다. 프로그램이 실행되면 그 결과는 HTML 문서로 주어지고 프런트엔드
로 넘겨지게 된다.
생성한 표를 나타낸다. HTML 소스에는 HTML 태그가 존재한다. 모든 HTML 페이지는 html 태
그로 둘러싸야 하고 페이지의 본문은 body 태그로 둘러싸야 한다. 표는 table 태그로 표시하며, tr
표시한다. HTML 태그에 대해서는 더 자세히 다루지 않는다. HTML의 세부적인 정보는 참고문헌
을 참조하기 바란다.
<html>
<body>
<form action="PersonQ니ery“ method=g은t>
Search for:
<select nam은=〃persontype">
<option vahje="와니dent“ selected>St니dent </option>
<option value二"instr니ctor"> Instr니ctor </option>
</select> <br>
Name: vinp니t サpe二text size=20 name="name">
〈input type二submit vahje二"submit">
</form>
</body>
v/html〉
그림 9.3 HTML 형식
만, HTML은 이 외에도 몇몇 입력 방식을 제공한다. form 태그의 action 속성은 (전송 버튼을 클
개변수 q를 갖는 서식이 get 방식을 사용할 때, 사용자가 “silberschatz”를 입력하고 서식을 전송하
https://www.google.com/search?q=silberschatz
규약 교환의 일부로서 매개변수 값을 송신한다. 그림 9.3의 서식은 get 방식을 사용하고 있다.
HTML 문서를 단순 텍스트 편집기를 이용해 작성할 수도 있지만, GUI를 통해 HTML 문서를
직접 생성해 주는 편집기도 많다. 이러한 편집기는 수동으로 소스 코드를 입력하지 않아도 메뉴 선
9.2.3 웹 서버와 세션
단순히 문서를 주고받는 것 이상의 기능을 제공한다. HTTP의 가장 중요한 기능은 사용자가 넘겨
2단계 구조를 이루고 있다. 다음 절에서 2단계 구조에 기반을 둔 시스템에 대해 자세히 살펴볼 것
이다.
유지한다면 웹상의 대부분 사이트가 이 제한을 넘어설 것이고 나머지 많은 사용자들이 서비스를
1 성능 향상을 위해서는 잠깐 연결을 유지할 수 있다. 연속적인 요청을 처리하는 경우에는 연결의 재사용을 허용할 수 있다.
하지만 연결이 지속된다는 보장을 할 수 없기 때문에 응용 프로그램은 요청이 처리되자마자 연결이 끊길 수 있다는 것을 염
두에 두고 만들어져야 한다.
374 PART 3 응용 프로그램의 설계 및 개발
에서 다시 인증하는 것은 좋지 않다.
서 요청이 발생할 때마다 이 정보를 반환해야 한다. 서버는 이 정보를 이용하여 해당 요청이 이미
허가된 사용자 세션의 일부라는 것을 식별한다. 세션에 대한 추가적인 정보는 서버 측에도 저장되
어 있어야한다.
로 본다.
어, 사용자가 올바른 이름과 암호를 전송할 때에만 인증이 성공한 것으로 본다.2
대중에 공개된 뉴스 사이트와 같이 높은 보안을 요하지 않는 응용 프로그램의 경우, 브라우저
2 예를 들어. 사용자 식별자는 userid와 같은 이름으로 클라이언트의 쿠키에 저장될 수 있다. 이런 방식은 사용자 식별이 가능
한 무료 웹 사이트와 같이 보안성이 낮은 응용 프로그램에서 사용될 수 있다. 그러나 높은 수준의 보안이 있어야 하는 응용
프로그램의 경우 이 방식은 보안에 취약하다는 단점이 있다. 악의적인 사용자가 브라우저의 쿠키 값을 변경하고 다른 사용
자인 것처럼 속일 수 있다. 예를 들면 sessionid와 같은 이름의 쿠키에 큰 범위 내의 난수 값을 할당하면 사용자가 자신의
정체를 속이기가 어렵다. 반면에 쿠키에 순차적인 값을 할당하면 보안이 취약해진다.
Chapter 9 응용 프로그램의 개발 375
9.3 서블릿
그램과 클래스를 서블릿이라 부른다. 그림 9.7은 서블릿의 예다. 뒤에서 이에 대해 설명할 것이다.
서버가 시작되거나 서버가 특정 서블릿을 실행하라는 HTTP 요청을 받으면 서블릿 코드가 웹
서버에서 실행된다. 서블릿의 임무는 데이터베이스에 접근해서 필요한 정보를 가져오는 요청을 처
9.3.1 서블릿 예제
서블릿은 주로 HTTP 요청에 대해서 동적 결과를 생성하는 데 사용된다. HTML 형태로 입력이 주
어지면 서블릿은 비즈니스 로직을 수행한 후 그 결과를 HTML의 형태로 브라우저에 보낸다.
얻어 내야 한다. 그리고 out에 HTML 형식의 결과를 출력한다. 예제에서 질의 결과는 그림 9.8에
한다. 열의 헤더는 출력되기 위해서 이 함수에 전달된다. 열 이름은 JDBC 메타데이터를 사용해서
알아낼 수 있다. 그러나 데이터베이스 열 이름은 사용자에게 보여 주기에 적절하지 않을 수 있으므
*
import java.io.
;
import javax.servlet.
*
;
import javax.s 은 rvlet.http.
*
;
©WebServletCPersonQuery")
p니blic class PersonQueryServlet 은xtends HttpS은rvlet {
p니blic void doGet(HttpServletRequest req니est,
HttpServletResponse response)
throws ServletException, lOException
(
response.setContentType("text/htm ド);
Printwriter 〇니t = response.getWriterO;
... ch은ck if 니s은r is logg은d in ...
out.println(/z<HEAD><TITLE> Q니ery Res니tv/「TLE>v/HEAD>");
out.println(//<BODY>//);
그림 9.7 서블릿코드의예
9.3.2 서블릿세션
이 이전의 요청과 같은 브라우저 세션상에 있는지 파악할 수 있다. 그러나 쿠키는 낮은 단계의 기
import java.io.
*
;
;
*
import javax.servlet
*
import javax.servlethttp
;
out.println("v/tr>〃);
while (rs.nextO) {
〇 니 t.println("<tr>");
로그인 페이지는 사용자의 이름과 비밀번호를 입력받는다. 로그인 페이지에 대응되는 서블릿은
session.setAttribute(,,userid,z, userid)
session.getAttribute( "userid")
userid 변수가 없으면 함수는 널 값을 반환하고, 이것은 클라이언트 사용자가 인증되지 않았다는
것을 의미한다.
그림 9.7에 있는 ”... check if user is logged in ...”이라고 되어 있는 서블릿 코드를 생각해 보자.
아래는 이 검사를 하는 수행하는 코드다. 만약 사용자가 로그인하지 않는다면 오류 메시지를 보내
9.3.3 서블릿생명 주기
스턴스를 생성한다. 또한 init() 함수를 호줄하여 서블릿 인스턴스를 초기화한다. 각 서블릿 인스턴
스는 처음 생성될 때 단 한 번만 초기화된다.
웹 서버는 서블릿 인스턴스가 존재하는 상태에서 request 객체와 response 객체를 매개변수로
생성한다. 그래서 여러 요청이 병렬적으로 동시에 수행될 수 있다. service 메소드는 doGet이나
Chapter 9 응용 프로그램의 개발 379
doPost를 호출한다.
더는 필요 없는 서블릿은 destroy() 메소드를 호출하여 종료시킬 수 있다. 타임아웃 기간 내에
서블릿에 대한 요청이 없으면 서버가 서블릿을 자동으로 종료시키도록 설정할 수 있다. 타임아웃
9.3.4 응용서버
Weblogic Application Server, Oracle Application Server, IBM WebSphere Application Server 등
이 있다.
되어 요청을 적절히 분산시킴으로써 성능을 향상할 수 있다. 다수의 응용 서버는 Java 2 Enterprise
9.4.1 서버 측 스크립팅
스 코드가 있었다는 사실을 모르게 된다. 실행된 소스 코드는 데이터베이스에 전달할 SQL 문을 포
함하고 있을 수 있다.
<html>
<head> <title> Hello </title> </head>
<body>
< % if (request.getParameter("name") == null)
{ out.println("H이。World"); }
else { outprintln("Hello, " + request.getParameter("name")); }
%>
</body>
</html>
PHP와 Ruby 등이 있다. 이러한 프레임워크에서 Java, C#, VBScript, Ruby 등으로 작성된 코드
가 HTML 페이지에 삽입되거나 HTML 페이지로부터 호출되어 실행될 수 있다. 예를 들면, JSP
는 HTML 페이지에 Java 소스 코드를 삽입할 수 있고, Microsoft의 ASP.NET과 ASP는 C#과
이제 JSP(Java Server Pages)에 대해 간략히 살펴보スト. JSP는 정적인 HTML과 동적으로 생성되
타내야 한다. 이와 달리 JSP는 정적인 HTML에 Java 코드를 삽입할 수 있다. 삽입된 Java 코드는
페이지의 동적인 부분을 생성한다. JSP 스크립트는 서블릿 코드로 변환된 후 컴파일된다. 프로그래
그림 9.9는 Java 코드를 포함하고 있는 JSP 페이지의 소스 코드를 보여 준다. 스크립트의 Java
코드는 주변의 HTML 코드와의 구별을 위해 <% ... %>로 둘러싼다. 이 소스 코드는 request.
저에 결과로 보낼 HTML을 생성한다. JSP 페이지의 HTML 부분은 결과 그대로다『 <% ... %>로
둘러싸인 모든 Java 소스 코드는 HTML 결과에서 모두 문자로 변환되어 out 객체에 전달된다. 그
5 JSP 페이지는 좀 더 복잡한 소스 코드 삽입이 가능하다. HTML 코드는 Java의 if-else 조건문 안에 들어갈 수 있어서 조건이
참인지 거짓인지에 따라서 서로 다른 결과를 출력할 수 있다. 자세한 설명은 생략한다.
Chapter 9 응용 프로그램의 개발 381
좀 더 현실적이다.
9.4.1.2 PHP
PHP 코드의 끝을 의미한다. 다음 PHP 코드는 그림 9.9의 JSP 코드와 같은 작업을 수행하는 코
드다.
<html>
<head> <title> Hello </title> </head>
<body>
<?php if (!isset($_REQUEST[/name/D)
{ echo 'H이〇 World7; }
else { echo 'Hello, ' . S-REQUESTt'name'l; }
?>
</body>
</html>
$_REQUEST 배열은 request 변수를 포함하고 있다. 이 배열은 변수의 이름으로 인덱스되어 있
다. PHP의 배열은 숫자뿐만 아니라 임의의 문자열로 인덱스될 수 있다. 함수 isset은 배열이 초기
화되어 있는지 그렇지 않은지를 판단한다. 함수 echo는 그 값을 HTML로 출력한다 연산자 “.”는
두 문자열을 하나의 문자열로 통합한다.
일이 요청되면 JSP 파일이 처리되는 과정과 마찬가지로 웹 서버가 작업을 진행하고 결과를 웹 브
라우저에 전달한다.
PHP 언어를 위한 수많은 라이브러리가 존재한다. Java의 JDBC와 비슷한 ODBC를 이용한 데
이터베이스 접속을 위한 라이브러리도 존재한다.
9.4.2 웹 응용 프레임워크
웹 응용 개발 프레임워크는 다음과 같은 기능을 제공함으로써 웹 응용 프로그램 개발 업무를 쉽게
만들어 준다.
구를 제공하기도 한다.
• 서식을 구현하기 위해서 시스템이 생성한 HTML, JavaScript/Ajax 소스 코드의 사용자 입력에
서 검증 제약 조건을 가지고 명세하는 선언 방법
한다. 선언적 명세를 통해서 형식을 생성하거나, 사용자 모르게 데이터 접근을 관리하고, 웹 응용
해서 수정될 수 있다.
그림 9.10은 서블릿을 이용해 이전에 구현했던, 사람을 찾는 질의를 구현한 코드다. 이 코드는
def person-q니ery_view(request):
if “username“ not in requestsession:
return login_view(req니est)
persontype = request.GET.getCpersontype")
personname = req 니 est.GET.get("personnam 은〃)
if persontype == "student”:
query_tmpl = "select idz name, dept_nam은 from student where name=%s"
else:
query_tmpl = "select id, name, dept.name from instructor wh은r은 name=%s"
with connection©니rsor() as cursor:
cursor.execute(query_tmpl, [personname])
headers = ["ID", "Name", "Department Name"]
return HttpResponse(result_set_to_html(headers, cursor))
py에 명시되어 있다. 이 부분은 생략한다. 연결이 설정되면 JDBC 구문과 유사하게 커서가 개방되
고 커서를 사용해서 질의가 실행된다. cursor.execute의 첫 번째 인スト는 "%s"로 표시된 매개변수
를 갖는 질의이고, 두 번째 인자는 매개변수로 제공되는 값의 리스트다. 데이터베이스 질의 결과는
저에서 실행되도록 설계된 언어다. 이러한 스크립팅 언어의 중요한 동기는 HTML이나 HTML 서
식에서 제공하는 제한된 범위를 넘어서는 사용자와의 유연한 상호작용이다. 클라이언트 사이트에
작용 속도를 훨씬 높일 수 있다.
9.5.1 JavaScript
9.5.1.1 입력 검증
이 함수는 HTML 문서의 head 부분에 선언되어 있다. 이 서식은 시작과 종료 날짜를 입력받는다.
<html>
<head>
<script type=/,text/javascript//>
Unction validateO {
var startdate = new Date (doc니ment.get티ementByld("start").val니e);
var enddate = new Date (documentgetElementByld( /zend/z).value);
if(startdate > enddate) {
alert(zzStart date is > end datezz);
return false;
)
)
</script>
</head>
<body>
<form action="submitDates“ onsubmit="return validate()">
Start Date: <input typ은=“date" id="start"><br />
End Date :〈input type二"date" id二"end"><br />
<input type="submit" value="Submit">
</form>
</body>
</html>
정하자. 텍스트 박스를 포함하는 테이블 및 다른 서식 입력 메소드가 사용자 입력을 모으기 위해서
"항목 추가(Add Item)^^ 버튼을 클릭할 수 있다. 이 버튼은 테이블에 행을 추가함으로써 DOM 트리
9.5.1.3 웹서비스와상호작용
JavaScript는 Ajax라고 불리는 기술을 사용하여 동적인 웹 페이지를 생성하는 데 사용될 수 있다.
JavaScript로 작성된 프로그램은 웹 서버와 비동기식으로 통신하면서 데이터를 가져와 그것을 화
면에 보여 줄 수 있다. 8.1.2절에서 살펴본 JavaScripf Object Notation 혹은 JSON 표현은 비록
이다. 그러면 JavaScipt 코드는 데이터를 화면에 표시하게 된다. 이러한 백엔드 서비스를 웹 서비스
(web service)라고 한다. 이러한 서비스는 Java Servlet, Python, 혹은 다수의 프로그래밍 언어 프레
임워크를 사용해 구현할 수 있다.
에게 보여 주게 된다.
용한다. HTML 코드에는 name으로 설정된 id 속성을 갖는 이름을 위한 텍스트 입력 박스가 있다.
JQuery 라이브러리의 자동완성 함수를 텍스트 박스와 연관시킨다. 이렇게 되면 자동완성 기능은
해당 DQM 노드와 연관된다. 이 함수에 전달된 속성 source는 자동완성 기능을 위한 값을 얻기 위
은 그림 9.7에서 본 것처럼 이름이 주어지면 학생 혹은 교수의 ID, 이름, 그리고 학과명을 반환한
<html> <head>
<script src=z/https://code.jquery.com/jquery-3.3.1.jsz/> </script>
<script src=zzhttps://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.jszz></script
<script src=zzhttps://code.jquery.com/ui/1.12.1/jquery-ui.min.js zzx/script>
<script src=zzhttps://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.jszz></script
시ink rel="와ylesheet"
href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.csszz />
<link rel=zzstylesheet"
href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.cssz7>
<script>
var myTabl은;
$(document).ready(function() {
$(zz#nam은〃).a니tocompl은td{ source: "/autocompl은t은_nam은〃 });
myTabl 은 = $(zz#personTablezz).DataTable({
columns: [{data:〃id〃レ{data:〃name〃レ{data:〃depヒname〃}]
));
));
function loadTableAsyncO {
var params = {persontype:$(zz#persontypezz).val()/ name:$(zz#namezz).val()};
var url = 〃/p은rson.query_ajax?〃 + jQuery.param(params);
myTable.ajax.url(url).load();
)
</script>
</head> <body>
Search for:
<select id二〃persontype〃>
<option value二〃st니d은nt〃 select은d>St니d은nt </option>
<option value二"instructor"〉Instructor </option>
</select> <br>
Name:〈input typ으=text size二20 id二〃name〃>
<button onclick그”loadTableAsync()〃> Show details </button>
<table id二〃personTable" border二'z1">
<thead>
<tr> <th>ID</th> <th>Name</th> <th>Dept. Name</th> </tr>
</th 은 ad>
v/ta 이 e>
</body> </html>
Showing 1 to 3 of 3 entries
Previous
□ Next
9.5.2 웹 서비스
프로그램의 요소다. HTTP 규약을 통한 함수의 호출을 통해서 요청이 전달되고, 응용 프로그램 서
버에서 실행된 후에 그 결과를 함수를 호출한 프로그램에 전달한다.
Transfer)라고 불리는 간단한 접근 방법은, 표준 HTTP 요청을 통해서 웹 서비스 함수가 호출된다.
응용 프로그램 서버의 URL에 표준 HTTP 요청의 매개변수로서 인자를 전달한다. 응용 프로그램
서버는 서버의 데이터베이스를 갱신하는 작업을 포함할 수 있는 요청을 실행하고, 결과를 생성해서
HTTP 요청의 결과로 전달한다. 오늘날 결과를 인코딩하기 위해서 8.1.3절에서 살펴본 XML'] 아
직도 사용되기는 하지만 가장 많이 사용되는 인코딩 방법은 JSON 표현이다.
의 일부분은 REST 기반의 인터페이스를 사용한 JavaScript 코드에 의해서 불리고 화면에 출력된다.
일부 웹 서비스는 공개적으로 문서화되지 않고 특정 응용을 위해 내부적으로 사용되기도 하지
구하기도 한다.
오늘날 다양한 REST 웹 서비스가 가능한데 대부분의 프런트엔드 응용은 백엔드 동작을 수행하기
위해서 하나 이상의 서비스를 사용한다. 예를 들어, 웹 기반 이메일 시스템, 웹 기반 소셜 미디어 웹
웹 서비스는 다른 백엔드 시스템이 제공하는 기능을 사용하기 위해서 백엔드 쪽에서 사용이 증
API를 제공한다. 이러한 서비스는 Amazon S3, Goo읺e Cloud Storage, Microsoft Azure 등과 같
은 많은 제공업자가 제공한다. 대규모 데이터를 제공하고 다양한 연산을 지원할 뿐만 아니라 중앙
XML 인코딩을 사용해서 매개변수와 결과를 처리한다. 이러한 방법은 특별한 언어를 사용해서 웹
API를 정의하고 HTTP 규약상에서 특별한 규약 계층을 가진다.
9.5.3 연결되지않은작업
많은 응용 프로그램은 클라이언트가 응용 프로그램에 연결되어 있지 않은 경우에도 일부 작업을
도 지원서를 입력할 수 있도록 하고, 다시 네트워크에 연결되면 정보를 서버에 저장하는 방식이다.
면 그때 메일이 보내지면 된다. 이러한 응용 프로그램을 만들기 위해서는 클라이 언트에 로컬(local)
저장 공간이 필요하다.
localStorage.setltemCkey, value)
localStorage.getltem(key)
localStorage.deleteltem(key)
은 전형적으로 5메가바이트다.
위의 인터페이스는 키/값 쌍에 대한 저장/검색을 허용한다. 키가 제공되어야 검색할 수 있다. 그
있다. HTML5는 IndexedDB를 지원하는데 이것은 다수의 속성에 대해서 인덱스를 가지고 있는
JSON 객체의 저장을 허용한다. IndexedDB는 스키마 버전을 지원하고 개발자가 하나의 스키마 버
전에서 다음 버전으로 이전(migration)할 수 있는 코드를 작성할 수 있도록 한다.
9.5.4 모바일응용플랫폼
모바일 응용(혹은 모바일 앱)은 오늘날 광범위하게 사용된다. 오늘날 가장 많이 사용되는 모바일
메뉴, 리스트, 버튼, 체크박스, 진행막대(progress bar) 등 다양한 표준 GUI 특징과 텍스트, 이미ス],
비디오를 보여 줄 수 있는 기능을 제공한다.
하지 않다.
기능은 매우 중요하다. Facebook에서 개발한 JavaScript 기반의 React Native 프레임워크나 Google
에서 개발한 Dart 언어 기반의 Flutter 프레임워크는 플랫폼에 상관없이 개발할 수 있도록 설계된
앱(Progressive Web Apps, PWA)이라 불리는 새로운 세대의 웹 앱의 사용이 점차 증가하고 있다.
다. 임의의 JavaScript 코드 컴파일은 실제로 가능하지 않기 때문에 컴파일은 제한된 문법을 따르는
9.6 응용 프로그램 구조
받아서 model에서 작업을 수행하고 결과를 사용자에게 출력하는 역할을 한다. MVC 구조는 수
많은 웹 응용 프로그램에서 사용된다.
청을 받으면 controller는 model에 요청을 전달한다. model은 비즈니스 로직을 이용해서 요청을
9.6.1 비즈니스 로직 계층
가능하도록 해야 한다.
비즈니스 로직은 다양한 요소가 포함된 특정 작업을 어떻게 할 것인가를 표현하는 워크플로
못된 상황에 대처해야 한다. 예를 들어, 입학 허가나 거부의 마감 시간이 지나간 경우, 관리자는 결
Chapter 9 응용 프로그램의 개발 393
용하는 것이다. 이러면 데이터 접근 계층은 사용자가 모르는 사이에 데이터베이스와 통신을 하게
된다. 그러나 비즈니스 로직 계층이 객체 지향 프로그래밍 언어로 작성된 경우, 데이터를 객체로서
성하고, 갱신된 객체를 저장하기 위한 코드를 작성해야 했다. 하지만 그러한 데이터 모델 간의 수동
전환은 복잡하고 오류가 생기기 쉽다. 이러한 문제를 해결하는 방법 중 하나는 객체와 객체 사이의
면, Student라는 Java 클래스는 student 릴레이션과 연결되어 있고, Java 변수 ID는 릴레이션의
student.^ 속성과 연결되어 있다는 것을 연결 파일에 저장한다. 데이터베이스를 누가 사용 중인지
정보는 properties 파일에 저장되어 있다. 프로그램이 데이터베이스를 이용하기 위해서는 session
을 열어야 한다. 일단 세션이 준비되기만 하면, Java에서 생성된 Student 객체인 stud는 session.
section을 sNdems의 집합과 연관시키는 방식으로 모델링될 수 있다. 일단 적절한 매핑이 명세되면
좀 더 정확히 하기 위해서 클래스의 변수는 private로 선언되어야 하고, 속성에 접근하기 위해서는
Hibernate는 데이터베이스에 student 튜플을 생성하는 데 필요한 SQL insert 문을 자동으로 생성한다.
아래의 코드에서 보듯 주 키 혹은 질의를 통해 객체를 검색할 수 있다.
검색된 객체는 메모리에서 갱신될 수 있다. Hibernate 세션에 대한 트랜잭션이 거밋할 때, Hibernate
는 데이터베이스에 있는 릴레이션에 대해 대응하는 갱신을 수행함으로써 갱신된 객체를 자동으로
Chapter 9 응용 프로그램의 개발 395
class student(models.Model):
id = models.CharField(primary_key=Truez ma)시은ngth二5)
name = models.CharField(max_length=20)
depヒnam 은 = models.CharField(max_length=20)
tot_cred = models.DecimalField(max_digits=3/ decimal_places=O)
이 ass instructor(models.Model):
id = models.CharField(primary_key=Truez max」은ngth=5)
name = models.CharField(max_length=20)
dept.name = models.CharField(max_length=20)
salary = mod은ls.DecimalField(max .digits=8Z decimaLplac은s=2)
advisees = models.ManyToManyField(student z related_nameゴadvisors")
그림 9.15 Django에서모델정의
저장할수 있다.
위 코드는 질의에서 객체가 직접적으로 사용될 수 있도록 확장한 SQL에 기반한 Hibernate의
HQL 질의어를 보여 준다. HQL 질의는 Hibernate에 의해 SQL로 자동 변환되어 실행된다. 그리고
결과는 Student 객체의 리스트로 변환된다. for 루프는 리스트에 있는 객체에 대해서 반복된다.
이러한 특징은 프로그래머에게 관계형 저장 시스템에 대한 자세한 사항을 알려 줄 필요 없이 고
def person.query_model(request):
persontype = req 니 est.GET.get('persontype')
personname = request.GET.getCpersonnam 은')
html =""
if persontype == '와udent':
students = Student.objects.filter(name=personname)
for st니d은nt in student오
advisors = students.advisors.allO
html = html + "Advisee: " + st니dent.name + "<br>Advisors:
+ get_names(advisors) + "<br> \n"
else:
instructors = lnstructor.objects.filter(name=personname)
for instr니ctor in in와njctors:
advisees = instructor.advisees.allO
html = html+"Advisor: " + instructor.name + “사가:Advisees:
+ g은t_names(advisees) + "<br> \n"
return HttpResponse(html)
객체의 리스트를 반환한다. 여기서 이름은 get_names( ) 함수에 의해서 검색되고 반환된다. 교수
의 경우도 유사한데 교수의 이름을 이용하여 지도 관계에 있는 학생의 이름을 검색할 수 있다.
9.7 응용 프로그램성능
트들은 이보다 더욱 빈번하게 접속이 일어날 수 있다. 따라서 웹 사이트를 개발하는 사람들에게는
인 처리를 함으로써 개별적인 요청을 처리하는 속도를 빠르게 하길 원한다. 이번 절에서 이러한 기
Chapter 9 응용 프로그램의 개발 397
이다.
고 생각해 보자. 새로운 JDBC 연결을 만드는 것은 수 밀리초가 걸리기 때문에, 각각의 사용자 요
청에 대해 계속 새로운 연결을 만드는 것은 트랜잭션 수행 속도가 매우 빨라야 하는 경우 좋은 방
법이 아니다.
9.7.2 병렬 처리
수 있다. 서버는 클라이언트 세션의 상태를 유지하기 때문에 특정 클라이언트 세션으로부터 발생한
수 있다.
Chapter 9 응용 프로그램의 개발 399
9.8 응용 프로그램보안
에서 수행해야 하는 인증과 허가 과정을 뛰어넘어서 작업을 수행할 수 있는, 보안이 취약한 부분에
대해서 다루고, 이러한 취약점을 어떻게 방지할 것인지 설명한다. 뒷부분에서 안전한 인증과 세부
있는 검사 도구에 관해서 설명할 것이다. 데이터 보호와 관련된 사항을 마지막으로 이 절을 마무리
할 것이다.
9.8.1 SQL 삽입
SQL 삽입(SQL injection) 공격이란 공격자가 자신이 생성한 SQL 질의를 응용 프로그램이 수행하
달되는 경우 SQL 삽입의 취약성에 대해서 알아보았다. SQL 삽입의 취약성의 또 다른 예제로서 그
림 9.3에 나타난 소스 코드를 생각해 보자. 이에 대응되는 그림 9.7의 서블릿 코드에서 다음과 같은
실행한다. 이 경우 웹 서식을 사용하는 악의적인 공격자는 <SQL 문>이 공격자가 원하는 질의문이
라고 할 때 유효한 학생 이름 대신 “' ;<SQL 문>; - -”과 같은 문자열을 입력할 수 있다. 그러면 서
블릿은 다음과 같은 문자열을 생성해 데이터베이스에 넘길 것이다.
select * from student where name like <some SQL 와 atement>; 一 一%'
공격자가 추가한 작은따옴표는 문자열을 닫고, 그다음에 나오는 세미콜론은 질의를 끝낸다. 그리
5.1.1 .5절에서 언급한 바와 같이, 이러한 공격을 막기 위해서는 SQL 질의를 수행할 때 준비된
질의문(prepared statement)을 사용하는 것이 최선이다. 준비된 질의문의 매개변수를 설정할 때
끝내지 못하도록 한다. 또는 준비된 질의문을 쓰는 대신 입력받은 문자열을 SQL 질의에 포함하기
전에 탈출 문자를 추가하는 함수를 적용해도 같은 효과를 낼 수 있다.
SQL 삽입의 또 다른 위험은, 서식에서 선언된 조건의 선택과 속성을 정렬하는 것을 기반으로
한 질의를 동적으로 생성하는 응용 프로그램으로부터 발생한다. 예를 들면, 응용 프로그램은 질의
의 결과를 정렬하기 위해서 어떤 속성을 사용해야 하는지 사용자가 명시하도록 할 수 있다. 명시된
HTML 형식을 사용해서 메뉴를 제공함으로써 제한된 입력만 사용자로부터 받으려고 해도, 악
의적인 사용자는 orderAttribute 변수에 임의의 문자열을 보낼 수 있다. 이러한 SQL 삽입을 피하
있다.
<img src=
"https://mybank.com/transfermoney?amount=1000&toaccount=14523">
가장 간단한 방법은 문자열에 HTML 태그의 입력을 금지하는 것이다. 이러한 태그를 걸러 낼
사람에게 태그가 보이는 것을 막을 수 있다. HTML 형식의 입력이 유용한 경우가 있을 수 있다.
그러한 경우에는 제한적인 HTML 구조만 허가하고 위험 요소를 가지고 있는 구조는 사용하지
못하도록 하는 것이다. 이러한 경우에는 조심해서 설계해야 한다. 전혀 나쁘지 않은 그림 파일이
는 것이다.
。 갱신을 할 때에는 GET 함수를 사용하지 않아야 한다. 이것은 앞서 보았던 <img src ..>를
9.8.3 비밀번호누출
응용 프로그램 개발자가 다루어야 할 또 다른 문제는 응용 프로그램 소스 코드의 암호 보안 문제
에 접근할 수 있고, 응용 프로그램이 사용하는 데이터베이스 계정의 암호를 알아낼 수 있다. 이러한
문자열로 저장할 필요가 없게 만들어 준다. 하지만 복호화 키 역시 노출되기 쉽기 때문에 이러한
용자가 응용 프로그램 서버에 접근하는 것 자체를 막으면, 악의적인 사용자가 비밀번호를 안다고
해도 서버 에 피해를 줄 수 없다.
9.8.4 응용 프로그램 인증
의 숫자를 생성한다. 응용 프로그램 서버는 사용자에게 주어진 장치와 같은 임의의 숫자를 생성할
수 있어서 인증을 위해서 두 숫자가 일치하는지를 확인한다. 이러한 방법은 장치에 시계가 들어 있
지를 보내는 것이다. 임의로 생성된 OTP를 미리 등록된 사용자의 핸드폰 번호로 보낸다. 사용자는
문자 메시지를 받고자 하는 핸드폰을 가지고 있어야 한다. 그리고 문자 메시지에 있는 암호와 자신
구현하는 데 많이 사용된다. 기관은 사용자 이름과 비밀번호 정보를 포함하고 있는 LDAP 서버를
로그램에 추가적으로 등록할 필요가 없다. 하지만 사용자를 인증할 때에는 응용 프로그램이 대학
9.8.5 응용 프로그램수준의권한
4.7절에 서 언급한 바와 같이 역할을 기반으로 하는 권한(authorization)을 SQL 표준이 유연하게 지
원하지만, SQL 권한 모델은 전형적인 응용 프로그램에서 사용자 권한을 관리하는 것과 같은 매우
404 PART 3 응용 프로그램의 설계 및 개발
제한된 역할만 제공한다. 예를 들어, 모든 학생이 자신의 성적은 볼 수 있지만 다른 학생의 성적은
를 출력한다고 가정한다,
2 . 세부적인 권한의 부재. 학생이 자신의 성적만 볼 수 있게 하려면 개별적인 튜플 수준의 권한이
이어져야 한다. 전체 릴레이션이나 뷰에 대한 권한 부여나 릴레이션이나 뷰의 특정 속성에 대해
되어야 한다. 반면에 교수에 의해서 실행된 질의는 다른 뷰를 사용해야 할 것이다. 결과적으로
있다.
ID = sys-context. userJd()
볼 수 있게 된다.
4.7.7 절에서 논의했지만, 위에 언급된 것처럼 조건을 추가하는 방법은 질의의 의미를 바꿀 가능
성이 있다는 단점이 있다. 예를 들어, 사용자가 대학교의 모든 수업의 평균 학점을 보기 위한 질의
게 생성된 질의에 대해서 시스템이 알맞은 결과를 출력한 것은 맞지만, 사용자가 원래 의도했던 질
9.8.6 감사추적
감사 추적(audit trail)은 데이터베이스에 대한 모든 변경(삽입/삭제/갱신)에 대한 로그로서, 어떤 사
용자가 변경을 수행했고, 언제 변경이 수행되었는지에 대한 정보를 포함한다. 응용 프로그램의 보
406 PART 3 응용 프로그램의 설계 및 개발
안이 뚫리거나, 보안이 뚫리지는 않았지만 오류를 일으키는 갱신이 발생한 경우, 감사 추적을 이용
틈이 생기거나 오류를 포함한 갱신이 일어난 경우 이러한 피해를 수정하는 데 도움을 줄 수 있다.
용자가 수행한 갱신을 따라가면서 어느 곳에서 잘못된 갱신이 일어났는지 찾아서 수정할 수 있다.
릴레이션 갱신에 대해 적절한 트리거를 정의해 두고, 사용자 이름이나 시간을 식별하는 시스템
다. 더 견고한 해결책은 26장에서 설명할 블록체인 기술을 이용하는 것이다. 블록체인 기술은 여러
기계에 로그를 저장하고 침입자가 추적당하지 않고 데이터를 수정하고 삭제하는 것을 매우 어렵게
9.8.7 사생활보호
다. 많은 국가가 언제, 누구에게 자료가 공개되어야 하는가를 법으로 규정하고 있다. 사생활 침해는
상점에서 물건 구매와 같은 트랜잭션을 수행하는 데 이러한 정보가 필요할 것이다. 하지만 고객은
9.9 암호화와응용
암호화는 복호화 과정을 거치지 않으면 알아볼 수 없는 형태로 데이터를 전송하는 과정을 의미한
할 수 없도록 한다.
있다. 신용카드 회사와 같은 기관에서 상품의 결제나 서비스를 요청하는 사람의 신분을 증명하기
위해서 개인적인 정보를 사용한다. 이러한 개인 정보가 누출되는 경우, 범죄자가 신분을 숨기고 물
야한다.
많은 국가에서 중요한 정보가 노출될 가능성을 줄이기 위해, 중요한 정보를 저장하는 모든 데이
터베이스는 데이터를 암호화해서 저장하도록 법으로 정하고 있다. 데이터를 보호하지 않은 기업은
데이터가 누출되었을 때 법적인 책임을 지도록 되어 있다. 이처럼 암호화는 중요한 데이터를 저장
9.9.1 암호화 기술
용자가 코드를 쉽게 해독할 수 있기 때문에 적절하지 않다. 간단한 암호화의 예로, 각 문자를 알파
Perryridge
는 다음과 같이 된다.
Qfsszsjehf
밀 키를 알아내는 것은 매우 어렵다.
key)를 이용해서 XOR 연산을 수행한다. 각 데이터 블록을 암호화하기 위해서 매번 새로운 라운
Chapter 9 응용 프로그램의 개발 409
되고 암호화 과정을 거꾸로 거침으로써 원본 데이터를 복원하게 된다. 이전에는 1977년에 적용된
이 없는 사용자가 자료를 훔치기 위해서는 戶尸ユ를 인수분해해야 한다. ?과 尸2를 충분히 큰 값(10。
자리 이상)으로 선택하면, 인수분해하는 데 걸리는 시간을 현실적으로 불가능할 정도로 높게(가장
란다.
분포에 대한 통계적 정보가 사용될 수 있다. 예를 들어, 데이터베이스에 저장된 평균 나이가 18세
410 PART 3 응용 프로그램의 설계 및 개발
자료에 접근할 수 있지만 복호화 키에는 접근할 수 없는 사용자로부터 자료를 보호할 수 있다. 파
대상이 된다.
이스 시스템이 사용 가능한 키를 이용해 자료를 포함한 디스크 블록을 암호화할 수 있다. 디스크로
상위 단계에서 릴레이션의 특정 속성을 암호화된 형태로 저장할 수 있다. 이러한 경우, 릴레이션
정할 필요가 없다는 장점이 있다. 예를 들어, 휴대용 컴퓨터의 데이터베이스에 있는 자료를 악의적
9.9.3 암호화와인증
비밀번호 기반의 인증은 데이터베이스뿐만 아니라 운영체제에 이르기까지 널리 人용된다. 그렇지
암호화하거 나 복호화한다.9
9.9.3.1 전자 서명
있다.
9.932 전자인증서
일반적으로 인증은 두 개체가 상대방에게 자신을 증명하는 양방향 과정이다. 이러한 상호 인증은
검증될 수 있다.
재하는 다단계 시스템이 사용된다. 루트를 제외한 각 기관은 부모의 전자 인증서를 갖는다.
HTTP 규약의 안전한 버전인 HTTPS 규약에서 사이트가 웹 브라우저에 자신의 전자 인증서를 제
공하면 웹 브라우저는 사이트를 사용자에게 보여 준다. 사용자가 인증서를 수락하면 브라우저는
9.10 요약
• 응용 프로그램 개발자는 보안에 주의를 기울여야 한다. 특히 악의적 인 사용자의 SQL 삽입 공격,
XSS 공격 등을 막아야 한다.
• SQL 권한 부여 방식은 권한의 부여 단위가 크고 많은 사용자를 처리해야 하는 응용 프로그램에
적용하기에는 한계가 있다. 오늘날 응용 프로그램은 데이터베이스 시스템의 외부에서 세부적인
용어정리
응용프로그램 • Django
데이터베이스의 웹 인터페이스 • 웹서비스
HTML • REST를이용한서비스
Hyperlinks • 웹응용프레임워크
Uniform resource locator(URL) • 연결풀
서식 • 질의 결과 캐싱
HyperText Transfer Protocol (HTTP) • 응용 프로그램보안
비지속적 연결 규약 • SQL 삽입
쿠키 • Cross-site scripting(XSS)
세션 • Cross-site request forgery(XSRF)
서블릿과 서블릿 세션 • 인증
서버 측 스크립팅 • 2단계 인증
Java Server Pages(JSP) • 중간자공격
PHP • 중앙인증
클라이 언트 측 스크립 팅 • 통합인증
JavaScript • Open ID
Document Object Model(DOM) • 권한
Ajax • Virtual Private Database(VPD)
반응형 웹 앱 • 감사추적
응용 프로그램 구조 • 암호화
표현 계층 • 대칭 키 암호화
model-view-controller(MVC) 구조 • 공개 키 암호화
비즈니스 로직 계층 • 사전공격
데이터 접근 계층 • 시도-응답
객체-관계 매핑 • 전자서명
Hibernate • 전자인증서
Chapter 9 응용 프로그램의 개발 415
실전문제
9.2 지속적 연결을 유지하는 규약과 비교해 비 지속적 연결 규약의 장점과 단점을 서술하라.
9.7 Linux와 Windows에서 실행 가능한 netstat 명령어는 컴퓨터의 활성화된 네트워크 접속을 보여
준다. 이 명령어를 사용해서 어떤 웹 페이지가 연결을 시작한 이후에 연결을 닫지 않는지, 연결
풀이 사용되고 있는지, 연결 풀로 연결을 반납하지 않는지를 어떻게 알아낼 수 있을지 설명하라.
연결 풀을 사용하는 경우에는 연결이 즉시 닫히지 않는다는 사실을 염두에 두어야 한다.
9.10 문제 9.9는 속성의 암호화에 대한 문제를 언급하고 있다. 하지만 일부 데이터베이스 시스템은 전
체 데이터베이스의 암호화를 지원한다. 전체 데이터베이스를 암호화했을 때, 문제 9.9에서 발생
한 문제를 어떻게 피할 수 있는지 설명하라.
9.11 누군가 한 회사를 사칭하여 인증서 부여 기관으로부터 인증서를 얻었다고 가정하자. 이 경우, 사
칭당한 회사에 의해 인증된 재화(구매 주문서, 프로그램 등)와, 타 회사에 의해 인증된 재화에는
416 PART 3 응용 프로그램의 설계 및 개발
어떤 영향을 미치는가?
연습문제
9.15 데이터베이스에 저장된 사용자 이름과 암호를 기반으로 사용자를 인증하고 인증 후 “serid라는
세션 변수를 설정하는 서블릿을 작성하라.
9.16 SQL 삽입 공격이란 무엇인가? 이 공격의 원리와 이 공격을 방어하기 위해 취해야 할 조치를 설
명하라.
9.19 오늘날 많은 웹 사이트는 Ajax를 이용한 세련된 사용자 인터페이스를 제공한다. 소스 코드를 보
지 않고 Ajax를 사용했는지 알 수 있는 요소를 두 가지 언급하라. 이러한 요소를 이용해서 Ajax
9.20 XSS 공격
a. XSS 공격이란무엇인가?
b. XSS 공격을 탐지하기 위해서 리퍼러 필드가 어떻게 사용될 수 있는가?
9.21 다단계(multifactor) 인증이란 무엇인가? 이러한 방법이 비밀번호 도난을 어떻게 보호할 수 있
는가?
9.22 9.8.5절에서 언급한 Oracle의 Virtual Private DatabaseePD)와 대학교 데이터를 기반으로 한 응
용 프로그램을 살펴보자.
9.25 해커는 그들의 웹 사이트를 우리가 신뢰하는 사이트(은행이나 신용카드 사이트 등)로 착각하게
만들 수 있다. 그들은 위장된 전자우편을 보내거나, 네트워크 시설에 침투하여 예컨대 mybank.
com 등의 사이트로 향하는 네트워크 트래픽의 경로를 해킹된 사이트로 재조정(re-route)한다. 해
킹된 사이트에서 이름과 암호를 입력하면 그것은 사이트에 저장되고, 이후에 해커는 그것을 이용
해 우리의 계정에 침투할 것이다. https://mybank.com과 같이 HTTPS 규약을 사용하는 URL
을 이용하면 이러한 공격을 방어할 수 있다. 이 규약이 전자 인증서를 이용하여 사이트를 인증하
는 방법을 설명하라.
프로젝트 제안
프로젝트 9.1 Bebo, Blogger, Facebook, Flickr, Last.FM, Twitter, Wikipedia 등과 같이 사용자와 상호
작용을 하는 웹 사이트 중에서 마음에 드는 웹 사이트를 하나 선택하라. 대부분 사이트는 대용량
데이터를 다루고 데이터를 저장하고 질의하기 위해서 데이터베이스를 사용할 것이다. 선택한 웹
사이트에서 제공하는 기능 중에서 몇 가지를 구현하라. 이러한 사이트에서 몇 가지 요소는 이 과
목의 프로젝트 수준을 넘어서는 것일 수 있다. 하지만 이 과목의 프로젝트로 하기에 충분하고 구
현이 가능한 재미 있는 요소를 찾는 것은 가능하다.
프로젝트 9.2 상호작용이 가능한 웹 사이트를 Google이나 Yahoo 지도에서 제공하는 API를 사용해서
메시업(mashup)으로 만들어 보라. 예를 들면, 지도 API는 웹 페이지에 여러 정보와 함께 지도를
출력할 수 있는 수단을 제공한다. 레스토랑의 장소, 요리, 가격대 평점과 같은 정보를 사용자에게
제공하는 레스토랑 추천 시스템을 만들 수 있다. 사용자의 검색 결과를 지도 위에 보여 줄 수 있
을 것이다. 사용자가 정보를 추가하거나 수정할 수 있고, 악의적인 갱신을 제거하는 중재자를 추
프로젝트 9.4 6장의 문제 6.3의 E-R 스키마는 리그에 속한 팀에 관한 정보를 표현하고 있다. 자료를 입
력하고 갱신하고 볼 수 있는 웹 기반 시스템을 설계 및 구현하라.
프로젝트 9.9 온라인 객관식 시험 관리 시스템을 설계 및 구현하라. 강사와 조교가 문제를 출제할 수
있어야 하고, 관계자가 문제를 변경할 수 있어야 하며, 문제은행식으로 문제를 뽑을 수 있어야 한
다. 온라인으로 시험을 관리할 수도 있어야 하는데, 시험은 모든 학생이 정해진 시각에 보거나,
각자 원하는 시각에 보되 정해진 제한 시간 동안 보도록 한다. 학기 말에 학생들은 자신의 학점에
대해 의견을 개진할 수 있다.
Chapter 9 응용 프로그램의 개발 419
(편지의 in-reply-to 필드를 이용해 추적)에서, 고객의 편지에 대해 예전에 답장을 보낸 요원이 다
시 답장을 보내기 편해야 한다. 요원이 고객의 편지에 회신하기 전에 그의 질문 내력을 확인할 수
있도록 시스템은 받은 편지와 그에 대한 답장을 추적할 수 있어야 한다.
프로젝트 9.11 계층적 카테고리로 구분된 품목이 있고, 이것을 판매 및 구매할 수 있는 전자 상점을 설
계하고 구현하라. 다음과 같이 공지 서비스를 제공할 수도 있다. 사용자가 특정 카테고리에 속한
항목에 관심을 표명하거나 어떤 제약 조건을 지정하면, 그가 공개적으로 자신의 관심을 광고하지
않더 라도 관심 품목이 시장에 나올 때 공지를 받는다.
프로젝트 9.14 조직에서 종종 구성원들로부터 구조화된 정보를 수집한다. 예를 들어, 관리자는 사원들
의 휴가 계획을 수집하고, 교수는 특정 주제에 대해 학생들의 견해를 수집하며, 어떤 행사를 계획
하는 학생들은 다른 학생들로부터 참가 신청을 받는다. 또한 어떤 주제에 대해 온라인 투표가 행
해지기도 한다.
사용자가 정보 수집 행사를 쉽게 생성할 수 있도록 해 주는 시스템을 작성하라. 행사 주최スド는
누가 참가 자격이 있는지 정의해야 한다. 이를 위해 시스템은 사용자 정보를 유지하고, 일부 사용
자를 정의하는 술어를 허용해야 한다. 행사 주최자는 사용자가 제공해야 하는 입력(자료형, 기본
값, 유효성 검사 포함)을 지정할 수 있어야 한다. 행사는 마감 시간을 가지며, 정보를 제출하지 않
은 사용자에게 독촉장이 발송된다. 행사 주최자는 자동으로 마감 시간을 특정 날짜/시간에 맞출
수도 있고, 시스템에 로그인해 마감 시간이 지났음을 선언할 수도 있다. 참가자들에 대한 통계 정
보 생성이 가능해야 한다. 이를 위해 행사 주최자는 참가자들로부터 입력받은 정보에 대해 간단
한 요약 정보를 생성할 수 있어야 한다. 행사 주최자는 요약 정보 중 일부를 행사 중(예: 응답자
수), 또는 행사 종료 후(예: 평가 점수 평균) 사용자에게 공개할 수 있다.
프로젝트 9.15 jQuery를 사용해서 웹 인터페이스 생성을 단순화하는 함수의 라이브러리를 작성하라.
최소한 다음 함수는 구현해야 한다. JDBC ResultSet을 표 형식으로 출력하는 함수, 여러 형식의
420 PART 3 응용 프로그램의 설계 및 개발
관련도구
더 읽어보기
암호화 해시 함수 및 공개 키 암호화의 개념은 [Diffie and Hellman (1976)]과 [Rivest et al. (1978)]
에서 소개되었다. 암호화에 대한 좋은 참고문헌은 [Katz and Lindell (2014)]이고, [Stallings (2017)]은
암호화와 네트워크 보안을 다루는 교재다.
참고문헌
[Diffie and H이Iman (1976)] W. Diffie and M. E. Hellman, “New Directions in Cryptography ”,
IEEE Transactions on Information Theory, Volume 22, Number 6 (1976), pages 644-654.
[Katz and Lindell (2014)] J. Katz and Y. Lindell, Introduction to Modern Cryptography, 3rd
edition, Chapman and Hall/CRC (2014).
[Rivest et al. (1978)]R. L. Rivest, A. Shamir, and L. Adleman, “A Method for Obtaining Digital
Signatures and Public-Key Cryptosystems,, Communications of the ACM, Volume 21, Number 2
(1978), pages 120-126.
[Stallings (2017)] W. Stallings, Cryptography and Network Security - Principles and Practice, 7th
edition, Pearson (2017).
크레딧