2024년 5급 공채 기술 2차 데이터베이스론
문제 5개 · 100점. 참고 답안·채점 기준은 앱에서 볼 수 있습니다.
제1문 (20점)
온라인 도서 판매를 위해 도서(Book), 고객(Customer), 주문(Orders) 테이블로 구성된 데이터베이스를 구축하고자 한다. 다음 데이터베이스 요구사항과 스키마 정의를 보고 물음에 답하시오. (총 20점)
○도서 릴레이션 Book(bookid, booktitle, publisher, price)
Book은 도서에 관한 데이터를 저장하며, bookid(도서번호), booktitle(도서이름), publisher(출판사), price(정가)와 같은 애트리뷰트로 구성된다. bookid는 기본키(primary key)이며 각 도서를 식별하기 위해 임의로 만든 일련번호 값을 사용한다. 모든 도서의 정가는 10,000원 이상이어야 한다.
○고객 릴레이션 Customer(custid, name, address, phone)
Customer는 고객에 관한 데이터를 저장하며, custid(고객번호), name(고객이름), address(주소), phone(전화번호)와 같은 애트리뷰트로 구성된다. custid는 기본키이며 각 고객을 식별하기 위해 임의로 만든 일련번호 값을 사용한다.
○주문 릴레이션 Orders(orderid, custid, bookid, saleprice, orderdate)
Orders는 고객의 주문 사항을 저장하며, orderid(주문번호), custid(고객번호), bookid(도서번호), saleprice(판매가격), orderdate(주문날짜)와 같은 애트리뷰트로 구성된다. orderid는 기본키이며 custid와 bookid는 외래키(foreign key)이다. saleprice는 도서 판매가격으로 정가보다 할인된 가격으로 팔았다고 가정한다.
Book은 도서에 관한 데이터를 저장하며, bookid(도서번호), booktitle(도서이름), publisher(출판사), price(정가)와 같은 애트리뷰트로 구성된다. bookid는 기본키(primary key)이며 각 도서를 식별하기 위해 임의로 만든 일련번호 값을 사용한다. 모든 도서의 정가는 10,000원 이상이어야 한다.
○고객 릴레이션 Customer(custid, name, address, phone)
Customer는 고객에 관한 데이터를 저장하며, custid(고객번호), name(고객이름), address(주소), phone(전화번호)와 같은 애트리뷰트로 구성된다. custid는 기본키이며 각 고객을 식별하기 위해 임의로 만든 일련번호 값을 사용한다.
○주문 릴레이션 Orders(orderid, custid, bookid, saleprice, orderdate)
Orders는 고객의 주문 사항을 저장하며, orderid(주문번호), custid(고객번호), bookid(도서번호), saleprice(판매가격), orderdate(주문날짜)와 같은 애트리뷰트로 구성된다. orderid는 기본키이며 custid와 bookid는 외래키(foreign key)이다. saleprice는 도서 판매가격으로 정가보다 할인된 가격으로 팔았다고 가정한다.
CREATE TABLE Book(
bookid INT PRIMARY KEY,
booktitle VARCHAR(40),
publisher VARCHAR(40),
price INT Check (price >= 10000)
);
CREATE TABLE Customer(
custid INT PRIMARY KEY,
name VARCHAR(40),
address VARCHAR(50),
phone VARCHAR(20)
);
CREATE TABLE Orders(
orderid INT PRIMARY KEY,
custid INT REFERENCES Customer(custid),
bookid INT REFERENCES Book(bookid),
saleprice INT,
orderdate DATE
);
bookid INT PRIMARY KEY,
booktitle VARCHAR(40),
publisher VARCHAR(40),
price INT Check (price >= 10000)
);
CREATE TABLE Customer(
custid INT PRIMARY KEY,
name VARCHAR(40),
address VARCHAR(50),
phone VARCHAR(20)
);
CREATE TABLE Orders(
orderid INT PRIMARY KEY,
custid INT REFERENCES Customer(custid),
bookid INT REFERENCES Book(bookid),
saleprice INT,
orderdate DATE
);
- (1) 도서이름(booktitle)에 ‘DB’를 포함하고 정가(price)가 30,000원 이상인 도서의 도서이름과 정가를 검색하는 SQL 문을 작성하시오. (5점)
- (2) 고객의 고객이름과 고객이 주문한 도서의 판매가격(saleprice)을 구하는 SQL 문을 작성하시오. (단, 도서를 구매하지 않은 고객의 정보도 포함하시오) (5점)
- (3) 주문 수량이 가장 많은 도서의 도서번호(bookid)와 주문 수량을 검색하는 SQL 문을 작성하시오. (10점)
제2문 (10점)
다음 데이터베이스 인덱스에 대한 설명을 읽고 물음에 답하시오. (총 10점)
데이터베이스에서 키와 주소로 구성되는 인덱스를 생성하고자 한다. 사용하는 데이터 파일은 5,000,000개의 레코드로 구성되어 있다. 각 레코드는 400 바이트이며, 파일을 읽고 쓰는데 사용하는 한 블록은 4,096 바이트이다.
- (1) 한 블록에 포함되는 레코드 수와 이 파일을 읽는데 필요한 총 블록 수를 구하시오. (5점)
- (2) 각 블록마다 하나의 인덱스 레코드를 만들고, 각 인덱스 레코드는 키 필드 10 바이트, 블록주소 4 바이트로 구성하였다. 생성된 인덱스의 전체 블록 수를 구하시오. (5점)
제3문 (25점)
릴레이션 R(A, B, C, D, E, F)에 다음과 같은 함수적 종속성(functional dependency)이 존재할 때 물음에 답하시오. (단, 릴레이션 R은 제1정규형을 만족한다고 가정한다) (총 25점)
A→B, C→D, AF→CE
- (1) 릴레이션 R의 후보키(candidate key)를 제시하고 도출과정을 설명하시오. (5점)
- (2) 릴레이션 R의 최대 정규형(normal form)을 판별하고 그 이유를 설명하시오. (5점)
- (3) 릴레이션 R을 다음과 같이 R1과 R2로 분해하였을 때 R2의 최대 정규형을 판별하고 그 이유를 설명하시오. (7점)R1(A, B)
R2(A, C, D, E, F) - (4) 함수적 종속성을 기준으로 릴레이션 R을 BCNF(Boyce-Codd Normal Form)로 정규화하는 과정을 설명하시오. (8점)
제4문 (20점)
릴레이션 R(A, B, C, D, E)와 S(E, F, G)에 대해 두 릴레이션을 요약하는 별도의 릴레이션 RS(A, B, E, G)를 생성하였다. R과 S에 대한 삽입(insert), 삭제(delete), 갱신(update) 연산이 발생할 경우, RS에 전파하는 트리거(trigger)를 생성하려고 한다. 다음의 조건들을 고려하여 물음에 답하시오. (총 20점)
①트리거 이벤트와 트리거는 동일한 트랜잭션 하에서 수행된다.
②트리거 이벤트에 따른 이벤트 검사, 조건 평가, 조치 실행이 이벤트 발생 즉시 실행하는 즉시 모드(immediate mode)이다.
③트리거는 SQL-99 트리거 또는 ORACLE 트리거 중에서 선택하여 작성한다.
②트리거 이벤트에 따른 이벤트 검사, 조건 평가, 조치 실행이 이벤트 발생 즉시 실행하는 즉시 모드(immediate mode)이다.
③트리거는 SQL-99 트리거 또는 ORACLE 트리거 중에서 선택하여 작성한다.
- (1) 릴레이션 R에 삽입 연산이 발생할 경우 RS에 전파하는 트리거를 작성하시오. (단, R의 E는 S의 E를 참조하는 외래키이다) (10점)
- (2) 릴레이션 R의 B 속성에 대한 갱신 연산이 발생할 경우 RS에 전파하는 트리거를 작성하시오. (10점)
제5문 (25점)
트랜잭션의 로크(lock) 관련 명령어가 다음과 같이 주어졌을 때 물음에 답하시오. (총 25점)
lock-x(Q): 트랜잭션이 자료항목 Q에 Exclusive Lock를 요청한다.
lock-s(Q): 트랜잭션이 자료항목 Q에 Shared Lock를 요청한다.
unlock(Q): 트랜잭션이 자료항목 Q에 Lock를 해제한다.
lock-s(Q): 트랜잭션이 자료항목 Q에 Shared Lock를 요청한다.
unlock(Q): 트랜잭션이 자료항목 Q에 Lock를 해제한다.
- (1) 트랜잭션 T1와 T2로 구성된 다음의 스케줄이 직렬 가능화 스케줄(serializable schedule)이 아닌 이유를 설명하시오. (5점)
T1 T2 lock-x(A)
read(A)
A := A - 100
write(A)
unlock(A)
lock-x(B)
read(B)
B := B + 100
write(B)
unlock(B)lock-x(A)
read(A)
A := A * 1.1
write(A)
unlock(A)
lock-x(B)
read(B)
B := B * 1.1
write(B)
unlock(B) - (2) 1)의 스케줄에 대해 2단계 로킹 기법을 이용하여 직렬 가능화 스케줄로 만들기 위한 방법을 서술하고 직렬 가능화 스케줄의 사례를 제시하시오. (10점)
- (3) 트랜잭션 T3와 T4로 구성된 다음의 스케줄은 어떠한 문제를 가지고 있는지 서술하고 문제가 발생하는 이유를 설명하시오. (10점)
T3 T4 lock-x(B)
read(B)
B := B - 100
write(B)
lock-x(A)
A := A + 100
write(A)
unlock(B)
unlock(A)lock-s(A)
read(A)
lock-s(B)
read(B)
unlock(A)
unlock(B)